Flutter ble 读取体重秤特征值

问题描述

我是新手,我正在尝试连接到 A&D ble 体重秤并从服务 00002a9d-0000-1000-8000-00805f9b34fb 中获取重量数据,我得到了值 [1,48,22]我正在使用 Flutter_blue 库,重量值为 56.8 磅,我如何将其转换为数组值到实际重量值。TIA

解决方法

权重服务 0x2A98 的 documentation 向您展示了服务的不同领域和特征。

包含在特征值中的是一个 Flags 字段(用于显示 可选字段和测量单位)、一个重量字段,并取决于 Flags 字段的内容,可以包含 2. 中定义的一个或多个可选字段。

第 3.2 章描述了这些字段:

  1. 标志字段
  2. 权重字段
  3. 时间戳字段(可选)
  4. 用户 ID 字段(如果设置了标志,则包括在内)
  5. BMI 和高度场对(如果设置了标志,则包括在内)

根据这些信息,我们可以假设您收到的 3 个字节是标志字段和权重字段。

标志字段在十六进制中设置为 1 或 0x01,这意味着仅设置了第一位。根据文档,第一位描述了测量单位。值为 1 表示度量单位设置为英制。

您收到的第二个和第三个字节包含作为 uint16 分成两个字节的权重。我们必须弄清楚值的字节顺序(字节序)。我们可以使用 hex to integer converter:

您收到的两个值(48 和 22)可以用十六进制表示为 0x300x16。根据哪个值先出现,如果我们将它们合并在一起,我们会得到不同的值:

0x3016 -> 12310
0x1630 -> 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;
}