sakura.ioからのセンサーデータをAzureに格納する
※この記事はSIerIoTLTアドベントカレンダー 12月8日の記事です。
こんにちは、にしだ ゆうき(@EDOkko360)です。今はさくらインターネットのIoTチームという部署で、より多くの人にサービスの背景や概要を届けるブース出展や、より知りたいという人にオンボーディングを提供するハンズオンイベントといった、オフラインイベント全般の企画運営を行っています。
現在携わっているIoTプラットフォーム「sakura.io(さくらアイオー)」では自社やOSSに留まらず、様々なサービスとの連携をハンズオンの形で提供しています。もし今回の内容以外に「うちのサービスと繋げましょう!」といったご要望があれば何なりとお知らせください。
- この記事について
- Webサービス連携(Microsoft Azure)
- sakura.ioの設定
- マイコンおよびプログラムの構築
- 動作確認
- 補足、詳細なドキュメントについて
- 補足、sakura.ioモジュール(LTE)β版について
この記事について
さて、みなさんも普段 「あ~センサーデータをメガクラウドに手軽に繋げてぇ~」と思うことありませんか?ありますよね?良かった!
本記事ではsakura.ioと、連携先サービスとしてリリースしたMicrosoft Azureの「Azure IoT Hub」との連携をハイライト版として紹介します。
sakura.io 「Azure IoT Hub」および「Azure Event Hubs」との連携サービス(正式版)提供開始のお知らせ | さくらインターネット
IoTを初めて試そうとされている方に全体像をお伝えすることを想定し、sakura.ioを使ったデバイスのセンシングデータをデータ活用の入り口になるIoT Hubに届けた後にBLOBストレージに蓄積されるところまでをお届けします。
注意
ご自身の環境で本内容を試す場合、使用するリソースによって継続的に利用料金が発生します。作成したリソースは継続して利用する意思がない場合は各社のマニュアルに従い、環境のシャットダウンやリソースの削除を行うようにしてください。
sakura.ioの場合はモジュールを全て登録解除することで、Azureの場合はリソースを全て専用のリソースグループに所属する形で作っておきリソースグループごと削除することで、それぞれ課金対象をクリアできるかと思います。
Webサービス連携(Microsoft Azure)
本項ではまず先にデバイスからのデータの最終的な目的地となるMicrosoft Azureの環境構築を行っていきます。連携を行う際にはAzureで生成された文字列情報をsakura.io側に埋め込む必要があるため、先にこちらを実施します。
前提
- Microsoft Azureのアカウント作成が済んでいること
IoT Hubの作成
IoT HubはAzure上でホストされているマネージドサービスであり、IoT HubからAzure内の各サービスへの接続も提供されます。sakura.ioではAzureに対してデータを送受信する場合のエンドポイントとして標準で提供しています。
早速必要なリソースをAzureに作成していきましょう。Microsoft Azure ポータルにログインし、以下の手順でリソースを作成します。なお、共有アクセスポリシーには予め複数用意されていますが、sakura.io用に使っていることが明確になるよう、別に作成することをオススメします。
- 【リソースの作成】から【 モノのインターネット 】>【 IoT Hub 】と進みます。
- 必要なプランを指定します。他に作っていない場合はFreeプランで作成しましょう。
- IoT Hubの作成が完了したら、sakura.io側からセキュアに接続を行うために専用の「共有アクセスポリシー」を追加します。
- ポリシーの追加が完了したら、その中のShared access keys欄にある[ Connection string-primary key ]文字列をコピーしておきます。
なお、今回はすべての権限を付与していますが、実際の利用シーンにおいては必要な権限だけ切り出して付与することをご検討ください。
BLOBストレージの作成
次はストレージアカウントを作成し、BLOB(Binary Large OBject)のコンテナを作成します。
BLOBストレージはログファイルやバックアップ等、非構造化データの格納に最適化されており、極めて高いスケーラビリティを持ちます。内部構造としては「ストレージアカウント」内に「コンテナ」を作成し、その中にファイルを「BLOB」として格納します。
以下の手順でBLOBを格納するコンテナリソースを作成します。
- 【リソースの作成】から【 Storage 】>【 ストレージアカウント – BLOB... 】と進みます。
- 必要な仕様でストレージアカウントを作成します。本内容ではアカウントの種類を【 Storage V2 】で作成しています。
- BLOBが格納されるコンテナを作成します。
Stream Analytics jobsの作成
Azureでの最後のリソースとしてStream Analyticsのジョブを作成します。
Stream Analyticsとは、大量のデータストリームを分析・処理するためのエンジンです。データの入力元とSQLに似たクエリ、それらで生成されたデータの出力先、の3つを定義することで動作します。
以下の手順でジョブを作成します。
- 【リソースの作成】から【 Analytics 】>【 Stream Analytics job 】と進みます。
- ジョブを1件作成します。
- Inputsから入力元となるIoT Hubを指定します。Event Serialization FormatはJSONを、EncordingはUTF-8を指定します。
- Outputsから出力先となるBLOBを指定します。Event Serialization FormatはJSONを、EncordingはUTF-8、FormatはLine Separatedを指定します。
- 間の処理を定義するクエリを指定します。今回は入力された内容をそのままBLOBに格納するため、FROMの[Your Input Alias]にIoT Hubのaliasを、INTOの[Your Output Alias]にBLOBのaliasをそのまま置き換えます。
- ジョブを動作させます。上部の【 Start 】をクリックし、状態がRunnningに遷移することを確認します。
以上でAzure側の設定は全て完了しました。まだこの時点ではデバイスからデータは送信されていないためデータは流れ込んでいません。
sakura.ioの設定
続いてはsakura.ioの設定です。とは言っても、こちらの作業は5分程度で完了します。 sakura.ioは大きく「プロジェクト」「モジュール」「連携サービス」の3つが存在します。 単一のプロジェクトに複数のモジュールや連携サービスをぶら下げることでモジュール増減や連携先の追加が発生しても、システム側に改修等の影響が発生しないようにしています。
前提
- さくらインターネットのサイトから会員登録を済ませ、会員IDが発行されていること。
プロジェクトの作成&モジュール登録&連携サービス追加
初めにモジュールや連携サービスの紐付き先となるプロジェクトを作成します。sakura.ioコントロールパネルにログインし、以下の手順で作成します。
- 【 プロジェクト追加 】から任意の名称でプロジェクトを作成する。
- 作成したプロジェクトからモジュール登録を呼び出し、モジュールのラベル記載情報を使い登録する。
- この時表示されるモジュールID(uから始まる12桁のID)は後ほど動作確認で使用するためメモする。
- 作成したプロジェクトから連携サービス追加を呼び出し、IoT Hub作成時に控えた接続文字列を使いサービスを追加する。
以上でsakura.io側での設定は完了しました。
マイコンおよびプログラムの構築
続いてはデバイス側の構築とプログラムの書き込みです。
前提
- ArduinoのサイトからArduino IDEをダウンロードし、インストールしていること。
- 以下の物品を手配、入手しておくこと。
- sakura.ioモジュール(LTE) https://sakura.io/product/module_lte.html
- sakura.ioシールド for Arduino https://sakura.io/product/arduino.html
- Grove Base Shield V2 https://www.seeedstudio.com/Base-Shield-V2-p-1378.html
- Grove Temperature Sensor https://www.seeedstudio.com/Grove-Temperature-Sensor-p-774.html
- Arduino Uno Rev3 http://akizukidenshi.com/catalog/g/gM-07385/
- USBケーブル Aオス-Bオス http://akizukidenshi.com/catalog/g/gC-07605/
- ACアダプター http://akizukidenshi.com/catalog/g/gM-07772/
パーツの組立
各パーツを以下の手順に従い事前準備を行います。 * sakura.ioモジュール * 付属のアンテナ2本を接続する * sakura.ioシールド for Arduino * アンテナを接続したsakura.ioモジュールを取り付ける * 付属のジャンパ2つをSDA1およびSCL1に取り付ける * I/O電圧切り替えスイッチを5Vに切り替える * Grove Base Shield V2 * Power Switchを5Vに切り替える 事前準備が終わった各パーツを以下のように組み立てます。
- 上段:Grove Base Shield V2(A0コネクタにGrove Temperature Sensor取り付け済み)
- 中段:sakura.io シールド for Arduino(sakura.ioモジュール取り付け済み)
- 下段:Arduino Uno Rev3
ライブラリの取り込み
sakura.ioではArduino等の汎用マイコンでも使いやすいよう、ライブラリを提供しています。
Arduino IDEを起動し、ライブラリマネージャでsakuraioと検索すれば以下がヒットしますのでインストールします。(Winであれば Ctrl + Shift + I でも起動できます)
試験用プログラムの流し込み
新規ファイルを開き、以下の内容をコピペして書き込みましょう。 ツールからボード、およびシリアルポートを指定し、マイコンボードに書き込みます。
// ヘッダファイル指定 #include <SakuraIO.h> // 変数の定義 SakuraIO_I2C sakuraio; const int B = 4250; // B value of the thermistor const int R0 = 100000; // R0 = 100k const int pinTempSensor = A0; // Grove - Temperature Sensor connect to A0 uint32_t cnt = 0; // 起動時に1回だけ実行 void setup() { Serial.begin(9600); Serial.print("Waiting to come online"); for (;;) { if ( (sakuraio.getConnectionStatus() & 0x80) == 0x80 ) break; Serial.print("."); delay(1000); } Serial.println(""); } // 以下ループ実行 void loop() { // cnt値のカウントアップ cnt++; Serial.println(cnt); // 温度情報の取得 int a = analogRead(pinTempSensor); float R = 1023.0 / a - 1.0; R = R0 * R; float temp = 1.0 / (log(R / R0) / B + 1 / 298.15) - 273.15; // convert to temperature via datasheet Serial.print("Temperature :"); Serial.println(temp); // さくらの通信モジュールへの各値のキューイング if (sakuraio.enqueueTx(0, cnt) != CMD_ERROR_NONE) { Serial.println("[ERR] enqueue error"); } if (sakuraio.enqueueTx(1, temp) != CMD_ERROR_NONE) { Serial.println("[ERR] enqueue error"); } // キューイングされた値の送信 Sending queued values sakuraio.send(); delay(100); // 利用可能な領域(Available)とデータが格納された領域(Queued)の取得 uint8_t available; uint8_t queued; if (sakuraio.getTxQueueLength(&available, &queued) != CMD_ERROR_NONE) { Serial.println("[ERR] get tx queue length error"); } Serial.print("Available :"); Serial.print(available); Serial.print(" Queued :"); Serial.println(queued); // 待機時間の調整 delay(5000); }
書き込みが完了すると、シリアルモニタで以下のような表示が確認できるはずです。
これでデータはIoT Hubまでは送信されているはずです。Waiting to come online...のまま次に進まない場合はモジュールが何らかの事情でプラットフォーム側と接続できていないため、「モジュールが登録されているか」「電源供給元を変えてみる(USBだけだと不足する可能性あり)」「電波状況が良い場所で動かしてみる」等を試してみます。 今回は割愛しますが、sakura.ioのWebSocketの詳細画面やIoT HubのツールであるDevice Explorer等を使うとより細かい切り分けもできるので、必要に応じて確認してみると良いでしょう。
動作確認
以上で下拵えは完了しました。Stream Analyticsのジョブは実行されているため、BLOBストレージにデータが貯まっているか確認しましょう。
BLOBストレージ内データの確認
以下の手順でBLOB内のデータを参照します。
- ダッシュボード画面から、自身が作成したストレージアカウントのリソースをクリックします。
- [ Blob service ]欄から【 BLOB 】をクリックし、さらに作成したコンテナをクリックします。
- BLOBの一覧最右部の【・・・】から【 BLOBの表示/編集 】をクリックします。
ちなみにデータの中身はsakura.ioからのデータだけでなく、IoT Hubが受信時に自動付与したデータも含まれています。以下の最初から「payload」の仮想配列までがsakura.ioからのデータ、以降がIoT Hub側の付与データとなります。
{ "id": "372413869152708608", "module": "uXXXXXXXXXXXX", "type": "channels", "datetime": "2018-10-24T06:59:45.517324594Z", "payload": { "channels": [{ "channel": 0, "type": "I", "value": 374, "datetime": "2018-10-24T06:59:45.474325301Z" }, { "channel": 1, "type": "f", "value": 27.268341, "datetime": "2018-10-24T06:59:45.496325301Z" }] }, "EventProcessedUtcTime": "2018-10-24T06:59:45.6649241Z", "PartitionId": 0, "EventEnqueuedUtcTime": "2018-10-24T06:59:45.5280000Z", "IoTHub": { "MessageId": null, "CorrelationId": null, "ConnectionDeviceId": "sakuraio- uXXXXXXXXXXXX ", "ConnectionDeviceGenerationId": "636759606134963568", "EnqueuedTime": "2018-10-24T06:59:45.5320000Z", "StreamId": null } }
以上でデバイスからのデータがsakura.ioを経由してMicrosoft Azure内のIoT Hubに渡され、Stream Analytics jobsで処理をされたうえでBLOBストレージへの格納されるまでを構築できました。
補足、詳細なドキュメントについて
今回はDevice to Cloud、いわゆる「上り」のデータだけでしたが、Cloud to Deviceのデータもやり取り可能です。こちらは参考ではありますが、より細かく記したハンズオンの資料があります。
Microsoft Azure&sakura.io 体験ハンズオン(Part1)/sakuraio handson azure part1 - Speaker Deck
また、Microsoft Azureとの接続はその他にも「Azure Event Hubs」とも連携できます。こちらは以下に詳細なドキュメントがありますのでご確認ください。
補足、sakura.ioモジュール(LTE)β版について
ちなみに、2016年10月から販売させていただいておりましたβ版のsakura.ioモジュール(LTE)は今年末で登録の期限を迎えます。 積んどくボードになってしまっている方は、この機会にぜひ登録して使ってみていただければと思います。 www.sakura.ad.jp