You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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服务,必须先向这个服务下的特定特征值写入验证指令,完成手环的“身份确认”后,才能正常订阅心率这类敏感数据。

具体实现步骤

  1. 先定义小米手环的验证服务和特征值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]);
    
  2. 在订阅心率前先发送验证指令
    你需要把验证步骤放在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 13:34:30