HarmonyOS鸿蒙Next中BLE在订阅特定UUID服务的特征值变化通知后,与耳机的连接断开

HarmonyOS鸿蒙Next中BLE在订阅特定UUID服务的特征值变化通知后,与耳机的连接断开

楼主在鸿蒙Next 5.0的手机上开发了一款蓝牙APP,目前可以成功用BLE连接Freebuds Pro4蓝牙耳机,并发现其所有服务的UUID。楼主进而订阅每个UUID的特征值变化通知,大部分UUID都能够成功订阅,但是有两个服务在订阅后耳机连接会断开,且不会报错。这两个服务的UUID特征值如下:

服务1:

{
  "characteristicUuid": "02000200-0000-2000-8000-009E78563412",
  "serviceUuid": "0000FD21-0000-1000-8000-00805F9B34FB",
  "characteristicValue": {},
  "properties": {
    "write": false,
    "writeNoResponse": false,
    "read": false,
    "notify": true,
    "indicate": false
  },
  "descriptors": [
    {
      "descriptorUuid": "00002902-0000-1000-8000-00805F9B34FB",
      "characteristicUuid": "02000200-0000-2000-8000-009E78563412",
      "serviceUuid": "0000FD21-0000-1000-8000-00805F9B34FB",
      "descriptorValue": {}
    },
    {
      "descriptorUuid": "00002901-0000-1000-8000-00805F9B34FB",
      "characteristicUuid": "02000200-0000-2000-8000-009E78563412",
      "serviceUuid": "0000FD21-0000-1000-8000-00805F9B34FB",
      "descriptorValue": {}
    }
  ]
}

服务2:

{
  "characteristicUuid": "0F9F8002-2AB2-45FB-82DB-BA8EFCEAE4B6",
  "serviceUuid": "C574EDB3-6551-473B-BAD8-65035F07E4A8",
  "characteristicValue": {},
  "properties": {
    "write": false,
    "writeNoResponse": false,
    "read": false,
    "notify": true,
    "indicate": true
  },
  "descriptors": [
    {
      "descriptorUuid": "00002902-0000-1000-8000-00805F9B34FB",
      "characteristicUuid": "0F9F8002-2AB2-45FB-82DB-BA8EFCEAE4B6",
      "serviceUuid": "C574EDB3-6551-473B-BAD8-65035F07E4A8",
      "descriptorValue": {}
    }
  ]
}

楼主对蓝牙知之甚少,只查到服务1中的0000FD21开头的serviceUuid是华为公司自己服务的代码,对服务2则完全没有头绪。请教各位大神,为何这两个服务订阅通知后会与耳机断连,如能解惑不甚感谢!另外附上订阅特征值变化通知的代码段。

this.gattClient!.setCharacteristicChangeNotification(characteristic, true, err => {
  if (err) {
    console.info(TAG,'notifyCharacteristicChanged callback failed');
  } else {
    console.info(TAG,'notifyCharacteristicChanged callback successful');
    this.gattClient!.on('BLECharacteristicChange', (characteristicChangeReq: ble.BLECharacteristic)=>{
      let serviceUuid: string = characteristicChangeReq.serviceUuid;
      let characteristicUuid: string = characteristicChangeReq.characteristicUuid;
      let value: Uint8Array = new Uint8Array(characteristicChangeReq.characteristicValue);
      console.info(TAG,'BLECharacteristicChange serviceUuid ',serviceUuid);
      console.info(TAG,'BLECharacteristicChange characteristicUuid',characteristicUuid);
      console.info(TAG,'BLECharacteristicChange value',value);
    });
  }
});

更多关于HarmonyOS鸿蒙Next中BLE在订阅特定UUID服务的特征值变化通知后,与耳机的连接断开的实战教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

感谢您的提问,当前提供的信息可能不足以让我们准确复现或定位问题,为了更快解决您的问题,建议您补充

  • 复现步骤
  • hilog日志。

更多关于HarmonyOS鸿蒙Next中BLE在订阅特定UUID服务的特征值变化通知后,与耳机的连接断开的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS Next中BLE连接断开可能由以下原因导致:

  1. 耳机主动断开:耳机设备电量不足或超出有效距离(通常10米内)
  2. 协议栈错误:当订阅特征值通知时,若耳机BLE协议栈实现不规范会导致连接异常终止
  3. 特征值配置问题:订阅的UUID特征值未正确配置"notify"属性
  4. 系统资源限制:鸿蒙后台进程资源回收机制可能终止长时间运行的BLE连接
  5. 跨厂商兼容性问题:不同品牌耳机对BLE规格的实现存在差异

典型日志特征:会记录"GATT CONN TERMINATE"或"REMOTE DEVICE DISCONNECT"事件,错误代码0x08或0x13较常见。

根据描述,这个问题可能是由于订阅了某些特定的私有服务导致的。从提供的UUID来看:

  1. 服务1(0000FD21-…)是华为私有服务,通常用于设备内部通信或特殊功能。这类服务可能对订阅有特殊要求或限制。

  2. 服务2(C574EDB3-…)看起来是自定义UUID,可能是FreeBuds Pro4的专有服务。

断连的可能原因:

  • 这些服务可能设计为仅限华为内部使用,外部订阅会触发安全机制导致断开
  • 订阅这些服务可能干扰了耳机的正常工作流程
  • 某些特性可能需要先写入特定的配置值才能订阅

建议:

  1. 避免订阅这些私有服务,只订阅标准BLE服务
  2. 如果需要这些功能,建议查阅FreeBuds Pro4的官方开发文档(如果有)
  3. 可以尝试在订阅前先写入CCC描述符(00002902)的使能值

代码本身没有问题,但需要注意华为设备对某些私有服务的特殊处理。

回到顶部