HarmonyOS鸿蒙Next中蓝牙BLE模块如何获取MTU值

HarmonyOS鸿蒙Next中在开发BLE模块的时候,如何获取到当前设备的MTU值?

5 回复

MTU是协商出来的,是两端设备连接后协商一个两端都能接受的MTU,通过setBLEMtuSize方法来协商,用BLEMtuChange事件监听获取,如果不调用setBLEMtuSize方法就默认23。

代码如下:

setMtu() {
  // 创建client端实例
  this.gattClient = ble.createGattClientDevice(this.deviceMAC)
  // 订阅ble蓝牙连接状态监听事件
  this.gattClient.on('BLEConnectionStateChange', (state: ble.BLEConnectionChangeState) => {
    // state.state返回结果为2时,表示client端同server端成功建立了连接
    if (state.state === constant.ProfileConnectionState.STATE_CONNECTED) {
      // 调用setBLEMtuSize接口,同server端协商MTU,参数取值范围23~517
      this.gattClient.setBLEMtuSize(128)
    }
  })
  // 订阅MTU协商结果监听事件
  this.gattClient.on('BLEMtuChange', (mtu: number) => {
    // MTU协商结果监听回调,回调触发,表示协商成功
    console.info('BLEMtuChange, mtu: ' + mtu);
  });
  // 连接server端ble蓝牙
  this.gattClient.connect()
}

更多关于HarmonyOS鸿蒙Next中蓝牙BLE模块如何获取MTU值的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在鸿蒙(HarmonyOS)的BLE模块开发中,无法直接获取当前设备的MTU值。根据BLE协议规范,MTU(最大传输单元)是通过客户端与服务端协商确定的,开发过程中需通过以下流程间接处理MTU:

关键实现步骤

  1. 连接设备后协商MTU
    在建立GATT连接后,客户端需主动调用setBLEMtuSize()接口与服务端协商MTU值。此操作必须在连接成功后进行:
let device: ble.GattClientDevice = ble.createGattClientDevice("XX:XX:XX:XX:XX:XX");
device.connect();
// 连接成功后协商MTU
device.setBLEMtuSize(128) // 设置期望值(范围23~517)
  .then(() => { console.info('MTU协商成功'); })
  .catch((err: BusinessError) => { console.error(`错误码: ${err.code}`); });
  1. 获取协商结果
    协商成功后,实际生效的MTU值会通过写入或通知操作的最大数据长度体现:
  • 调用writeCharacteristicValue()时,单次写入的数据长度不得超过协商后的MTU-3(ATT头部占3字节)
  • 若尝试写入超过MTU限制的数据,系统会返回错误码2900099

注意事项

  1. 调用时机限制
  • setBLEMtuSize()必须在connect()成功之后、getServices()之前调用(参考FAQ结论)。
  • 若在连接未完成或断开状态下调用,会返回错误码29000992900007
  1. MTU取值约束
  • BLE协议要求MTU范围23~517,超出将导致协商失败。
  • 实际生效值以服务端确认为准,客户端无法直接读取,需通过数据传输验证。

错误处理 若操作中遇到错误码2900099,需检查:

// 错误场景示例
device.setBLEMtuSize(128).catch((err: BusinessError) => {
  if (err.code === 2900099) {
    console.error("MTU协商失败:连接未就绪或参数超限");
  }
});

总结:鸿蒙BLE模块未提供直接获取MTU的接口。开发者需通过规范调用setBLEMtuSize()协商MTU,并在数据传输时通过数据长度限制和错误回调间接验证生效值。

在HarmonyOS Next中,使用@ohos.bluetooth模块的BLE GATT客户端API获取MTU值。通过gatt.getMtu()方法直接返回当前连接的MTU大小。需在建立GATT连接并完成服务发现后调用,确保设备处于已连接状态。MTU值由设备协商决定,系统自动管理协商过程,开发者无需手动配置。

在HarmonyOS Next中,可以通过BluetoothGatt类的getMtu()方法获取当前BLE连接的MTU值。具体步骤如下:

  1. 在建立BLE连接后,通过BluetoothGatt实例调用requestMtu(int mtu)方法请求MTU协商;
  2. BluetoothGattCallbackonMtuChanged()回调中获取实际协商后的MTU值;
  3. 使用bluetoothGatt.getMtu()即可获取当前MTU大小。

示例代码片段:

// 请求MTU协商
bluetoothGatt.requestMtu(512);

// 在回调中获取结果
@Override
public void onMtuChanged(BluetoothGatt gatt, int mtu, int status) {
    if (status == BluetoothGatt.GATT_SUCCESS) {
        int currentMtu = gatt.getMtu();
        // 使用获取到的MTU值
    }
}

注意:MTU协商是异步过程,实际值可能小于请求值,需在回调中确认最终结果。

回到顶部