问题描述
我是新手,我正在尝试连接到 A&D ble 体重秤并从服务 00002a9d-0000-1000-8000-00805f9b34fb 中获取重量数据,我得到了值 [1,48,22]我正在使用 Flutter_blue 库,重量值为 56.8 磅,我如何将其转换为数组值到实际重量值。TIA
解决方法
权重服务 0x2A98 的 documentation 向您展示了服务的不同领域和特征。
包含在特征值中的是一个 Flags 字段(用于显示 可选字段和测量单位)、一个重量字段,并取决于 Flags 字段的内容,可以包含 2. 中定义的一个或多个可选字段。
第 3.2 章描述了这些字段:
- 标志字段
- 权重字段
- 时间戳字段(可选)
- 用户 ID 字段(如果设置了标志,则包括在内)
- BMI 和高度场对(如果设置了标志,则包括在内)
根据这些信息,我们可以假设您收到的 3 个字节是标志字段和权重字段。
标志字段在十六进制中设置为 1 或 0x01
,这意味着仅设置了第一位。根据文档,第一位描述了测量单位。值为 1 表示度量单位设置为英制。
您收到的第二个和第三个字节包含作为 uint16 分成两个字节的权重。我们必须弄清楚值的字节顺序(字节序)。我们可以使用 hex to integer converter:
您收到的两个值(48 和 22)可以用十六进制表示为 0x30
和 0x16
。根据哪个值先出现,如果我们将它们合并在一起,我们会得到不同的值:
0x3016
-> 123100x1630
-> 5680
由于您测量了 56.8 磅的重量,我们现在知道订单 0x1630
表示小数点后两位数字的正确值。
您可以像这样从列表中提取正确的值:
void main() {
List<int> received = [1,48,22];
// Get the weight value from the list starting at index 1
print(getWeight(received,1));
}
double getWeight(List<int> data,index) {
return (( 0xff & data[index + 1] ) << 8 | ( 0xff & data[index] ) << 0 ) / 100;
}