Node-REDからIoT Hub Direct Method経由でAzure Sphere MT3620 Grove ShieldをGrove LED点灯させるメモ

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":[]}]

インポートすると、このようなフローが出来上がります。

image

on / off のデータを作っているinjectノード

image

on / off のデータを作っているinjectノードはこちらです。

image

たとえば、onのほうの詳細です。

image

このように、Payloadの部分で、先ほどの -d で書かれたデータのところを作っています。

headers.AuthorizationとURL設定をしているchangeノード

image

headers.AuthorizationとURL設定をしているchangeノードの説明です。

image

詳細はこのようになっています。それぞれの項目を自分の動かしたい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 トークンを生成できます。

と書いてありますが、私はデバイス エクスプローラー ツールで生成しました。

image

こちらの、Generate SASをつかって生成します。

image

クリックするとNode-REDの入力部分と同じようなデータが生成されるので、これをさきほどの

image

にペーストします。

URL設定の入力

つづいて、

image

こちらのURL設定の入力もします。

<my-iothub-fullname>.azure-devices.net<my-iothub-fullname> については、

image

AzureのIoT HubのOverviewあたりのHostnameを参考にするとよいでしょう。

<device_id> のデバイスIDについては

image

IoT HubのIoT Deviceを見に行って、

image

今回動かしたいデバイスを選びます。Azure Sphereが使っているSelf Signedのほうを今回は選びました。ここはAzure Sphereで使っているIoT Hubのデバイスを自分に合わせて適宜選びましょう。

image

詳細ページでDevice Idと書かれているところ使います。

image

こちらを入力して設定を確認します。

image

問題なければデプロイします。これで準備完了です!

動かしてみる

image

では、on / off のinjectノードを押して試してみましょう。

実際動かしたものがこちらです!うまく動いていますね!

さらに発展させてダッシュボードでUIもつけてみました。

これで、Azure Sphereの遠隔操作がかなりできるようになってきました!