HarmonyOS鸿蒙Next中蓝牙耳机配对后,同时使用BLE连接连上后。使用gattClient.disconnect(),监听BLEConnectionStateChange 的状态是STATE_DISCONNECTED,蓝牙固件侧没有收到断开BLE的指令

HarmonyOS鸿蒙Next中蓝牙耳机配对后,同时使用BLE连接连上后。使用gattClient.disconnect(),监听BLEConnectionStateChange 的状态是STATE_DISCONNECTED,蓝牙固件侧没有收到断开BLE的指令 纯血鸿蒙5.x和纯血鸿蒙6.x系统,手机是mate系列和nova系列,均不生效

蓝牙耳机支持经典蓝牙和BLE,Mac地址是同一个

纯血鸿蒙,蓝牙耳机配对后,同时使用BLE连接连上后。使用gattClient.disconnect(),监听BLEConnectionStateChange 的状态是STATE_DISCONNECTED,蓝牙固件侧没有收到断开BLE的指令

const onStateChange = (change: ble.BLEConnectionChangeState): void => {
  if (change.state === constant.ProfileConnectionState.STATE_DISCONNECTED) {
    device.off('BLEConnectionStateChange', onStateChange);
    device.off('BLECharacteristicChange');
  }
}
try {
  device.on('BLEConnectionStateChange', onStateChange);
  device.disconnect();
} catch (e) {
  log('e',e)
}

change.state === constant.ProfileConnectionState.STATE_DISCONNECTED已经触发了,但是蓝牙固件侧无法收到BLE的断开指令


更多关于HarmonyOS鸿蒙Next中蓝牙耳机配对后,同时使用BLE连接连上后。使用gattClient.disconnect(),监听BLEConnectionStateChange 的状态是STATE_DISCONNECTED,蓝牙固件侧没有收到断开BLE的指令的实战教程也可以访问 https://www.itying.com/category-93-b0.html

4 回复

开发者您好,请提供下hilog和HCI日志,一般断开连接会发送HCI Disconnect命令: 日志获取

  1. hdc shell
  2. hilog -w clear,清理hilog日志
  3. exit
  4. hdc file recv /data/log/hilog ./hilog,输出hilog日志
  5. hdc file recv /data/log/bt/ ./btlog3,输出HCI日志
  6. 提供问题复现时间点

更多关于HarmonyOS鸿蒙Next中蓝牙耳机配对后,同时使用BLE连接连上后。使用gattClient.disconnect(),监听BLEConnectionStateChange 的状态是STATE_DISCONNECTED,蓝牙固件侧没有收到断开BLE的指令的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


是不是蓝牙耳机侧的问题,你测试的是哪个蓝牙耳机,还有一种可能就是HarmonyOS这边断开蓝牙设备链接不发送断开指令,只是手机侧这边主动断开

在HarmonyOS Next中,调用gattClient.disconnect()会触发本地STATE_DISCONNECTED状态回调,但此操作可能不会主动向蓝牙设备发送标准的BLE断开连接指令。鸿蒙的BLE断开流程可能依赖于系统底层的连接管理策略,设备端可能感知为连接超时或由中央设备(手机/平板)主动断连,而非收到明确的协议层断开指令。

根据你的描述,这是一个在HarmonyOS Next中,当设备同时维护经典蓝牙(配对连接)和BLE连接时,调用gattClient.disconnect()无法正确向远端蓝牙固件发送断开指令的典型问题。

核心原因分析:

在HarmonyOS的蓝牙架构中,当同一个物理设备(共享同一MAC地址)同时存在经典蓝牙连接(如A2DP/HFP)和BLE GATT连接时,系统可能会将它们视为一个复合连接或具有依赖关系的连接。

  1. 连接状态管理:你监听到的STATE_DISCONNECTED状态变化,是本地GATT客户端(你的应用)与HarmonyOS蓝牙框架之间连接状态的更新。这表示框架已处理了你的断开请求,并将你的客户端从内部连接管理中移除。
  2. 物理链路维持:问题在于,由于经典蓝牙连接(通常用于音频)仍然活跃,系统底层的蓝牙协议栈可能没有实际断开与远端设备的物理射频链路或逻辑链路控制(L2CAP)通道。BLE GATT连接可能复用或依赖于这条已建立的底层链路。因此,disconnect()调用可能仅被解释为“释放本地GATT客户端资源”,而未被转换为一个发送给远端设备的、明确的LE Connection Termination指令。

排查与解决方向:

这不是代码写法问题,而是系统层行为。你需要采取更彻底的中断连接方式:

  • 尝试关闭整个设备连接:不要仅调用gattClient.disconnect(),而是尝试使用bluetoothManager的相关接口,断开与目标设备的整个蓝牙连接。这会强制系统清除包括经典和BLE在内的所有连接,从而更有可能触发底层协议栈向对端发送完整的断开指令。
    • 查找并使用诸如 deviceManager.disconnect()bluetooth.BLE.stopAdvertising() 等更上层的设备管理接口(具体接口名称请查阅最新API文档)。
  • 检查系统权限与后台策略:确保你的应用拥有必要的蓝牙权限(如ohos.permission.USE_BLUETOOTH),并且应用在前台运行。部分后台策略可能会限制连接控制行为。
  • 验证固件兼容性:虽然你提到多个手机型号均出现此问题,但仍需考虑特定蓝牙耳机固件与HarmonyOS Next在连接管理交互上可能存在歧义。可以尝试使用其他品牌或型号的BLE设备进行交叉测试,以进一步定位问题是普遍性的还是与特定耳机相关。

总结:

当前现象表明,在复合连接场景下,gattClient.disconnect()的语义可能被系统优化或简化,未能传递到底层射频链路。你需要寻求一种能强制系统执行完整设备级断开操作的替代方法。

回到顶部