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

蓝牙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:代码无效的原因

你的代码存在两个核心错误:

  1. Flag字段与数据内容冲突:重量测量特征的Flag字节中,Bit0代表「体重值存在」,Bit3代表「BMI和身高值存在」。你设置的0x08仅开启了Bit3,但未开启Bit0,可代码里又添加了体重数据,这种矛盾会导致解析工具判定数据无效。如果要同时传输体重、BMI、身高,Flag应设为0x09(0x01 | 0x08,即Bit0和Bit3同时置1)。
  2. 数据类型长度不匹配:蓝牙规范中,体重、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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 02:15:51