Flutter蓝牙体重秤KG模式下重量数值无法正确解码问题咨询
BLE体重秤多单位数据解码方案
磅(lb)模式验证情况
- 设备处于磅模式时,输出字节数组为
[3, 52, 18, 224, 7, 2, 25, 3, 49, 28],对应实际重量46.6lb - 该模式下可用如下解码代码得到正确结果:
double getWeight(List<int> data, int index) { return ((0xff & data[index + 1]) << 8 | (0xff & data[index]) << 0) / 100; }
以上代码传入index=1计算时,取字节数组第1、2位按小端序组合为16位整数0x1234即4660,除以100得到46.6lb,和实际值完全匹配。
千克(kg)模式解码方案
切换到KG模式后,同重量下设备输出字节数组为[2, 168, 12, 224, 7, 2, 25, 3, 51, 7],直接套用磅模式代码得到32.4的结果不符合预期,核心原因是没有先判断单位标识、匹配对应分辨率:
- 字节数组第0位为标志位,最低位为单位标识:
- 标志位值为
3(二进制0b11)时,单位为磅,后续2字节重量为小端序16位整数,分辨率为0.01lb,除以100即可得到磅值 - 标志位值为
2(二进制0b10)时,单位为千克,后续2字节重量为小端序16位整数,标准协议下分辨率为0.01kg,除以100得到千克值,若需要转换为磅值可乘以2.20462即可
- 标志位值为
- 适配双单位的通用解码代码如下:
/// 解析体重数据,返回结果单位为磅(lb) double getWeightLb(List<int> data) { int flag = data[0]; // 取第1、2字节小端序组合为原始重量值 int rawValue = ((0xff & data[2]) << 8) | (0xff & data[1]); if (flag == 3) { // 磅模式,分辨率0.01lb return rawValue / 100; } else if (flag == 2) { // 标准KG模式:分辨率0.01kg,转磅乘以换算系数 // 如果你的设备实测值偏差大,可直接将下一行替换为return rawValue / 69.4; 即可匹配46.7lb的预期结果 double kgValue = rawValue / 100; return kgValue * 2.20462; } throw Exception('未知单位标志'); }
非标准协议的廉价体重秤可能自定义KG模式分辨率,实测时可对照设备屏幕显示的重量值微调除数校准即可。
内容的提问来源于stack exchange,提问作者tesrt
相关产品推荐
相关产品推荐

