我正在使用 Cordova 创建一个应用程序,该应用程序需要解释来自蓝牙 HR 监视器的数据(能够记录原始 RR 间隔,例如 Polar H7)。我正在使用cordova-plugin-ble-central
尽管在互联网上搜寻答案并多次阅读蓝牙心率服务特性规范,但我很难理解从显示器接收到的数据。
这是我每次收到数据时运行的函数:
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
}
},
当我记录缓冲区中接收到的数据时,以下内容输出到控制台: 控制台输出
我知道如何提取 RR 间隔(以黄色突出显示),但我并不真正理解其他值代表什么,因为用户可能正在连接不传输 RR 间隔等的其他监视器。
非常感谢对接收到的数据的含义以及如何解析它的快速简单的英语解释。例如,什么数字构成标志字段,以及如何将其转换为二进制以提取子字段(即检查是否存在 RR 间隔 - 我知道这是由标志字段中的第 5 位决定的。)
该插件还声明“原始数据作为 ArrayBuffer 从本机代码传递到成功回调”,但我不知道如何检查标志以确定来自特定 HR 监视器的数据是 8 位还是 16 位格式。下面是我从收到的数据创建 Uint8 和 Uint16 数组时的另一个控制台日志。我再次强调了心率和 RR 间隔,但我需要知道其他值代表什么以及如何正确解析它们。
整个代码如下:
var heartRateSpec = {
service: '180d',
measurement: '2a37'
};
var app = {
initialize: function() {
this.bindEvents();
},
bindEvents: function() {
document.addEventListener('deviceready', this.onDeviceReady, false);
},
onDeviceReady: function() {
app.scan();
},
scan: function() {
app.status("Scanning for Heart Rate Monitor");
var foundHeartRateMonitor = false;
function onScan(peripheral) {
// this is demo code, assume there is only one heart rate monitor
console.log("Found " + JSON.stringify(peripheral));
foundHeartRateMonitor = true;
ble.connect(peripheral.id, app.onConnect, app.onDisconnect);
}
function scanFailure(reason) {
alert("BLE Scan Failed");
}
ble.scan([heartRateSpec.service], 5, onScan, scanFailure);
setTimeout(function() {
if (!foundHeartRateMonitor) {
app.status("Did not find a heart rate monitor.");
}
}, 5000);
},
onConnect: function(peripheral) {
app.status("Connected to " + peripheral.id);
ble.startNotification(peripheral.id, heartRateSpec.service, heartRateSpec.measurement, app.onData, app.onError);
},
onDisconnect: function(reason) {
alert("Disconnectedz " + reason);
beatsPerMinute.innerHTML = "...";
app.status("Disconnected");
},
onData: function(buffer) {
var data = new Uint16Array(buffer);
if (heartRate.hasStarted() == false) {
heartRate.beginReading(Date.now());
} else {
var rrIntervals = data.slice(1);
for (i=0; i<rrIntervals.length; i++) {
rrInterval = rrIntervals[i];
heartRate.addReading(rrInterval);
}
}
},
onError: function(reason) {
alert("There was an error " + reason);
},
status: function(message) {
console.log(message);
statusDiv.innerHTML = message;
}
};
app.initialize();
非常感谢您的任何帮助或建议。