こんばんは、オークファンの @dz_ こと大平かづみです。
Prologue - はじめに
本記事は、SORAOCM さんの Software Design 誌 巻頭特集記念リレーブログ の 5月13日分として投稿いたします。
今回は、SORACOM を使って Microsoft Azure にデータを送り、最終的に Azure Machine Learning (Azure ML) でセンサーデータを機械学習に繋げられるアーキテクチャを検討してみました!
大分ボリュームが出てしまったので、今回は、アーキテクチャのご紹介と、 SORACOM Funnel を利用して、 Azure ML が使えるようデータを蓄積する方法をご紹介いたします。
全体像
使っているもの
SORACOM 関連
役割 | サービス・プロダクト |
---|---|
データ通信 | SORACOM Air |
Azure への仲介 | SORACOM Funnel |
クラウド関連
役割 | サービス・プロダクト |
---|---|
プラットフォーム | Microsoft Azure |
データの受け口 | Azure Event Hubs |
データの転送 | Azure Stream Analytics |
データの蓄積 | Azure Table Storage |
デバイス関連
役割 | サービス・プロダクト |
---|---|
ゲートウェイ | Raspberry Pi 2 Model B |
センサー | SensorTag |
SIMアダプタ | FS01BU |
概要解説
まずは全体の概要をご紹介します。既知のことが多いので、さらっと書きます。
SORACOM Funnel → Auzre のつまづきポイントについては、後述の「要SORACOMチェックポイント詳説」をご参照くださいませ!
SensorTag から Bluetooth 経由でデータを取得する
SensorTag は、10種のセンサーを持つデバイスで、Bluetooth などを介してデータを取得・書込みすることができます。
私の場合は、復習もかねて、 Python で実装を試みました。その準備編(サンプルコードへのリンク含む)は以下にまとめましたので、ご参考になれば幸いです。
SORACOM Air の使い方
SORACOM Air と FS01BU の使い方はすでにたくさんの方が情報を上げてくださっています。
私はコチラの記事を参考にしました。
また、余談ですが WiFi と併用して FS01BU を利用する場合は、ネットワークのルーティングを調整しなければならない場合があるようです。以下にまとめましたので、ご参考になれば幸いです。
SORACOM Funnel から Azure Event Hubs へ
基本的には、下記の SORACOM 開発者サイトを参考にすれば、SORACOM Funnel を介して Event Hubs へ JSON データを送信することができます。
Azure Event Hubs から Azure Table Storage へ
Azure Event Hubs から Azure Table Storage へデータを転送するには、 Azure Stream Analytics を用います。
また、Azure Stream Analytics は、出力するデータを整形することができます。配列からの抽出や、データ型の変換などができます。公式ドキュメントで 一般的なクエリ例 が紹介されていますので、ご参考になるかと思います。
Azure Table Storage にデータを蓄積する理由
Azure ML で使える入力ソースはいくつかありますが、比較的安価で扱いやすいものとして Azure Table Storage を採用しました。
なお、Azure Table Storage は、 Azure Storage Explorer (Windows 向け)や Microsoft Azure Storage Explorer (Win, Mac, Linux から利用可能) などを利用して読み書きが可能です。
Azure ML への入力
Azure ML の利用の仕方は割愛しますが、入力方法についてご紹介します。
Azure ML で Azure Table Storage からデータを取得するには、 Import Data
モジュールを利用します。
左ペインから Import Data
モジュールをドラッグ&ドロップし、右の「Properties」で Azure Table Storage の設定を行います。
設定項目 | 設定値 |
---|---|
Data source |
Azure Table |
Authentication type |
Storage Account |
Account name |
[出力先のストレージアカウント名] |
Account key |
[出力先のストレージアカウントのキー] |
Table name |
[出力先のテーブルストレージ名] |
Rows to scan for property names |
ScanAll (任意) |
要SORACOMチェックポイント詳説
SORACOM Funnel x Azure 連携で私がつまづいたポイントについて、もう少し詳しくご紹介します。
SORACOM Funnel を介したデータは Azure Event Hubs にどう届くのか?
作業していて、これが一番悩みました。なぜかというと、自分が送信したデータ構造を想定してクエリを書いても、どうも取得できないのです。
いろいろ確認してみると、どうやらSORACOM Funnel を経由する段階でいくつかの情報が付与され、自分が設定したデータは payloads
に内包されていることがわかりました。
実際には、Event Hubs には、このようなデータが届きます。
key | value |
---|---|
payloads |
自分が設定した JSON データ を内包する |
credentialsId |
SORACOM 「セキュリティ」>「認証情報ストア」>「認証情報ID」 |
imsi |
SORACOM Air (SIM) の IMSI |
sourceProtocol |
送信形式 |
ですので、Event Hubs に届いたデータを利用する際は、 payloads
からデータを取れば良いことがわかりました。
※ ちなみに、これは一度 Stream Analytics 経由で Power BI に出力してデータ構造を確認しました。上記のほかにも、 destination
, operatorId
, PartionId
, timestamp
が出力されていたのですが、SORACOM のものなのか、それ以外のものなのかわからないため追って確認します。
SORACOM Funnel からのデータを出力するには?
上記のように、SORACOM Funnel から受け取ったデータは payloads
に含まれてることが分かったのですが、配列の形になっているので、そのままでは Stream Analytics から Azure Storage に出力することができません。
そこで、Stream Analytics のクエリを利用して、配列を展開してから出力することができます。
{"deviceId":"Sensor1","data":{"temp":"20"}}
SELECT
e.payloads.deviceId AS deviceId,
CAST(e.payloads.data.temp AS float) AS temp,
FROM
eventhubs AS e
INTO
tablestorage
この場合、入力を e
として扱い、 e.payloads.deviceId
や e.payloads.data.temp
というようにデータを読み取ります。また temp
は数値なので、 CAST( AS float)
で浮動小数点型に変換しました。
Epilogue - おわりに
詳しい手順は、本記事では書ききれなかったので、追って公開していく予定です。
また、 Azure ML の詳説は、 Microsoft MVP for Data Platform の @tottokug にご教示いただいて挑戦します!