
こちらの記事について、内容・翻訳・視点・長さなど、皆様のご意見をお送りください。今後の記事製作の参考にしたいと思います。

Thank you! Your feedback has been received.

There was a problem submitting your feedback, please try again later.

こちらの記事の感想をお聞かせください。
今回の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スマートヘルスケアを構築するのです。
2018年8月16日、 LoRaWAN Specification v1.1に準拠すべくThe Things Networkは、セキュリティ強化と相互接続性が可能となる新たなLoRaWANプロトコルスタック-TTN STACK V3をリリースしました。
*LoRaWAN v1.1に関してはこちらをご参照ください。
日本でも先端的イノベータを中心に日本各地10カ所でThe Things Networkコミュニティが立ち上がっています。
今回、この記事のデモキットの開発にご協力いただいたThe Things Network Niigataイニシエータ田中さんのサイト
*The Things Network Niigataサイト
Rasberry PiにLoRaWANセンサーノードとして通信するためには、Dragino LoRa GPS HATのような通信アドオンカードが必要となります。
最後にサービス付き高齢者住宅や老人ホームなど介護施設内でLoRaWANを活用したヘルスケアIoTシステムをご用命の際は、下記までご連絡ください。
The Things Network Japanアンバサダー
吉田秀利 hide@thethingsnetwork.org