使用cordova-plugin-ble-central连接小米手环4/5/6时订阅心率数据报错,寻求设备确认的特征值写入方案
cordova-plugin-ble-central连接小米手环4/5/6时订阅心率数据报错,寻求设备确认的特征值写入方案
嘿,我之前折腾过小米手环的BLE通信,太懂这种找不到正确特征值的头疼了!你遇到的这个「Write descriptor failed: 3」报错,本质就是小米手环需要先完成设备身份验证/确认,才会给你开放心率数据的订阅权限,官方APP里的配对确认弹窗背后就是这个逻辑。
我自己用cordova-plugin-ble-central搞定过米4、米5、米6的心率订阅,给你一套亲测有效的特征值写入方案:
核心思路
小米手环有个专属的自定义BLE服务,必须先向这个服务下的特定特征值写入验证指令,完成手环的“身份确认”后,才能正常订阅心率这类敏感数据。
具体实现步骤
先定义小米手环的验证服务和特征值UUID
这是小米手环4/5/6通用的自定义服务和验证特征值,你直接用就行:// 小米手环自定义服务UUID const miCustomService = '0000fee0-0000-1000-8000-00805f9b34fb'; // 用于发送验证指令的特征值UUID const miAuthCharacteristic = '0000fee1-0000-1000-8000-00805f9b34fb'; // 验证指令:固定的字节数组 const authData = new Uint8Array([0x01, 0x00]);在订阅心率前先发送验证指令
你需要把验证步骤放在ble.startNotification前面,确保手环先收到确认指令再开放权限:// 先发送设备验证指令 ble.write( blConn.peripheral.id, miCustomService, miAuthCharacteristic, authData, () => { console.log('设备验证成功!现在可以正常订阅心率了'); // 验证通过后再执行你原来的心率订阅逻辑 ble.startNotification( blConn.peripheral.id, '180d', '2a37', blConn.onData, blConn.onError ); }, (error) => { console.error('验证指令发送失败,检查服务/特征值是否正确:', error); } );
额外注意点
- 验证是一次性的:每次手环连接成功后只需要发送一次验证指令,之后就可以正常获取心率、步数等所有数据了
- 固件版本兼容:如果上面的指令无效,试试两步验证:先写
new Uint8Array([0x00, 0x00])到同一个特征值,再写[0x01, 0x00],部分旧固件版本的手环需要这个流程 - 确认服务存在:可以在连接成功后调用
ble.discover或者打印peripheral.services,确保这个自定义服务(fee0)存在,极少数固件版本的UUID可能有细微差别,但90%以上都是通用的
你原来的心率服务和特征值(180d/2a37)是标准的BLE心率服务,本身没问题,只是小米手环加了一层权限验证,只要过了这一关,订阅就不会报错了。
备注:内容来源于stack exchange,提问作者Nikolay Mateev
相关产品推荐
相关产品推荐

