Azure IoT Hubが面白そうだったので試してみてたんだけど、Raspberry Piから使うには色々と制限が多くて自分がやりたいことがまだできる状況じゃなかった。せっかく調べたので調べた範囲でその制限をまとめておく。
とは言えIoT HubもIoT Hub用のSDKもまだプレビュー版なのでできないことが多いのは当たり前で、今後その制限もなくなっていくと思う。
IoT HubとSDKについては以下を参照。
Azure IoT Hub | Microsoft Azure
Azure/azure-iot-sdks
前提条件
上にも書いた通り網羅的に調べたわけではなく自分がやりたいことに関係する部分だけしか調べていないので、この記事での条件を挙げておく。
- 2015年11月3日時点での状況
- Raspberry Pi上の.NETのプログラムからIoT Hubを使うときの制限
IoT HubのSDKは.NET向け以外にもC、Java、Node.js向けのものが用意されているけど、今回は.NET向けだけが対象で他については分からない。
それとデバイスもRaspberry Piに限定してる。最初にIoT Hubのチュートリアル(Azure IoT Hub の使用 | Microsoft Azure)をWindows + C#で試した時は問題なく動いた。
制限
Raspbianでは.NETはサポートされていない
SDKが対応するハードウェア、プラットフォーム、言語の組み合わせが下に書いてある。
azure-iot-sdks/tested_configurations.md at master · Azure/azure-iot-sdks
これを見るとRaspberry PiとC#の組み合わせはRaspberry Pi 2 + Windows IoTしか対応していない。言い換えると、.NET向けSDKはWindows(デスクトップ)とWindows IoTにしかまだ対応してないので、それをインストールできるRaspberry Pi 2との組み合わせしか対応していない。なので、Raspberry Piの他のモデル(A+など)やRaspbianで.NET用のSDKを使いたくても使えないのが今の状況。
ただ、Monoサポートの計画はあるみたいなので、今後Raspbianでも使えるようになるかもしれない。
C# SDK with AMQP Transport under Mono fails to run · Issue #64 · Azure/azure-iot-sdks
Issueのページから機能の投票ページへのリンクがあるので、対応してほしい人はぜひ投票してください。
Windows IoT + C#ではAMQPプロトコルに対応していない
[2016/05/03 追記]
Microsoft Azure Devices Client 1.0.6でAMQPに対応した(Windows IoT(10.0.14295.1000) on Raspberry Pi 3で動作確認済み)。
正確にはもう少し前のバージョンでAMQPをサポートするようになっていたけれど、実行すると例外が発生していた。
1.0.6で問題が解決して使えるようになった。
上に載せたリンクの表を見ると、Windows IoT + C#ではHTTPSだけサポートしていると書いてある。
IoT HubではAMQPとHTTP(HTTPSって書いてないけどどっちもHTTPだからだと思う、たぶん)をサポートしているけど、可能な限りAMQPを使うように勧めている。
IoT Hub の開発者ガイド トピック - 通信プロトコルの選択 | Microsoft Azure
AMQPの利点の1つは、サーバープッシュに対応してるのでIoT Hubからデバイスへのメッセージがすぐに届くところ。
例えば、あるデバイスにつながっている人感センサーが反応したときに別のデバイスにつながっているライトを点灯させたいとする。AMQPを使うとセンサーが反応したときにIoT Hub経由で別のデバイスにメッセージをタイムラグなしで送ることができるので、センサーが反応したときにすぐにライトを点灯させることができる。対してHTTPでは多くても25分に1回(IoT Hubのガイドライン準拠)しかIoT Hubに届いているメッセージを確認できないので、応答するまでにタイムラグが発生して使い物にならない。
そういうわけでAMQPが使えないのは結構大きい制限。
ただこれもまだ実装されていないだけでサポートする計画はあるみたいだ。
UWP apps only HTTP support ? · Issue #79 · Azure/azure-iot-sdks
それと、リンク先に書いてあるようにHTTPにもメリットはあるので、AMQPとHTTP(と他のプロトコル)が選べる状況になるのが一番いい。
最後に
最初に書いた通り現時点での状況なので、今後何か進展があったら追記する予定。