如何解决BLE 中的心率值
我很难从 HR 特征中获得有效值。我显然没有在 Dart 中正确处理这些值。
示例数据:
List<int> 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<int> values) {
var flags = values[0];
var s = flags.toRadixString(2);
List<String> 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);
}
}
解决方法
您更新后的数据看起来好多了。下面是如何解码它,以及你用来从头开始解决这个问题的过程。
确定格式
Bluetooth 网站最近(约 2020 年)进行了重组,特别是他们去掉了一些文档查看器,这使得 IMO 更难找到和阅读内容。所有文档都在 Heart Rate Service (HRS) 文档中,从主 GATT page 链接,但为了解析格式,我所知道的最佳来源是 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
我相信文档对这个有点混乱。 XML 建议这些值以秒为单位,但注释说“分辨率为 1/1024 秒”。表达这一点的正常方式是 <BinaryExponent>-10</BinaryExponent>
,我确信这就是他们的意思。所以这些将是:
- RR0:1.05 秒 (1079/1024)
- RR1:0.76 秒 (775/1024)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。