sakura.ioからのセンサーデータをAzureに格納する

※この記事はSIerIoTLTアドベントカレンダー 12月8日の記事です。

こんにちは、にしだ ゆうき(@EDOkko360)です。今はさくらインターネットのIoTチームという部署で、より多くの人にサービスの背景や概要を届けるブース出展や、より知りたいという人にオンボーディングを提供するハンズオンイベントといった、オフラインイベント全般の企画運営を行っています。

現在携わっているIoTプラットフォーム「sakura.io(さくらアイオー)」では自社やOSSに留まらず、様々なサービスとの連携をハンズオンの形で提供しています。もし今回の内容以外に「うちのサービスと繋げましょう!」といったご要望があれば何なりとお知らせください。

この記事について

さて、みなさんも普段 「あ~センサーデータをメガクラウドに手軽に繋げてぇ~」と思うことありませんか?ありますよね?良かった!

本記事ではsakura.ioと、連携先サービスとしてリリースしたMicrosoft Azureの「Azure IoT Hub」との連携をハイライト版として紹介します。

sakura.io 「Azure IoT Hub」および「Azure Event Hubs」との連携サービス(正式版)提供開始のお知らせ | さくらインターネット

IoTを初めて試そうとされている方に全体像をお伝えすることを想定し、sakura.ioを使ったデバイスのセンシングデータをデータ活用の入り口になるIoT Hubに届けた後にBLOBストレージに蓄積されるところまでをお届けします。

f:id:rabbits-motorcycle:20181203104131p:plain
今回ご説明する全体像

注意

ご自身の環境で本内容を試す場合、使用するリソースによって継続的に利用料金が発生します。作成したリソースは継続して利用する意思がない場合は各社のマニュアルに従い、環境のシャットダウンやリソースの削除を行うようにしてください。

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 ]文字列をコピーしておきます。

f:id:rabbits-motorcycle:20181203111758p:plain
Shared access keys欄にある[ Connection string-primary key ]文字列をコピーします

なお、今回はすべての権限を付与していますが、実際の利用シーンにおいては必要な権限だけ切り出して付与することをご検討ください。

BLOBストレージの作成

次はストレージアカウントを作成し、BLOB(Binary Large OBject)のコンテナを作成します。

BLOBストレージはログファイルやバックアップ等、非構造化データの格納に最適化されており、極めて高いスケーラビリティを持ちます。内部構造としては「ストレージアカウント」内に「コンテナ」を作成し、その中にファイルを「BLOB」として格納します。

以下の手順でBLOBを格納するコンテナリソースを作成します。

  • 【リソースの作成】から【 Storage 】>【 ストレージアカウント – BLOB... 】と進みます。
  • 必要な仕様でストレージアカウントを作成します。本内容ではアカウントの種類を【 Storage V2 】で作成しています。
  • BLOBが格納されるコンテナを作成します。

f:id:rabbits-motorcycle:20181203114912p:plain
作成成功通知と作成されたコンテナの表示

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に遷移することを確認します。

f:id:rabbits-motorcycle:20181207130054p:plain
Inputs, Outputs, Queryが設定されていることを確認し、【 Start 】をクリックします

以上でAzure側の設定は全て完了しました。まだこの時点ではデバイスからデータは送信されていないためデータは流れ込んでいません。


sakura.ioの設定

続いてはsakura.ioの設定です。とは言っても、こちらの作業は5分程度で完了します。 sakura.ioは大きく「プロジェクト」「モジュール」「連携サービス」の3つが存在します。 単一のプロジェクトに複数のモジュールや連携サービスをぶら下げることでモジュール増減や連携先の追加が発生しても、システム側に改修等の影響が発生しないようにしています。

f:id:rabbits-motorcycle:20181203163649p:plain
プロジェクトとモジュール、連携サービスは1:N:Nの関係

前提

プロジェクトの作成&モジュール登録&連携サービス追加

初めにモジュールや連携サービスの紐付き先となるプロジェクトを作成します。sakura.ioコントロールパネルにログインし、以下の手順で作成します。

  • 【 プロジェクト追加 】から任意の名称でプロジェクトを作成する。
  • 作成したプロジェクトからモジュール登録を呼び出し、モジュールのラベル記載情報を使い登録する。  
    f:id:rabbits-motorcycle:20181203181133p:plain
    登録用IDと登録用パスワード、任意の名称を入力して追加をクリックします
  • この時表示されるモジュールID(uから始まる12桁のID)は後ほど動作確認で使用するためメモする。  
    f:id:rabbits-motorcycle:20181203181357p:plain
    モジュール登録直後のプロジェクト詳細画面
  • 作成したプロジェクトから連携サービス追加を呼び出し、IoT Hub作成時に控えた接続文字列を使いサービスを追加する。  
    f:id:rabbits-motorcycle:20181203181726p:plain
    3つの項目を設定、【 作成 】をクリックします

以上でsakura.io側での設定は完了しました。


マイコンおよびプログラムの構築

続いてはデバイス側の構築とプログラムの書き込みです。

前提

パーツの組立

各パーツを以下の手順に従い事前準備を行います。 * sakura.ioモジュール * 付属のアンテナ2本を接続する * sakura.ioシールド for Arduino * アンテナを接続したsakura.ioモジュールを取り付ける  

f:id:rabbits-motorcycle:20181205153936p:plain
両面テープは固定したい場合のみ使用します
* 付属のジャンパ2つをSDA1およびSCL1に取り付ける  
f:id:rabbits-motorcycle:20181205154105p:plain
上記図に従って黒いジャンパを取り付けます
* I/O電圧切り替えスイッチを5Vに切り替える  
f:id:rabbits-motorcycle:20181205154324p:plain
図のスイッチを右側にスライドさせます
* Grove Base Shield V2 * Power Switchを5Vに切り替える  
f:id:rabbits-motorcycle:20181205154839p:plain
図のスイッチを右側にスライドさせます
  事前準備が終わった各パーツを以下のように組み立てます。

  • 上段:Grove Base Shield V2(A0コネクタにGrove Temperature Sensor取り付け済み)
  • 中段:sakura.io シールド for Arduino(sakura.ioモジュール取り付け済み)
  • 下段:Arduino Uno Rev3

f:id:rabbits-motorcycle:20181205172623j:plain
最終形態はこんな感じ

ライブラリの取り込み

sakura.ioではArduino等の汎用マイコンでも使いやすいよう、ライブラリを提供しています。

Arduino IDEを起動し、ライブラリマネージャでsakuraioと検索すれば以下がヒットしますのでインストールします。(Winであれば Ctrl + Shift + I でも起動できます)

f:id:rabbits-motorcycle:20181205173339p:plain
インストールが完了すると緑色で「INSTALLED」が表示されます

試験用プログラムの流し込み

新規ファイルを開き、以下の内容をコピペして書き込みましょう。 ツールからボード、およびシリアルポートを指定し、マイコンボードに書き込みます。

// ヘッダファイル指定
#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);
}

書き込みが完了すると、シリアルモニタで以下のような表示が確認できるはずです。

f:id:rabbits-motorcycle:20181207125352p:plain
「Waiting to come online」表示の後、連番、Temperature、Available/Queuedの値が繰り返し出力

これでデータはIoT Hubまでは送信されているはずです。Waiting to come online...のまま次に進まない場合はモジュールが何らかの事情でプラットフォーム側と接続できていないため、「モジュールが登録されているか」「電源供給元を変えてみる(USBだけだと不足する可能性あり)」「電波状況が良い場所で動かしてみる」等を試してみます。 今回は割愛しますが、sakura.ioのWebSocketの詳細画面やIoT HubのツールであるDevice Explorer等を使うとより細かい切り分けもできるので、必要に応じて確認してみると良いでしょう。


動作確認

以上で下拵えは完了しました。Stream Analyticsのジョブは実行されているため、BLOBストレージにデータが貯まっているか確認しましょう。

f:id:rabbits-motorcycle:20181207130431p:plain
Stream Analytics jobsでも直近の流量を確認できます。

BLOBストレージ内データの確認

以下の手順でBLOB内のデータを参照します。

  • ダッシュボード画面から、自身が作成したストレージアカウントのリソースをクリックします。
  • [ Blob service ]欄から【 BLOB 】をクリックし、さらに作成したコンテナをクリックします。
  • BLOBの一覧最右部の【・・・】から【 BLOBの表示/編集 】をクリックします。

f:id:rabbits-motorcycle:20181207130811p:plain
蓄積されたデバイスからのデータ

ちなみにデータの中身は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ストレージへの格納されるまでを構築できました。

f:id:rabbits-motorcycle:20181207142006p:plain
Stream Analytics jobsで項目を絞ったり、平均値として格納することも可能


補足、詳細なドキュメントについて

今回はDevice to Cloud、いわゆる「上り」のデータだけでしたが、Cloud to Deviceのデータもやり取り可能です。こちらは参考ではありますが、より細かく記したハンズオンの資料があります。

Microsoft Azure&sakura.io 体験ハンズオン(Part1)/sakuraio handson azure part1 - Speaker Deck

また、Microsoft Azureとの接続はその他にも「Azure Event Hubs」とも連携できます。こちらは以下に詳細なドキュメントがありますのでご確認ください。

sakura.io


補足、sakura.ioモジュール(LTE)β版について

ちなみに、2016年10月から販売させていただいておりましたβ版のsakura.ioモジュール(LTE)は今年末で登録の期限を迎えます。 積んどくボードになってしまっている方は、この機会にぜひ登録して使ってみていただければと思います。 www.sakura.ad.jp