4

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();

ヘルプやアドバイスをお寄せいただきありがとうございます。

4

1 に答える 1

1

より詳細な説明については、私がこの件について書いたこの投稿をチェックしてください。

私はそれを理解しました-同様の問題に遭遇した人のための簡単な説明は次のとおりです。

onData(buffer) に渡されるデータは単なるバイナリ データであるため、それを Uint8Array または Uint16Array に変換しても、同じバイナリ データを表します。もちろん、Uint16 の整数は 8 ビットではなく 16 ビットで構成されているため、より大きくなる可能性があります。

flags フィールドは常に最初のバイトで表されるため、(バッファとして渡された) データを Uint8Array に変換することでこれを取得し、インデックス 0 の要素となるこの配列の最初の要素にアクセスできます。

次に、ビット演算を使用してさまざまなビット フィールドをチェックできます。たとえば、Bluetooth Heart Rate Service Characteristic 仕様では、5 番目のビットは、測定値に RR 間隔が含まれているか (1)、含まれていないか (0) を表していることがわかります。

以下では、5 番目のビットが 2 進数の 16 であることがわかります。

128 64  32  16  8   4   2   1
0   0   0   1   0   0   0   0  

したがって、操作 16 & フラグ (フラグはフラグ フィールドを含むバイト) は、読み取りに RR 間隔が含まれている場合は 16 (これを真に引き上げることができます) を返し、そうでない場合は 0 (偽に引き上げます) を返します。

于 2018-03-25T12:19:19.453 に答える