2017年3月8日水曜日

RaspberryPi で Azure IoT Hub を使ってみた

概要

RaspberryPi で Azure IoT Hub を使ってみました
Azure のサインアップ ( Microsoft アカウントの取得 ) は事前に済ませておいてください

環境

  • Raspberry Pi Type B Single Board Computer 512MB
  • Raspberry Pi Camera Module Rev1.3
  • Raspbian 8.0 (Jessie)
  • Kernel Version 4.1.7+ #817
  • Azure Portal 20160419 時点

Azureポータルへのログイン

サインアップしたアカウントでポータルにログインしましょう

https://portal.azure.com/

無事ログインできてダッシュボードが表示されれば OK です

サービスを作成する

IoT Hub を作成します

新規 -> モノのインターネット (IoT) -> Azure IoT Hub

を選択します
azure_select_service.png

すると「Azure サブスクリプションの取得」にサインアップする必要がある旨が表示されると思うので素直にサインアップします
azure_regist_subscription.png

無料試用版のサブスクリプションの取得を行う

今回は無料試用版を選択します
azure_choice_free_plan.png

個人情報は入力する必要があるので入力しサインアップを選択します
azure_input_userinfo.png

本人確認が必要になります
自分は電話番号を使って SMS 認証を行いました
また、カードの登録も必要になります
今回の IoT Hub は無料枠で収まる範囲で使えますが、他のサービスは作った瞬間課金されるものもあるのでカードの登録が必須になります

※IoT Hub 使いたいだけなのでこの段階でやる気がなくなりそうです

登録が完了するとアクティベーションがかかるのでちょっと待ちます
azure_activation.png

アクティベーションが終了すればサブスクリプション登録は完了です
再度ダッシュボードに戻って Azure IoT Hub の作成を行います

と思ったが

どうやら無料試用版だとダメみたいで従量課金のサブスクリプションに契約しないとダメなようです

※公式には無料試用版でいけるとあったんですが自分はなぜかダメでした
無料試用版のサブスクリプションが有効になっていなかっただけでしょうか
無料試用版を契約したと少し時間をおいてからダッシュボードにアクセスしたほうがいいかもしれません
以下はせっかちな人だけが登録すれば OK です

再度サービスを作ろうとしてもまた、サインアップの画面に飛ばされるのでそこで従量課金のサブスクリプションを購入してください
一応、従量課金のサブスクリプションを購入した段階で課金が発生するか確認したのですが、それはないようです
マイアカウントに行って課金状況を確認しましたがサブスクリプションを購入しただけでは 0 円でした
ややこしいので「購入」という表現をやめてほしいです
azure_confirm_subscription.png

今回は従量課金のサブスクリプションを購入しても、IoT Hub は無料枠の範囲 (8,000msg 以内, 最大メッセージサイズ 0.5 KB) で使う予定だったので問題はないですが、従量課金のサブスクリプションを購入していると「いつの間にか」ということもあるので、、、

(ようやく)サービスの作成をする

いろいろありましたが、これでようやく IoT Hub が作成できます
IoT Hub の作成画面で Hub を作成します
とりあえず以下のような感じで入力しました
azure_create_hub.png

名前は適当に入力して OK です
価格とスケールティアは「F1 Free」を選択しましょう
IoT Hub ユニットと Device-to-cloud パーティションはサブスクリプションを無料試用版にすると自動で 1, 2 となります
リソースグループは新規作成で好きな名前を入力してください

問題なければ「作成」ボタンをクリックします
するとダッシュボードに戻ってデプロイが開始されます
デプロイが完了するまで待ちましょう

デプロイ完了後にすべてのリソースを確認すると IoT Hub が作成されていると思います
azure_created_hub.png

デバイス ID を生成する (デバイスを登録する)

ここからは RaspberryPi 上での作業になります
RaspberryPi の電源を ON にしてインターネットに接続できる状態にしてください

で、まずはデバイス ID なるものを生成します
デバイス ID を生成するために iothub-explorer をインストールします

  • sudo npm install -g iothub-explorer@latest

これを使ってコマンドラインから Azure にログインします
ログインには認証文字列が必要でこれが Azure ポータルで取得できます
先ほどすべてのリソースで確認した IoT Hub のページから辿ります

rpi-hub (ここは作成した IoT Hub 名) -> 共有アクセスポリシー -> iothubowner -> 接続文字列—プライマリキー

をコピペして持ってきます
azure_get_access_string.png

そしたらその「接続文字列—プライマリキー」を使って以下のコマンドを発行します

  • iothub-explorer "HostName=rpi-hub.azure-devices.net;SharedAccessKeyName=iothubowner;SharedAccessKey=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" create raspberrypi --connection-string

すると以下のようにデバイスが登録された旨が表示されます

- 
  deviceId:                   raspberrypi
  generationId:               635966494155048235
  etag:                       MA==
  connectionState:            Disconnected
  status:                     enabled
  statusReason:               null
  connectionStateUpdatedTime: 0001-01-01T00:00:00
  statusUpdatedTime:          0001-01-01T00:00:00
  lastActivityTime:           0001-01-01T00:00:00
  cloudToDeviceMessageCount:  0
  authentication: 
    SymmetricKey: 
      secondaryKey: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
      primaryKey:   xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
- 
  connectionString: HostName=rpi-hub.azure-devices.net;DeviceId=raspberrypi;SharedAccessKey=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

ここで取得できた最後の「connectionString」は使うのでどこかにメモしておいてください

この状況で一旦、作成した IoT Hub を見てみるとデバイス数がカウントされていることがわかると思います
azure_check_device_counts.png

サンプルの Node スクリプトを作成する

さて、デバイスを登録できたので実際にデータを IoT Hub に送信してみます

  • git clone https://github.com/Azure/azure-iot-sdks.git
  • cd azure-iot-sdks/node/device/samples
  • vim simple_sample_device.js

16 行目を以下のように書き換えます

var connectionString = ‘[IoT device connection string]’;

var connectionString = ‘HostName=rpi-hub.azure-devices.net;DeviceId=raspberrypi;SharedAccessKey=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx’;

書き換えたら実行してみましょう

動作確認

  • sudo npm install
  • node simple_sample_device.js

とすると 1 秒おきにサンプルの情報を IoT Hub に送信し始めます

Client connected
Sending message: {“deviceId”:”myFirstDevice”,”windSpeed”:11.82843124307692}
send status: MessageEnqueued
Sending message: {“deviceId”:”myFirstDevice”,”windSpeed”:13.104170331731439}
send status: MessageEnqueued

この状態で IoT Hub を確認するとメッセージ数が上昇していることが確認できると思います
azure_check_msg_counts.png

最後に

デバイスから送信したデータが IoT Hub に登録されるところまで試してみました

サインアップには正直参りました
こんなに面倒だとは思いませんでした
まぁ元々商用サービスなので仕方ないと言えば仕方ないですが、、、

あとハマリそうなポイントはデバイス ID の作成 (登録) 部分でしょうか
わかれば大したことはないですが、そもそもデバイス ID を生成(登録)しなければいけないということを知るすべが少ない気がします
公式ドキュメントには書いてはいますが、中々に見つけづらいかったです
そしてそこでデバイス用に生成された認証文字列を使わないとデバイスからのデータが登録できない点も注意が必要です

今回は主に公式のドキュメントを元に進めていきましたが、日本語からいきなり英語になったり、ドキュメントにあるファイルが Github 側にはなかったりとドキュメントの精度が微妙だなという印象を受けました

参考サイト

0 件のコメント:

コメントを投稿