MQTT経由のデータをSORACOM APIでSIM単位の認証/受信したデータをCloudantに格納
投稿者:ソリューション担当

前回から引き続き、Raspberry PiのセンサーデータをBluemixのMQTT(IoTF)経由で受信することを想定しています。今回のプログラムは受信側のNode-RED(今回はBluemix上のアプリケーションとして)で動作させます。
- Raspberry Pi + L-03D + SORACOM SIM で通信を行う
- Raspberry PiからSORACOM Beam経由でBluemixのMQTTへデータ送信を行う
- Raspberry PiのLEDを Node-RED を使ってLチカする
- SORACOM Beam を利用してMQTTプロトコル経由でIMSI情報を付与してみる
- MQTT経由のデータをSORACOM APIでSIM単位の認証/受信したデータをCloudantに格納 ← ココ
- Cloudantに格納したデータを可視化
Input「mutt」ノードからデータを受信するとtopic名は「msg.topic」という変数の中に格納されているのでその情報を活用してみたいと思います。
SORACOM APIでのSIM端末の確認
実際にNode-REDを利用してSORACOM APIを利用してみたいと思います。基本的には、認証を行いTokenを取得した後に必要な機能を実行するという手順になります。
Tokenの取得
「APIへの認証」の中では以下を実行します。
msg.payload = { "email": "登録メールアドレス", "password": "パスワード" };
msg.url = "https://api.soracom.io/v1/auth";
msg.method = "POST";
var headers = {"content-type": "application/json; charset=UTF-8", "connection":"keep-alive", "pragma":"no-cache","cache-control":"no-cache", "Content-Length": msg.payload.length};
msg.headers = headers;
return msg;
この「ノード」をFunction「http request」へ引き渡すことによりトークンを取得することが出来ます。Json型式で応答がくるので function 「JSON」を利用してNode-RED上でJSONとして認識をさせます。
SIMの確認
今回は、トークンを利用して実際にMQTT経由で送信されてきているimsiがSORACOM上サブスクライバーに登録されているかを確認します。(ここではエラー処理などは含んでいません)
function「SORACOMサブスクライブの取得」では以下を実行します。
var api = msg.payload;
var key = api.apiKey;
var token = api.token;
var imsi = msg.topic.split("/").pop();
msg.headers = {
"X-Soracom-API-Key" : key,
"X-Soracom-Token": token,
};
msg.method = "GET";
msg.url = "https://api.soracom.io/v1/subscribers/" + imsi;
return msg;
ドキュメントに従い、X-Soacom-xxxを送信することでメソッドの呼び出しが出来ます。ここまでを実行すると
{ "imsi": "xxxx",
"msisdn": "xxxx",
"ipAddress": "10.xxxxx",
"apn": "soracom.io",
"type": "s1.minimum",
"groupId": "b660607axxxx",
"createdAt": 1443922449473,
"lastModifiedAt": 1444261454327,
"expiredAt": null,
"terminationEnabled": false,
"status": "active",
"tags": { "name": "sora01" },
"sessionStatus": { "lastUpdatedAt": 1444261454327, "imei": null, "location": null, "ueIpAddress": null, "dnsServers": null, "online": false }, "speedClass": "s1.minimum", "moduleType": "nano", "plan": 0, "expiryTime": null, "operatorId": "OP0098585581", "createdTime": 1443922449473, "lastModifiedTime": 1444261454327 }
上記のデータが取得できます。処理として問題なければこのデータを利用して様々な事が出来ます。
Cloudantへのデータの保管
Bluemixを使うと、データストアとして幾つか選択肢があるのが素晴らしいと思います。JSON形式の場合には、Cloudant NOSQLを利用するのが良いかと思いますので今回はこちらにデータを入れてみます。
Cloudingの準備
利用する output[cloudant]をみると以下のようになっています。データとして msg.payload のみを格納するか msg 全体を格納するかを選択できます。ここで利用できるOperationは「Insert」または「Remove」になります。どのCloudantに接続するかは、Bluemix上でバインドされているサービスが表示されていると思います(ここでは RaspberryIoT-CloudantN」)
Bluemixのコンソールから、Cloudantコンソールを起動します。(以下の画面では既に「raspi」というデータベースが作成されています)
右上の「Add New Database」から新規に作成します。ここでの名称を先ほどのNode-RED上の「Database」名に記入します。Cloudantはドキュメント型NoSQLのため特に最初にカラムの定義は不要です。この状態でNode-REDを動作させるとデータが蓄積されているのがわかります。
挿入するデータの準備
さて、実際に格納したいのは今回の場合にはMQTTから受信したデータになります。一番最初のノードフロー中の「save.temp」では以下の処理を行っています。
このように、context.global.hoge = "hogehoge"
とすることで値をグローバル変数へ格納することができるのでフロー上の msg.payload が変化する場合にも影響は受けずに値が保持できます。
最終的な格納前の 「dump」では msg.payload を再度作りなおしています。
実際に欲しい値をここで作りましょう。
ここまで出来ればRaspberry Pi上のセンサーからデータがMQTTに配信される都度Cloudantにデータが自動的に格納されている状態となります。
まとめ
実際には受信したデータを都度、SORACOMに問い合わせることはオーバーヘッドが大きくなるためにオススメしませんがこのように簡単に動作を作ることが出来ます。例えば、MQTT経由で「利用停止」のコマンドが送信されてきたらSIMを停止にしたり、時間がきたら開始したりという事が簡単に実装可能です。
次回はdemo環境としては最後になりますがCloudantに格納されているデータをNode−REDから取得してグラフを描画していきたいと思います。