« ジャパン・ビジット・プログラムは成功しているの? | トップページ | World Is Flat/フラット化する世界 »

2016.11.05

Azure IoT HubとESP8266を接続

Img_20161019_171013shadow


ESP8266をDeep Sleepモードで実行、通常モードでフル充電から一日ともたなかったモバイルバッテリーPanasonicのQE-QL20が、Deep Sleepモードでは、2日ももつようになりました。Deep Sleepモードで実行に成功しましたようです。

しかし、こまったこと、新たな課題も生まれました。Andoroid上のBlynkとESP8266が接続に失敗するのです。どうも、ESP8266はDeep Sleepモードに入るたびに、Wifiコネクションが切れているようです。そのため、Blynkサーバは、Blynkクライアンド(ESP8266)との接続が切断されたと認識してしまうようです。

これは、アーキテクチャーを変更したほうがよさそうです。デバイスの消費電力を下げるために、デバイスが常時ネットに接続されていることはあきらめる。そのかわり常時接続を期待しないアーキテクチャー、つまり、ESP8266(デバイス)とBlynkサーバ(クラウド)間の結合を密結合から疎結合に切り替えることにしました。

アイデアとして、デバイスとクラウドの間に、IoT Hub正確にはMessage QUEUEをおいてみてはどうなのでしょうか?よし、IoTではよく使われているMQTTを使いましょう。
デバイス(ESP8266)ークラウド(Blynkサーバ)ー可視化(スマートフォン(Bylnkアプリ))という連携から
デバイス(ESP8266)ークラウド(IoT-Hub on Azure)ークラウド(Blynkサーバ)ー可視化(スマートフォン(Bylnkアプリ))という連携への変更です。

このIoT Hubの役目をしてくれるクラウドにこれまで食わず嫌いだったAzureを当ててみることにしました。AzureにはIoTむけのPaaSサービスが充実しています。
2caf6e0bdac1b9550462dae490ed0217s_2


Azure IoT HubをESP8266で使おう!
このサイト内容を参考にし、Azure Iot HubにESP8266を接続してみることにしました。
まずは、自分用にIot Hub環境を構築しました。
Azureポータルを開き、
新規−>もののインターネットから、
・IoT Hubの名前を決め、
・価格とスケールティアを決め、
・サーバーリージョンを決め、
デプロイ開始です。
デプロイ終了後、
共有アクセスポリシー>iothubownerから、次の作業のために詳細情報を取得していきます。
・接続文字列(1)

次に、IoT Hub上に仮想デバイスを生成し、情報設定します。
osxの場合、CLI tool、iothub-explorerが活躍します・
このiothub-explorer,node.jsで開発されているため、node.jsの環境を整備する準備作業が必要でした。
$install homebrew
$brew install node
$nodebrew install latest
$node -v
$npm -v
$npm install -g npm
$npm install -g iothub-exploler
と呪文がつづき、

仮想デバイスを生成
$ iothub-explorer login "HostName=...."
Session started, expires Mon Oct 31 2016 23:16:32 GMT+0900 (JST)
$ iothub-explorer create HM-WROOM02-AZ

仮想デバイスとの接続文字列情報を取得
$iothub-explorer list --connection-string
--conenction-stringを設定し取得する接続文字列(2)が、ESP8266側のArduinoプログラムからAzure Iot Hubに接続するための文字列であることを理解するまで時間がかかりました。

当初、Iot Hubそのものへの接続文字列(1)と誤解をしてしまったのです。そのため、Arduino側で接続に失敗し、エラーログが表示され、接続に失敗していました。
Attempting MQTT connection...failed, rc=5 try again in 5 seconds
これ、認証エラーが原因でした。※OASIS標準MQTTプロトコルCONNACK(Acknowledge connection request)のReturn Valueで確認。

ESP8266側にMQTTクライアントとなるプログラムを書き、データを送信します。すると、Azure Iot Hub側にメッセージが蓄積されます。

Azure Iot Hubの役割はここまで。データを永続化させる必要があるけど、それは、Azure Stream Analiticsのお仕事でした。こちらは、直感が働き、入力ストリーム、出力巣ストリーム、クエリを設定し、実行させるだけ。
・入力ストリーム;Iot Hub上の仮想デバイス
・クエリ:SQLライクの構文でSelect *
・出力巣ストリーム:Blobテーブルを選択
 ※なので、Stream Analyticsの設定の前に、Blobテーブル上にコンテナの生成が必要でした。
 ※テーブル名に"-"は使えないようでした。シンタックスがわからんですね。

Blobの操作には、ポータルよりもCLIツールの方が便利でスムーズ。何が便利かというと、前後の処理との連携。
ポータル画面では、いちいちCOPYして、画面を変えて、ペーストしての行き来が面倒ですね。
Mac OS XのターミナルからWindows Azure Blobを操作する | Windows Maniax」のサイトから教えてもらいましたが、

azureコマンドcliを取得
$npm install -g azure-cli

azureコマンドでストレージ系操作をするための環境変数を設定し、
$ AZURE_STORAGE_ACCOUNT="hm…”;export AZURE_STORAGE_ACCOUNT
$ AZURE_STORAGE_ACCESS_KEY="BP4Y1Aiu…”;export AZURE_STORAGE_ACCESS_KEY


blobの情報を参照するならば、
$ azure storage blob show --container device01
info: Executing command storage blob show
Blob name: 0_aaca753964ea491890ea4754a7adde09_1.json
+ Getting storage blob information
data: Property Value
data: ------------- -----------------------------------------
data: container device01
data: name 0_aaca753964ea491890ea4754a7adde09_1.json
data: blobType BlockBlob
data: contentLength 32254
data: contentType application/octet-stream
data: contentMD5 undefined
info: storage blob show command OK

Blobの中身をダウンロードするならば、
$ azure storage blob download --container device01
info: Executing command storage blob download
Blob name: 0_aaca753964ea491890ea4754a7adde09_1.json
- Download blob 0_aaca753964ea491890ea4754a7adde09_1.json in container device01 to 0_aaca753964ea491890ea4754a7adde09_+.json
Percentage: 0.0% (0B/31.50KB) Average Speed: 0B/S Elapsed Time: 00:00:00
+ Getting storage blob information
info: File saved as 0_aaca753964ea491890ea4754a7adde09_1.json
info: storage blob download command OK

便利、便利。さて、これで、Blobまでデータが来ました。BlobにたまったデータをBlynkサーバーBlynkアプリまでもっていくのがもう一苦労。その先は、つづく。
ということで、今日は筆を置きます。

しかし、クラウドは、Azure は、IoTむけシステムの開発にとって便利。
プロセス間をイベントキューで疎結合させると、お互いの依存関係がうすくなり、
常時接続性など、相手に期待することも少なくなり、構築も、開発も、運用も楽そうです。
クラウドネイティブアプリ開発・利活用の夜明けか?
これがマイクロサービスというものか?


|

« ジャパン・ビジット・プログラムは成功しているの? | トップページ | World Is Flat/フラット化する世界 »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/3769/64447910

この記事へのトラックバック一覧です: Azure IoT HubとESP8266を接続:

« ジャパン・ビジット・プログラムは成功しているの? | トップページ | World Is Flat/フラット化する世界 »