Node-REDからIoT Hub Direct Method経由でAzure Sphere MT3620 Grove ShieldをGrove LED点灯させるメモです。
下調べ
まず、Direct Methodを選んだ理由としては、
Azure IoT Hub cloud-to-device オプション | Microsoft Docs
こちらに書いてあるように「すぐに確認する必要があるコマンド (例: ファンをオンにする)。」のような用途で操作したいためでした。
そして、Azure IoT Hub のエンドポイントについて | Microsoft Docs
のとおりで、IoT Hubの様々な機能にエンドポイントがあり、Direct Methodもエンドポイントを持っています。
ダイレクトメソッドのエンドポイントの詳細
詳細はこちらにあります。
Azure IoT Hub のデバイス メソッドについて | Microsoft Docs
Node-REDにつなげるために、一番参考にしたのはこちらのcurlの記述です。正直、素直に必要要素が分かりやすい。
2018/10/21時点で以下のようになっていました。
curl -X POST \ https://iothubname.azure-devices.net/twins/myfirstdevice/methods?api-version=2018-06-30 \ -H 'Authorization: SharedAccessSignature sr=iothubname.azure-devices.net&sig=x&se=x&skn=iothubowner' \ -H 'Content-Type: application/json' \ -d '{ "methodName": "reboot", "responseTimeoutInSeconds": 200, "payload": { "input1": "someInput", "input2": "anotherInput" } }'
こちらを参考にNode-REDでHTTPリクエストにします。
おおまかに
- メソッド
- POST
- 接続先の自分のIoT HubのURL
- iothubname.azure-devices.netのiothubname部分は自分のIoTHubのURLになるので確認しておく
- myfirstdeviceというところがデバイスIDになるのでIoT HubからIoT Deviceから控えておく
- Authorization部分のSharedAccessSignature以降
- 後述する手法でSASトークンを取得する
- methodNameやpayloadあたりのデータ
- これはNode-REDで使用に合わせて記述する
といった方針で動いていきます。
Azure Sphereの準備
Azure Sphereの準備はAzure Sphere MT3620 Grove ShieldでIoT Hub Direct Method でGrove LED点灯させるメモの内容を書き込んでおきます。
こちらの記事で、Azure Sphereの動作確認をしておくと良いでしょう。
Node-REDの準備
つづいて、Node-REDの準備です。
JSONデータはこちらです。
[{"id":"11893d81.7dc362","type":"inject","z":"161549be.7748b6","name":"off","topic":"","payload":"{\"methodName\":\"GroveONOFFControlMethod\",\"responseTimeoutInSeconds\":50,\"payload\":{\"status\":\"off\"}}","payloadType":"json","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":170,"y":480,"wires":[["e3faee2c.41c32"]]},{"id":"a90b32da.c8c7f","type":"http request","z":"161549be.7748b6","name":"http request (POST)","method":"POST","ret":"txt","url":"","tls":"","x":720,"y":480,"wires":[["fb91447e.b317c8"]]},{"id":"e3faee2c.41c32","type":"change","z":"161549be.7748b6","name":"headers.Authorization & URL設定","rules":[{"t":"set","p":"headers.Authorization","pt":"msg","to":"SharedAccessSignature sr=<sr>&sig=<sig>&se=1571573304&skn=<skn>","tot":"str"},{"t":"set","p":"url","pt":"msg","to":"https://<my-iothub-fullname>.azure-devices.net/twins/<device_id>/methods?api-version=2018-06-30","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":460,"y":480,"wires":[["a90b32da.c8c7f"]]},{"id":"fb91447e.b317c8","type":"debug","z":"161549be.7748b6","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":910,"y":480,"wires":[]},{"id":"40de0194.429a2","type":"inject","z":"161549be.7748b6","name":"on","topic":"","payload":"{\"methodName\":\"GroveONOFFControlMethod\",\"responseTimeoutInSeconds\":50,\"payload\":{\"status\":\"on\"}}","payloadType":"json","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":170,"y":540,"wires":[["e3faee2c.41c32"]]},{"id":"eccf17a7.96f978","type":"comment","z":"161549be.7748b6","name":"Azure IoT Hub - Device Method","info":"","x":230,"y":400,"wires":[]}]
インポートすると、このようなフローが出来上がります。
on / off のデータを作っているinjectノード
on / off のデータを作っているinjectノードはこちらです。
たとえば、onのほうの詳細です。
このように、Payloadの部分で、先ほどの -d で書かれたデータのところを作っています。
headers.AuthorizationとURL設定をしているchangeノード
headers.AuthorizationとURL設定をしているchangeノードの説明です。
詳細はこのようになっています。それぞれの項目を自分の動かしたいIoT Hubの設定に合わせていきます。
headers.AuthorizationのSASトークンを取得して入力
SharedAccessSignature sr=<sr>&sig=<sig>&se=1571573304&skn=<skn>
headers.Authorizationの設定は、
Azure IoT Hub セキュリティについて | Microsoft Docs
このあたりに書いてあることがわかりました。その中の「共有アクセス ポリシー」を使います。
(共有アクセス ポリシーだということに至るまでに、かなりの回り道をしましたがここでは割愛します!)
SASトークンについては先ほどのドキュメントにあるように
デバイス エクスプローラー ツール、CLI 拡張コマンド az iot hub generate-sas-token、または Visual Studio Code の Azure IoT Toolkit 拡張機能を使って、SAS トークンを生成できます。
と書いてありますが、私はデバイス エクスプローラー ツールで生成しました。
こちらの、Generate SASをつかって生成します。
クリックするとNode-REDの入力部分と同じようなデータが生成されるので、これをさきほどの
にペーストします。
URL設定の入力
つづいて、
こちらのURL設定の入力もします。
<my-iothub-fullname>.azure-devices.net
の <my-iothub-fullname>
については、
AzureのIoT HubのOverviewあたりのHostnameを参考にするとよいでしょう。
<device_id>
のデバイスIDについては
IoT HubのIoT Deviceを見に行って、
今回動かしたいデバイスを選びます。Azure Sphereが使っているSelf Signedのほうを今回は選びました。ここはAzure Sphereで使っているIoT Hubのデバイスを自分に合わせて適宜選びましょう。
詳細ページでDevice Idと書かれているところ使います。
こちらを入力して設定を確認します。
問題なければデプロイします。これで準備完了です!
動かしてみる
では、on / off のinjectノードを押して試してみましょう。
実際動かしたものがこちらです!うまく動いていますね!
さらに発展させてダッシュボードでUIもつけてみました。
これで、Azure Sphereの遠隔操作がかなりできるようになってきました!