从Flutter App解析蓝牙BLE数据:解读收缩压数值
BLE血压测量特征数据解析及收缩压127.0 mmHg的验证过程
首先明确,你收到的特征UUID 00002a35-0000-1000-8000-00805f9b34fb 是蓝牙健康设备规范中的血压测量特征,需遵循标准数据结构解析。
一、原始数据拆分
你提供的十六进制数据为:DE-F6-F4-16-F3-FF-07-E4-07-01-14-08-2B-00-B2-F2-01-80-00,共19字节,按规范拆分如下:
- 标志位(Flags):第1字节
0xDE(二进制11011110),用于指示后续字段状态:- Bit0=0 → 血压单位为mmHg
- Bit1=1 → 包含时间戳字段
- Bit2=1 → 包含脉搏率字段
- Bit3=1 → 包含用户ID字段
- Bit4=1 → 包含测量状态字段
- Bits5-7=110 → 血压类型为设备自定义保留值
- 收缩压:第2-3字节
0xF6、0xF4(2字节SFLOAT格式) - 舒张压:第4-5字节
0x16、0xF3(2字节SFLOAT格式) - 平均压:第6-7字节
0xFF、0x07(2字节SFLOAT格式) - 时间戳:第8-14字节
0xE4-07-01-14-08-2B-00(7字节) - 脉搏率:第15-16字节
0xB2、0xF2(2字节SFLOAT格式) - 用户ID:第17字节
0x01(1字节) - 测量状态:第18-19字节
0x80、0x00(2字节)
二、收缩压127.0 mmHg的计算逻辑
收缩压采用IEEE-11073标准的16位SFLOAT格式,计算规则如下:
- SFLOAT由**4位补码指数(E)和12位补码尾数(M)**组成,数值公式为:
数值 = M × 10^E - BLE数据默认采用小端字节序(低字节在前,高字节在后),因此需将收缩压的两个字节
0xF6(低字节)、0xF4(高字节)组合为16位值0xF4F6
对 0xF4F6 拆分计算:
- 二进制为
1111 0100 1111 0110 - 高4位
1111是补码表示的指数E,对应十进制-1 - 低12位
010011110110是补码表示的尾数M,对应十进制1270 - 代入公式:
1270 × 10^(-1) = 127.0,即收缩压为127.0 mmHg
三、验证计算正确性
反向推导即可证明结果:
- 已知目标值127.0 mmHg,按SFLOAT规则拆解:
127.0 = 1270 × 10^-1,因此M=1270,E=-1 - E=-1的4位补码为
1111,M=1270的12位二进制为010011110110 - 组合为16位值:
1111 0100 1111 0110→ 十六进制0xF4F6 - 按小端字节序拆分,得到低字节
0xF6、高字节0xF4,与原始数据中第2-3字节完全匹配,验证成立
内容的提问来源于stack exchange,提问作者al ice
相关产品推荐
相关产品推荐

