如何从Fireboltt智能手表获取心率数据至Flutter安卓应用
Fireboltt智能手表Flutter BLE数据匹配方案
问题说明
正在开发Flutter应用,目标是从Fireboltt品牌智能手表读取心率、血氧饱和度(SpO2)等健康数据,暂不确定手表搭载的系统类型(WearOS/Tizen/其他),目前基于flutter_ble实现蓝牙通信逻辑,已可通过蓝牙客户端扫描获取设备的服务与特征值列表,但无法匹配各特征值对应的数据类型。
当前扫描获取到的BLE服务示例数据如下:
BluetoothService{uuid: 0000180f-0000-1000-8000-00805f9b34fb, deviceId: F9:CE:08:3E:0B:31, isPrimary: true, characteristics: [BluetoothCharacteristic{ uuid: 00002a19-0000-1000-8000-00805f9b34fb, deviceId: F9:CE:08:3E:0B:31, serviceUuid: 0000180f-0000-1000-8000-00805f9b34fb, secondaryServiceUuid: null, properties: CharacteristicProperties{ broadcast: false, read: true, writeWithoutResponse: false, write: false, notify: true, indicate: false, authenticatedSignedWrites: false, extendedProperties: false, notifyEncryptionRequired: false, indicateEncryptionRequired: false}, descriptors: [BluetoothDescriptor{ uuid: 00002902-0000-1000-8000-00805f9b34fb, deviceId: F9:CE:08:3E:0B:31, serviceUuid: 0000180f-0000-1000-8000-00805f9b34fb, characteristicUuid: 00002a19-0000-1000-8000-00805f9b34fb, value: []}], value: []], includedServices: []}
现有数据解析
你当前扫描到的这组是蓝牙SIG标准定义的通用属性,和健康数据无关:
- 服务UUID
0000180f-0000-1000-8000-00805f9b34fb:电池服务 - 下属特征UUID
00002a19-0000-1000-8000-00805f9b34fb:电池电量特征,读取/订阅通知拿到的单字节值就是电池剩余百分比,取值范围0-100 - 特征下的描述符UUID
00002902-0000-1000-8000-00805f9b34fb:标准客户端特征配置描述符(CCCD),作用是开关对应特征的通知推送,属于BLE通用组件。
特征匹配实操方法
1 优先匹配标准BLE属性
所有格式为0000xxxx-0000-1000-8000-00805f9b34fb的UUID都是蓝牙SIG官方定义的标准属性,可直接按编号匹配含义,和你需求相关的常见标准健康属性如下:
- 心率服务UUID:
0000180d-0000-1000-8000-00805f9b34fb,下属心率测量特征UUID为00002a37-0000-1000-8000-00805f9b34fb,订阅通知后即可获取实时心率,解析规则为:第一个字节是标志位,若标志位第0位为0,心率值为第2个字节的Uint8类型数值;若为1,心率值为第2-3字节组成的Uint16类型数值。 - 血氧服务UUID:
00001822-0000-1000-8000-00805f9b34fb,下属SpO2测量特征UUID为00002a5f-0000-1000-8000-00805f9b34fb。
2 厂商自定义属性排查
Fireboltt多数中低端型号搭载自研RTOS系统,既不是WearOS也不是Tizen,部分健康数据会存放在厂商自定义的128位UUID(不符合上述标准UUID格式)服务中,按以下步骤匹配即可:
- 先导出设备所有服务、特征的UUID、权限列表,把已经识别的标准属性全部排除
- 对所有支持
notify/indicate权限的特征,找到其下属的00002902描述符,写入[0x01, 0x00]开启通知,静止佩戴手表1-2分钟,观察回传数据规律:- 数值在60-180区间、每秒左右更新、运动时数值明显升高的单/双字节数据,即为心率数据
- 数值稳定在90-100区间、变化幅度极小的,即为SpO2数据
- 做对照校验:在手表端手动触发一次单次心率测量、一次单次血氧测量,观察测量完成时哪个特征主动推送数据,即可精准匹配目标特征。
- 注意部分厂商会对自定义数据做简单处理,比如固定字节偏移、高低字节调换,只要拿到已知测量值(比如实际心率72)时的原始字节,多做几组对照就能找到换算规则,平价消费级手表基本不会做复杂加密。
3 常见问题处理
- 同品牌不同型号的BLE协议可能完全不同,不要直接套用其他型号的UUID匹配规则,必须针对当前对接的具体型号做校验
- 如果开启通知后特征无任何数据回传,先找支持
write/writeWithoutResponse权限的特征,逐个发送简单的绑定/鉴权指令测试,部分手表需要完成简易鉴权才会推送健康数据。
内容的提问来源于stack exchange,提问作者Simran Sharma
相关产品推荐
相关产品推荐

