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

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

楼主在鸿蒙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中Freebuds Pro4在订阅特定UUID服务的特征值变化通知后BLE连接断开的实战教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

在HarmonyOS鸿蒙Next中,Freebuds Pro4在订阅特定UUID服务的特征值变化通知后BLE连接断开,可能是由于以下原因:

  1. 设备或服务端在处理通知时出现异常,导致连接中断。

  2. 蓝牙协议栈在处理通知时发生错误,触发了连接断开机制。

  3. 设备资源不足,无法维持多个通知订阅,导致连接断开。

  4. 服务端的特征值配置或权限设置不当,导致连接不稳定。

建议检查设备和服务端的日志,确认具体原因。

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


这个问题可能是由于订阅了Freebuds Pro4的私有服务导致的。从您提供的UUID来看:

  1. 服务1(0000FD21-…)是华为的私有服务,通常用于设备内部通信
  2. 服务2(C574EDB3-…)看起来也是私有服务

这些私有服务可能:

  1. 需要特定的认证或密钥才能访问
  2. 设计上不允许外部设备订阅通知
  3. 订阅后会触发设备的保护机制导致断开

建议:

  1. 避免订阅这些私有服务的通知
  2. 只订阅标准BLE服务(如电池、设备信息服务)
  3. 检查Freebuds的官方文档看是否有公开的API

您的代码实现本身没有问题,问题在于订阅了设备不允许外部访问的服务。

回到顶部