HarmonyOS 鸿蒙Next中(蓝牙BLE)调用gattServer.notifyCharacteristicChanged后台报错

HarmonyOS 鸿蒙Next中(蓝牙BLE)调用gattServer.notifyCharacteristicChanged后台报错 cke_341.png

没有抛出error,后台日志报错

cke_1905.png

实际未成功发送通知,是否和这个报错有关


更多关于HarmonyOS 鸿蒙Next中(蓝牙BLE)调用gattServer.notifyCharacteristicChanged后台报错的实战教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

尊敬的开发者,您好!

未复现出问题,麻烦您用以下命令提供hilog日志,需要日志定位详细的问题根因,或者提供能复现问题demo,谢谢。

hdc file recv /data/log/hilog

更多关于HarmonyOS 鸿蒙Next中(蓝牙BLE)调用gattServer.notifyCharacteristicChanged后台报错的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在鸿蒙Next中,调用gattServer.notifyCharacteristicChanged后台报错,通常由以下原因导致:

  1. 服务未注册或未启动:确保GATT服务已正确注册并启动。
  2. 特征值权限问题:检查特征值的属性是否支持通知(NOTIFY或INDICATE)。
  3. 客户端未启用通知:确认远程设备已通过writeDescriptor启用通知。
  4. 连接状态异常:确保BLE连接处于活动状态。
  5. 参数错误:检查传入的特征值对象、confirm参数等是否正确。

建议检查日志中的具体错误码,如0x80100001表示服务未找到。

从日志截图看,这个后台报错 ERR_BLE_SERVER_INVALID_STATE 是导致 notifyCharacteristicChanged 调用失败、通知未成功发送的直接原因。

该错误表明 GATT Server 当前处于一个无效或不正确的状态,无法执行发送通知的操作。在 HarmonyOS Next 的 BLE 框架中,这通常与连接状态和服务/特征值的配置有关。具体原因和排查方向如下:

  1. 连接状态问题:最可能的原因是,调用 notifyCharacteristicChanged 时,目标客户端设备(Central)并未处于已连接(BLEConnectionState.CONNECTED)状态,或者连接已断开但本地状态未及时更新。发送通知的前提是存在一个已连接的、并已启用通知(通过 Client Characteristic Configuration Descriptor, CCCD)的客户端。

  2. 特征值配置问题

    • 确保你尝试通知的特征(Characteristic)必须支持 NOTIFYINDICATE 属性(在 ble.GattCharacteristicproperties 字段中设置)。
    • 该特征必须已成功添加到服务中,并且该服务已成功添加到 GATT Server(gattServer.addService)并已启动。
  3. 调用时机问题:确保在 gattServer 已成功启动、相关服务已添加、并且收到客户端已成功订阅(写入CCCD)的通知回调后,再调用 notifyCharacteristicChanged

建议的代码层面检查点

  • 确认连接状态:在调用 notify 前,检查 device 的连接状态。可以通过维护一个设备连接状态映射,或在收到 onConnectionStateChange 回调时更新状态。
  • 确认CCCD已启用:确保已收到并正确处理 onCharacteristicWrite 回调,且写入的 CCCD 值表示启用通知(通常为 0x00010x0002)。
  • 验证特征对象:确保传入 notifyCharacteristicChangedcharacteristic 对象是已添加到服务中的那个特征对象,并且其 serviceUuidcharacteristicUuid 正确。
  • 检查权限:如果特征值涉及加密通信,请确认链路已加密或具有相应权限。

核心排查逻辑:在调用 gattServer.notifyCharacteristicChanged(device, characteristic, confirm) 之前,你的应用逻辑应能明确保证:1) device 已连接;2) 该 device 已为目标 characteristic 启用了通知(CCCD值正确)。缺少任一条件,都会导致 INVALID_STATE 错误。

由于没有看到具体代码,无法定位更精确的步骤。请重点检查连接状态管理和CCCD写入处理这两个环节的代码逻辑。

回到顶部