Help us understand the problem. What is going on with this article?

Mio FUSE+Device Connectでリアルタイム心拍数の計測と受信

More than 1 year has passed since last update.

概要

システム構成図

ウェアラブルウォッチ「mio FUSE」が計測するリアルタイム心拍数を、Device Web API ManagerによってWebサーバー化したAndroidデバイスを介し、WebSocketで受信する。

Device Web API Managerは「Device Connectシステムをスマートフォン上で実現するアプリケーション1」で、これ
を用いることで、APIが公開されていないスマートデバイスでも、REST API / WebSocketで簡単にデータを取得することができる。

環境

Mio FUSEとは

ウェアラブルウォッチ。心拍数を測ることができる。

Mio FUSE

Device Web API Managerとは

Device Web API Managerは「Device Connectシステムをスマートフォン上で実現するアプリケーション1」。

Device Connectとは

Device Connectはスマートフォン上に仮想のHTTPサーバを立てて、それを介してスマートデバイス(Pebble、THETA、Hue、スマートグラスなどなど)をWeb APIで操作できるGotAPIの一実装です。

Device Connectとは?

NTT docomo社が中心となって開発、啓蒙している技術で、各種デバイスへの接続をDeviceConnectが行い、さらにその操作するAPIをWeb APIとして提供してくれるものです。スマートフォンの中にアプリケーションサーバが立ち上がるので、Web APIを使ってデバイスにデータを送ったり、逆に取り出せるようになります。

hifive x DeviceConnectによるWoT体験ハンズオン!

何が便利なのか

  • スマートデバイスへのアクセスを抽象化してくれる。
  • APIが公開されていないスマートデバイスでも、REST API / WebSocketで簡単にデータを取得したり、デバイスの操作ができる。

DeviceConnectの情報

やってみよう

Device Web API Manager

インストールとビルド

  1. AndroidデバイスにDevice Web API Managerをインストール
  2. ビルドマニュアルに沿って、HeartRateプラグインをビルド

プラグインがビルドされると、「MIO GLOBAL-FUSEアイコン」がトップページに表示される。
Screenshot_20181015-190905.jpg

Mio FUSEとAndroidデバイスをBluetooth接続

AndroidデバイスにMio Goをインストールし、MioFuseとAndroidデバイスをBluetooth接続する。
接続に成功すると、「MIO GLOBAL-FUSEアイコン」が明るくなる。
Screenshot_20181016-145437.jpg

設定

「トップページ」の右上から「設定」に進み、必要な設定をする。
一部の設定はDevice Web API Managerをオフにしないと変更できないので、オフにする。
変更を終えたら、再びオンにする。
Screenshot_20181016-153736.jpg

認証

「外部IPを許可」にチェック
「Local OAuth認証」「Origin有効化」のチェックを外し、無効にする(手順を簡略化するための、本記事固有の設定です)。

Host

「設定」に表示されたHostを控えておく。
Screenshot_20181015-191131.jpg

serviceId

「トップページ」→「MIO GLOBAL-FUSE」→「serviceinfomation」→「GET /gotapi/serviceinfomation/」
と進み、表示されたserviceIdを控えておく。
Screenshot_20181015-193109.jpg

WebSocketで受信する

macOSデバイスからWebSocketでリアルタイム心拍数を取得する。
macOSデバイスとAndroidデバイスを、あらかじめ同じネットワークに接続しておく。

手順

WebSocketについて - DeviceConnect Users

上記ページにある手順を、簡潔にまとめた。

  1. 接続
  2. sessionKeyを送信
  3. Web APIをコール
  4. イベントの受信

これをNode.jsで実装したのが下のコードになる。

Node.jsでの実装

a-r-i/deviceconnect_websocket_nodejs - GitHub

WebSocket受信部分

app.js
const WebSocket = require('ws');

const hostname = ''; //控えておいたHost
const ws = new WebSocket('ws://'+ hostname +':4035/websocket');
const sessionKey = 'test'; //sessionKeyはなんでもよい

ws.onopen = function () { //1.接続
    ws.send('{"sessionKey": "' + sessionKey+ '"}'); //2.sessionKeyを送信
    callWebAPI(sessionKey); //3.Web APIをコール
};

ws.onerror = function (error) {
    console.log(error);
};

ws.onmessage = function (message) { //4.イベントの受信

    try {
        var json = JSON.parse(message.data);
        var bpm = json['heart']['rate']['value'];
        console.log('BPM:' + bpm);
    } catch (e) {
        console.log('This doesn\'t look like a valid JSON: ',
            message.data);
        return;
    }

};

WebAPIコール部分

main.js
const http = require('http');

function callWebAPI(sessionKey) {
    const resource = 'health/onheart'; //心拍数APIのパス
    const serviceId = ''; //控えたserviceId

    const options = {
        host: hostname,
        port: '4035',
        path: '/gotapi/' + resource + '?serviceId=' + serviceId + '&sessionKey=' + sessionKey,
        method: 'PUT',
        headers: {
            'Content-Type': 'application/json'
        }
    };

    const req = http.request(options, function (res) {
        var responseString = '';

        res.on('data', function (data) {
            responseString += data;

            try {
                var json = JSON.parse(data);
            } catch (e) {
                console.log('This doesn\'t look like a valid JSON: ',
                    data);
                return;
            }

        });
        res.on('end', function () {
            return responseString;
        });
    });

    req.on('error', function (error) {
        console.log(error);
    });

    req.end();
}

参考文献

結果

bpm.gif

a-r-i
「アイドル×テクノロジー」をテーマに、アイドルグループと共同でイベント・作品づくりをしています。 「アイドルの睡眠データを3Dプリンタでオブジェ化」 「アイドルとオタクがBitcoinで永久に消えないメッセージを刻む」 「過去にアイドルが居た場所に近づくとスマホが震えるアプリ」 お気軽に連絡ください。
https://github.com/a-r-i
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away