蓝牙GATT重量测量特征值与标志字段问题咨询
蓝牙重量测量特征数据格式问题解答
问题1:0.0001分辨率的处理方式
蓝牙GATT重量测量特征中,存储的整数值 = 实际物理值 / 分辨率,解析时反过来用存储值乘以分辨率得到实际值。比如实际身高为1.75米,分辨率0.0001米,那么存储的整数值就是1.75 / 0.0001 = 17500,接收端拿到17500后乘以0.0001就能还原出1.75米的实际身高。
问题2:M=1、d=-1等参数的含义
这是蓝牙规范定义数值分辨率的科学计数法规则:实际值 = M × 10^d
- M代表尾数(mantissa),d代表指数(exponent)
- 比如身高的参数是M=1、d=-4,对应分辨率为
1×10^-4 = 0.0001米;体重的参数是M=5、d=-3,对应分辨率0.005kg;BMI的参数是M=1、d=-1,对应分辨率0.1。
问题3:代码无效的原因
你的代码存在两个核心错误:
- Flag字段与数据内容冲突:重量测量特征的Flag字节中,Bit0代表「体重值存在」,Bit3代表「BMI和身高值存在」。你设置的
0x08仅开启了Bit3,但未开启Bit0,可代码里又添加了体重数据,这种矛盾会导致解析工具判定数据无效。如果要同时传输体重、BMI、身高,Flag应设为0x09(0x01 | 0x08,即Bit0和Bit3同时置1)。 - 数据类型长度不匹配:蓝牙规范中,体重、BMI、身高都要求用**uint16(2字节)**存储,而你用了
dbus.Byte(单字节uint8),长度不足会破坏数据结构。正确做法是将数值转换为16位无符号整数,拆分为两个字节(小端序,蓝牙默认字节序)添加到列表中。
修正后的示例代码:
import dbus from random import randint # 生成符合分辨率要求的模拟数据 weight_raw = randint(4000, 10000) # 对应实际体重:raw × 0.005kg bmi_raw = randint(180, 250) # 对应实际BMI:raw × 0.1 height_raw = randint(15000, 18000) # 对应实际身高:raw × 0.0001m value = [] value.append(dbus.Byte(0x09)) # 标记体重、BMI、身高均存在 # 按小端序拆分uint16为两个字节 value.append(dbus.Byte(weight_raw & 0xFF)) value.append(dbus.Byte((weight_raw >> 8) & 0xFF)) value.append(dbus.Byte(bmi_raw & 0xFF)) value.append(dbus.Byte((bmi_raw >> 8) & 0xFF)) value.append(dbus.Byte(height_raw & 0xFF)) value.append(dbus.Byte((height_raw >> 8) & 0xFF))
内容的提问来源于stack exchange,提问作者Nicooost
相关产品推荐
相关产品推荐

