我正在使用Cordova创建一个应用程序,它需要从蓝牙HR监视器(能够记录原始RR间隔,如Polar H7)中解释数据。我正在使用cordova-plugin-ble-central
我很难理解从显示器收到的数据,尽管在互联网上搜索答案并多次阅读Bluetooth Heart Rate Service Characteristic specification。
这是我的函数,每次收到数据时都会运行:
-language:implicitConversions
当我记录缓冲区中收到的数据时,以下内容输出到控制台: console output
我知道如何提取RR间隔(以黄色突出显示),但我并不真正理解其他值所代表的含义,因为用户可能正在与其他不传输RR间隔等的监视器连接。 / p>
对于收到的数据意味着什么以及如何解析数据的快速简单英语解释将非常感激。例如,构成flags字段的数字,以及如何将其转换为二进制以提取子字段(即检查RR间隔是否存在 - 我知道这是由flags字段中的第5位确定的。)
该插件还声明'原始数据作为ArrayBuffer从本机代码传递给成功回调',但我不知道如何检查标志以确定来自特定HR监视器的数据是8或16位格式。下面是我从收到的数据创建Uint8和Uint16数组时的另一个控制台日志。我再次强调了心率和RR间隔,但我需要知道其他值代表什么以及如何正确解析它们。
console log with Uint8 and Uint16 output
整个代码如下:
onData: function(buffer) {
console.log(buffer);
// var data8 = new Uint8Array(buffer);
var data16 = new Uint16Array(buffer);
var rrIntervals = data.slice(1);
for (i=0; i<rrIntervals.length; i++) {
rrInterval = rrIntervals[i];
heartRate.addReading(rrInterval); // process RR interval elsewhere
}
},
非常感谢您提供任何帮助或建议。
答案 0 :(得分:1)
更新以获得更深入的解释,请查看this post I wrote on the subject。
我已经弄明白了 - 这里是遇到类似问题的人的快速解释:
传递给onData(缓冲区)的数据只是二进制数据,因此无论我们将其转换为Uint8Array还是Uint16Array,它仍然代表相同的二进制数据。当然,Uint16中的整数可能会更大,因为它们包含16位而不是8位。
flags字段始终由第一个字节表示,因此我们可以通过将数据(作为缓冲区传入)转换为Uint8Array并访问此数组的第一个元素来获取它,该元素将是索引为0的元素。 / p>
然后我们可以使用按位运算检查各个位字段。例如,Bluetooth Heart Rate Service Characteristic specification告诉我们第五位表示读数是包含RR间隔(1)还是不包含任何(0)。
下面我们可以看到第五位是二进制数16:
128 64 32 16 8 4 2 1
0 0 0 1 0 0 0 0
因此,操作16&amp;如果读数包含RR间隔,则flag(其中flag是包含flags字段的字节)将返回16(可以提升为true),如果不包含RR,则返回0(提升为false)。