🗒️
MQTTでAzure IoT Hub直接通信(下調べ)
なごあずの集い#3で「Azure IoT Hubとの通信はMQTT直接通信がいいぞ」「Microsoft Learnの資料が分かりにくい」と言った手前、分かりやすい資料を用意できていなかったので作ろうと思う。の下調べ。
通信プロトコル
MQTTのバージョンはv3.3.1(制限付き)。
→開発と管理のための IoT Hub エンドポイント
→デバイス通信プロトコルを選択する
→IoT Hub と Event Grid での MQTT サポートの比較
接続
接続ポートは8883。
通信はTLSで保護しなければいけない。
- TLS 1.2
- TLS 1.1
- TLS 1.0
X.509認証のときは相互認証で接続する。
サーバー証明書検証は次のCA証明書を信頼しておく。
- Baltimore CyberTrust ルート CA
- DigiCert Global G2 ルート CA
- Microsoft RSA ルート CA 2017
→TLS または SSL の構成
→デバイスの通信
→IoT Hub でのトランスポート層セキュリティ (TLS) のサポート
「IoT Hub では、サーバー側の最大タイムアウトは 29.45 分 (1,767 秒) に制限されています。」
「設定できるクライアントのキープアライブの最大値は、1767 / 1.5 = 1177 秒です。」
同一デバイスに対するMQTT接続は同時に1つのみ。複数接続した場合は古い方が切断される。
認証
- クライアントID =
{device-id}
- ユーザー名 =
{iotHub-hostname}/{device-id}/?api-version=2021-04-12
- パスワード =
SharedAccessSignature sig={signature-string}&se={expiry}&sr={URL-encoded-resourceURI}
X.509認証のときはパスワードは不要。
テレメトリ
D2Cメッセージを送信
- トピック
devices/{device-id}/messages/events/
もしくはdevices/{device-id}/messages/events/{property-bag}
へ送信する。
ルーティング機能を使うときはコンテンツタイプとエンコードを指定が必要。
C2Dメッセージを受信
- トピック
devices/{device-id}/messages/devicebound/#
をサブスクライブしておく。 - C2Dメッセージが発生すると、トピック
devices/{device-id}/messages/devicebound/
もしくはdevices/{device-id}/messages/devicebound/{property-bag}
にメッセージが送られてくる。
プロパティ
デバイスツインを取得
- トピック
$iothub/twin/res/#
をサブスクライブしておく。 - トピック
$iothub/twin/GET/?$rid={request id}
へ送信する。 - トピック
$iothub/twin/res/{status}/?$rid={request-id}
にメッセージが送られてくる。
デバイスツインを更新
- トピック
$iothub/twin/res/#
をサブスクライブしておく。 - トピック
$iothub/twin/PATCH/properties/reported/?$rid={request-id}
へ送信する。 - トピック
$iothub/twin/res/{status}/?$rid={request-id}
にメッセージが送られてくる。
デバイスツインの更新通知受信
- トピック
$iothub/twin/PATCH/properties/desired/#
をサブスクライブしておく。 - デバイスツインが更新されると、トピック
$iothub/twin/PATCH/properties/desired/?$version={new-version}
にメッセージが送られてくる。
コマンド
ダイレクトメソッドの受信と応答
- トピック
$iothub/methods/POST/#
をサブスクライブしておく。 - ダイレクトメソッドが発生すると、トピック
$iothub/methods/POST/{method-name}/?$rid={request-id}
に要求が送られてくる - トピック
$iothub/methods/res/{status}/?$rid={request-id}
へ送信する。
Discussion