DesignSpark Electrical Logolinkedin
Menu 検索
フォーラムで質問

格安スマートブレスレットをLoRaWANと繋ぎ IoTヘルスケア端末に (その3)

その2からの続き

今回のIoTシステムの構築にあたってRaspberry Pi上で動くプログラムはNode.jsを使う事にしました。

 

*Raspberry PiとスマートブレスレットのIoTシステム開発環境

最近のRaspbian OSには、Node.jsがインストールされていますので、すぐに使えるようになっています。Node.jsにはnobleというBLE通信を行うためのモジュールがあります。このモジュールを使ってスマートブレスレットとBLE通信を行い、測定データを取得します。

1.nobleモジュールのインストール

Nobleモジュールを使うには前準備として以下のライブラリをインストールしておきます。

sudo apt-get install bluetooth bluez libbluetooth-dev libudev-dev

その後、nobleモジュールをインストールします。

 npm install noble

2.nobleモジュールの使い方

 JavaScriptのプログラムに以下のようにnobleを宣言します。

 var noble = require('noble');

3.BLEの状態を確認して使える状態であればBLEデバイスのスキャンを開始します。

noble.on('stateChange', function(state) {
    console.log('on -> stateChange: ' + state);
    if (state === 'poweredOn') {
        noble.startScanning();
    } else {
        noble.stopScanning();
    }
});

4.検出したデバイスの名前を確認して接続する

       // デバイスの検出イベント処理
       noble.on('discover', function(peripheral) {
              //equals devicename
              if(peripheral.advertisement.localName == DEVICE_NAME){
                     peripheral.connect();  // 接続
                      devive_find = true;
                      noble.stopScanning();
                     以下省略

5.サービスUUIDを指定してGATTサービスを検索する

        var SERVICE_RX_UUID = "6e400001b5a3f393e0a9e50e24dcca9e";
      // デバイスに接続した時のイベント処理
        peripheral.on('connect', function() {
            this.discoverServices(SERVICE_RX_UUID);  // GATTサービスを検索する
        });

6.GATTサービスが見つかったら、そのサービスのCharacteristicsを検索する

       // サービスが見つかった時のイベント処理
        peripheral.on('servicesDiscover', function(services) {
            var GenericAccess = services[0];
            //サービスのcharacteristicを検索開始
            GenericAccess.discoverCharacteristics();
            以下省略

7.Characteristicsが見つかったら、最初のCharacteristicsにnotifyを有効にし、測定コマンドを送信します。

       以下のCharacteristicsが見つかります。

{"uuid":"6e400003b5a3f393e0a9e50e24dcca9e","name":null,"type":null,"properties":["notify"]}
{"uuid":"6e400002b5a3f393e0a9e50e24dcca9e","name":null,"type":null,"properties":["writeWithoutResponse","write"]}

 

       // Characteristicsが見つかった時のイベント処理
        GenericAccess.on('characteristicsDiscover',                                                      function(characteristics)
       {
                var Custom1 = characteristics[0];
                var Custom2 = characteristics[1];
                Custom1.notify(true);     // 通知を有効にする
                // 計測コマンドを送る
                send_cmds(Custom2,0);     // 計測コマンドを送信する
       }

       // コマンドの送信処理
       function send_cmds(Custom2,index) {
              // 最初に測定開始コマンドを送る
              var cmd = cmds[index][0];
              var cmd_str = bytes2str(cmd);
              Custom2.write(cmd, true,function(err){
                     if (err) {
                            console.log(err);
                     }
              });
              // 60秒待って測定終了コマンドを送る
              sleep2(60,function(){
                     var cmd = cmds[index][1];
                     Custom2.write(cmd, true);
                      if (index < cmds.length - 1) {
                            send_cmds(Custom2,index+1);
                     }
              });
       }

       スマートブレスレットに発行するコマンドの定義は、下のようにしています。

       // 歩数測定
       var cmd_0_start = new                                                             
Buffer([0xab,0x00,0x04,0xff,0x11,0x80,0x01]);
       var cmd_0_end = new Buffer([0xab,0x00,0x04,0xff,0x11,0x80,0x00]);
       // 一括測定
       var cmd_32_start = new                                                           
Buffer([0xab,0x00,0x04,0xff,0x32,0x80,0x01]);
       var cmd_32_end = new                                                             
Buffer([0xab,0x00,0x04,0xff,0x32,0x80,0x00]);
       var cmds = [[cmd_0_start,cmd_0_end],[cmd_32_start,cmd_32_end]];

8.コマンドの結果が通知された時のイベント処理を定義してデータ処理を行う

       // データ通知がされた時のイベント処理
       Custom1.on('data', function(data, isNotification) {
              // 取得したデータを解析してどのコマンドに対するデータ
                     か判別する
              var res_data = bytes2str(data);
              var cmd = res_data.substr(8,4);
              var data = res_data.substr(12,4);
              if (cmd == "1180") {
                        console.log("歩数:" +                                                    parseInt(res_data.substr(12,6),16));
                     // Cayenneへのデータ送信
                        cayenneClient.rawWrite(0,                                                 parseInt(res_data.substr(12,6),16));
                }]
                if (cmd == "3280") {  // 一括測定
                        var v1 = parseInt(res_data.substr(12,2),16);
                        var v2 = parseInt(res_data.substr(14,2),16);
                        var v3 = parseInt(res_data.substr(16,2),16);
                        var v4 = parseInt(res_data.substr(18,2),16);
                        console.log("心拍数:" + v1);
                        console.log("血中酸素:" + v2);
                        console.log("血圧(高):" + v3);
                        console.log("血圧(低):" + v4);
                       // Cayenneへのデータ送信
                        cayenneClient.rawWrite(4, v1);
                        cayenneClient.rawWrite(1, v2);
                        cayenneClient.rawWrite(2, v3);
                        cayenneClient.rawWrite(3, v4);
                    }
                });
            });

9.プログラムの実行

      pi@raspberrypi:~/healthband $ sudo node ble_sample.js

       のようにしてプログラムを実行した結果が下の画面コピーになります。

 

 10.クラウドサービスへのデータ送信

Raspberry Piで取得した測定データを遠隔地でも見られるようにするために、データを無料で使えるクラウドサービスであるCayenneに送信することにします。CayenneではNode.js用のモジュール(cayennejs)が提供されています。npm install cayennejsとしてモジュールをインストールします。そしてプログラムでcayennejsを宣言します。

var Cayenne = require('cayennejs');

cayennejsを使ったデータ送信ではcayenneが提供しているMQTTサーバに接続してデータをPublishすることでデータを送信します。その際に必要になるユーザ情報を記述します。この情報はcayenneのコンソールから取得することができます。

「Add new…」→「Device/Widget」→「Bring Your Own Thing」を選択

UserName,Password,Client IDなどを確認

 

取得したユーザ情報を使って接続するようにプログラムに処理を追加 します。

// Initiate MQTT API
const cayenneClient = new Cayenne.MQTT({
       username: "xxxxxxxx-xxxxx-xxxx-xxxx-xxxxxxxxxxxxx",
       password: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
       clientId: "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
       });

サービスに接続します。

cayenneClient.connect((err, mqttClient) => {
       console.log("cayenne connect");
});

データを送信します。

cayenneClient.rawWrite(0, 123);

データタイプを指定してデータを書きます。このようにデータを送信することにより、Webブラウザやcayenneアプリを開いて測定データを見ることができるようになります。

   

今回のプログラムでは10分毎に計測を行うようにタイマー処理を入れています。Raspberry Piとスマートブレスレットが通信できる範囲にいる間は継続してデータ取得、モニタリングができるようになりました。

 ここまででスマートブレスレットに専用スマホアプリ Wearfitが無くても遠隔地で血圧、心拍数、血中酸素の値を見える化することが可能になりました。

 想定したユースケースは、スマホやスマホアプリ無しでもシンプルにスマートブレスレットをしたご老人の健康状態を遠隔地で監視することにあります。例えば、田舎で一人暮らしの親を心配して都会に住む働き盛りの息子が、自分のCayenneアプリをインストールしたスマホを眺めることで健康状態を把握できるようになります。さらに一歩進んでこれをビジネスサービスとして展開する場合には、今流行のサービス付き高齢者住宅や老人ホームなど施設内で複数人のお年寄りでの活用が考えられます。

 上述のようにWiFi環境のみでの活用も可能なのですが、過去の経験から2.4GHzの無線帯域は、直進性が強く、鉄筋などでは、電波反射や他のWiFiやBluetooth機器との電波干渉が強いために使いものになりません。(自宅で一人使用なら問題ないのですが)

 そこで世界で46547人の登録ユーザー(2018.8.20現在)を誇る、無料でLoRaWANネットワークが使える - The Things Networkを利用します。下記参照図のようなLoRaWANスマートヘルスケアを構築するのです。

 

 

*The Things Networkサイト

2018年8月16日、 LoRaWAN Specification v1.1に準拠すべくThe Things Networkは、セキュリティ強化と相互接続性が可能となる新たなLoRaWANプロトコルスタック-TTN STACK V3をリリースしました。

 

LoRaWAN v1.1に関してはこちらをご参照ください。

The Things Network Japanサイト

日本でも先端的イノベータを中心に日本各地10カ所でThe Things Networkコミュニティが立ち上がっています。

 

今回、この記事のデモキットの開発にご協力いただいたThe Things Network Niigataイニシエータ田中さんのサイト

*The Things Network Niigataサイト

新潟エスラボサイト

Rasberry PiにLoRaWANセンサーノードとして通信するためには、Dragino LoRa GPS HATのような通信アドオンカードが必要となります。 

Dragino LoRa GPS HAT詳細ページ

最後にサービス付き高齢者住宅や老人ホームなど介護施設内でLoRaWANを活用したヘルスケアIoTシステムをご用命の際は、下記までご連絡ください。

The Things Network Japanアンバサダー
吉田秀利 hide@thethingsnetwork.org

The Things Network Japanアンバサダーをしております。 よろしくおねがいします。 www.crijapan.jp

20 Aug 2018, 8:00

コメント

August 27, 2018 09:00

はじめまして。記事拝見いたしました。
RasPiでLoRaWANを扱うHATに興味があるのですが、記事中のURLにありましたWikiには日本の周波数帯920MHzがないようなのですが、そちらには対応されているのでしょうか?
よろしくお願いします。

0 Votes

August 28, 2018 07:50

@teshiba はい、ただいまLoRa GPS HATは、技適申請中です。取得後、公開したいとおもいますのでしばらくおまちください。

September 29, 2018 03:10

@TheThingsNetworkJapan_Ambassador 返信が遅くなり申し訳ございません。ありがとうございました。 HATについてはもう少し待ってみます。 また、今回の記事では実際にはLoRaWANで情報の収集まではやられていないってことでよろしいでしょうか?タイトルで少し誤解してしまいました。

[Comment was deleted]