作者:天蝎騎著豬狂奔 | 来源:互联网 | 2023-09-16 16:37
我很难从 HR 特征中获得有效值。我显然没有在 Dart 中正确处理这些值。
示例数据:
List value = [22, 56, 55, 4, 7, 3];
标志字段:
我将主字节数组中的第一项转换为二进制以获取标志
22 = 10110 (as binary)
这让我相信它是 U16 (bit[0] is == 1)
人力资源价值:
因为它是 16 位,所以我试图获取 1 和 2 索引中的字节。然后我尝试将它们缓冲到 ByteData 中。从那里我将它们转换为 Uint16,并将 Endian 设置为 Little。这给了我 14136 的值。显然我缺少关于它应该如何工作的一些基本知识。
任何帮助清除我不了解如何处理 16 位 BLE 值的帮助将不胜感激。
谢谢你。
/*
Constructor - constructs the heart rate value from a BLE message
*/
HeartRate(List values) {
var flags = values[0];
var s = flags.toRadixString(2);
List flagsArray = s.split("");
int offset = 0;
//Determine whether it is U16 or not
if (flagsArray[0] == "0") {
//Since it is Uint8 i will only get the first value
var hr = values[1];
print(hr);
} else {
//Since UTF 16 is two bytes I need to combine them
//Create a buffer with the first two bytes after the flags
var buffer = new Uint8List.fromList(values.sublist(1, 3)).buffer;
var hrBuffer = new ByteData.view(buffer);
var hr = hrBuffer.getUint16(0, Endian.little);
print(hr);
}
}
回答
您更新后的数据看起来好多了。这是解码它的方法,以及你用来从头开始解决这个问题的过程。
确定格式
该蓝牙网站最近已改组(〜2020年),特别是他们摆脱了一些文件浏览器,这使得事情更难找到并阅读IMO的。所有文档都在心率服务(HRS) 文档中,从GATT 主页面链接,但为了解析格式,我所知道的最佳来源是org.bluetooth.characteristic.heart_rate_measurement的 XML 。(重组之后,不搜索不知道怎么找到这个页面,好像没有链接了。)
字节 0 - 标志:22 (0001 0110)
位从 LSB (0) 到 MSB (7) 编号。
- 位 0 - 心率值格式:0 => UINT8 每分钟心跳
- 位 1-2 - 传感器接触状态:11 => 支持并检测到
- 位 3 - 能量消耗状态:0 => 不存在
- 位 4 - RR 间隔:1 => 存在一个或多个值
RR 间隔的含义在上面链接的 HRS 文档中进行了解释。听起来你只是想要心率值,所以我不会在这里讨论它们。
字节 1 - UINT8 BPM:56
由于标志的位 0 为 0,因此这是每分钟的节拍数。56.
字节 2-5 - UINT16 RR 间隔:55、4、7、3
您可能不关心这些,但这里有两个 UINT16 值(可以有任意数量的 RR-Interval 值)。BLE 总是小端的,所以 [55, 4] 是 1,079 (55 + 4<<8),而 [7, 3] 是 775 (7 + 3<<8)。
我相信文档对这个有点混乱。XML 建议这些值以秒为单位,但注释说“分辨率为 1/1024 秒”。表达这一点的正常方式是-10
,我确定这就是他们的意思。所以这些将是:
- RR0:1.05 秒 (1079/1024)
- RR1:0.76s (775/1024)
@Emanuel UINT8 表示 8 位无符号整数,因此如果您看到负值,则仅意味着您已将其转换为有符号整数数据类型。确保您使用的是无符号整数。