🗒️

MQTTでAzure IoT Hub直接通信(下調べ)

2024/12/19に公開

なごあずの集い#3で「Azure IoT Hubとの通信はMQTT直接通信がいいぞ」「Microsoft Learnの資料が分かりにくい」と言った手前、分かりやすい資料を用意できていなかったので作ろうと思う。の下調べ。

通信プロトコル

MQTTのバージョンはv3.3.1(制限付き)。

開発と管理のための IoT Hub エンドポイント
デバイス通信プロトコルを選択する
IoT Hub と Event Grid での MQTT サポートの比較

接続

接続ポートは8883

MQTT プロトコルの直接使用 (デバイスとして)

通信は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認証のときはパスワードは不要。

MQTT プロトコルの直接使用 (デバイスとして)

テレメトリ

D2Cメッセージを送信

  1. トピックdevices/{device-id}/messages/events/もしくはdevices/{device-id}/messages/events/{property-bag}へ送信する。

ルーティング機能を使うときはコンテンツタイプとエンコードを指定が必要。

デバイスからクラウドへのメッセージの送信

C2Dメッセージを受信

  1. トピックdevices/{device-id}/messages/devicebound/#をサブスクライブしておく。
  2. C2Dメッセージが発生すると、トピックdevices/{device-id}/messages/devicebound/もしくはdevices/{device-id}/messages/devicebound/{property-bag}にメッセージが送られてくる。

クラウドからデバイスへのメッセージの受信

プロパティ

デバイスツインを取得

  1. トピック$iothub/twin/res/#をサブスクライブしておく。
  2. トピック$iothub/twin/GET/?$rid={request id}へ送信する。
  3. トピック$iothub/twin/res/{status}/?$rid={request-id}にメッセージが送られてくる。

デバイス ツインのプロパティの取得

デバイスツインを更新

  1. トピック$iothub/twin/res/#をサブスクライブしておく。
  2. トピック$iothub/twin/PATCH/properties/reported/?$rid={request-id}へ送信する。
  3. トピック$iothub/twin/res/{status}/?$rid={request-id}にメッセージが送られてくる。

デバイス ツインの報告されるプロパティの更新

デバイスツインの更新通知受信

  1. トピック$iothub/twin/PATCH/properties/desired/#をサブスクライブしておく。
  2. デバイスツインが更新されると、トピック$iothub/twin/PATCH/properties/desired/?$version={new-version}にメッセージが送られてくる。

必要なプロパティの更新通知の受信

コマンド

ダイレクトメソッドの受信と応答

  1. トピック$iothub/methods/POST/#をサブスクライブしておく。
  2. ダイレクトメソッドが発生すると、トピック$iothub/methods/POST/{method-name}/?$rid={request-id}に要求が送られてくる
  3. トピック$iothub/methods/res/{status}/?$rid={request-id}へ送信する。

ダイレクト メソッドへの応答

メモ

device-to-cloud 通信に関するガイダンス
cloud-to-device 通信に関するガイダンス

Discussion