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
在HarmonyOS Next中BLE连接断开可能由以下原因导致:
- 耳机主动断开:耳机设备电量不足或超出有效距离(通常10米内)
- 协议栈错误:当订阅特征值通知时,若耳机BLE协议栈实现不规范会导致连接异常终止
- 特征值配置问题:订阅的UUID特征值未正确配置"notify"属性
- 系统资源限制:鸿蒙后台进程资源回收机制可能终止长时间运行的BLE连接
- 跨厂商兼容性问题:不同品牌耳机对BLE规格的实现存在差异
典型日志特征:会记录"GATT CONN TERMINATE"或"REMOTE DEVICE DISCONNECT"事件,错误代码0x08或0x13较常见。
根据描述,这个问题可能是由于订阅了某些特定的私有服务导致的。从提供的UUID来看:
-
服务1(0000FD21-…)是华为私有服务,通常用于设备内部通信或特殊功能。这类服务可能对订阅有特殊要求或限制。
-
服务2(C574EDB3-…)看起来是自定义UUID,可能是FreeBuds Pro4的专有服务。
断连的可能原因:
- 这些服务可能设计为仅限华为内部使用,外部订阅会触发安全机制导致断开
- 订阅这些服务可能干扰了耳机的正常工作流程
- 某些特性可能需要先写入特定的配置值才能订阅
建议:
- 避免订阅这些私有服务,只订阅标准BLE服务
- 如果需要这些功能,建议查阅FreeBuds Pro4的官方开发文档(如果有)
- 可以尝试在订阅前先写入CCC描述符(00002902)的使能值
代码本身没有问题,但需要注意华为设备对某些私有服务的特殊处理。