Bluetooth HR モニター (Polar H7 などの生の RR 間隔を記録できる) からのデータを解釈する必要がある Cordova を使用してアプリケーションを作成しています。私はcordova-plugin-ble-centralを使用しています
インターネットで回答を探したり、 Bluetooth Heart Rate Service Characteristic の仕様を何度も読んだりしたにもかかわらず、モニターから受信したデータを理解するのに苦労しています。
データが受信されるたびに実行される私の関数は次のとおりです。
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 番目のビットによって決定されることがわかっています)。
プラグインには、「Raw データがネイティブ コードから成功コールバックに ArrayBuffer として渡される」と記載されていますが、フラグをチェックして、特定の HR モニターからのデータが 8 ビットまたは 16 ビットのどちらであるかを判断する方法がわかりません。以下は、受信したデータから Uint8 配列と Uint16 配列の両方を作成したときの別のコンソール ログです。繰り返しますが、心拍数と RR 間隔を強調しましたが、他の値が何を表しているのか、それらを正しく解析する方法を知る必要があります。
Uint8 および Uint16 出力を含むコンソール ログ
コード全体は次のとおりです。
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();
ヘルプやアドバイスをお寄せいただきありがとうございます。