Share via


MQTT プロトコルを使用した DPS との通信

Azure IoT Device Provisioning Service (DPS) を使用すると、デバイスは次を使用して DPS デバイス エンドポイントと通信できます。

DPS は完全な機能を備えた MQTT ブローカーではなく、MQTT v3.1.1 標準で指定されたすべての動作をサポートしているわけではありません。 この記事では、サポートされている MQTT 動作を使用して、デバイスと DPS の通信を行う方法について説明します。

DPS とのすべてのデバイス通信は、TLS/SSL を使用してセキュリティで保護する必要があります。 したがって、DPS では、ポート 1883 経由のセキュリティで保護されていない接続はサポートされていません。

Note

DPS では現在、MQTT プロトコル経由で TPM 構成証明メカニズムを使用しているデバイスをサポートしていません。

DPS の接続

デバイスでは、MQTT プロトコルを使用し、次のいずれかのオプションを利用して DPS インスタンスに接続できます。

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

デバイスでデバイス SDK を使用できない場合でも、MQTT プロトコルをポート 8883 で使用して、デバイスをパブリックのデバイス エンドポイントに接続できます。 CONNECT パケットの場合、デバイスでは次の値を使用する必要があります。

  • [ClientId] フィールドには、registrationId を使用します。

  • [Usename] フィールドには、 を使用します。ここで、{idScope} は DPS の {idScope}で、{registration_id} はデバイスの{registration_id} です。

    注意

    X.509 証明書認証を使用する場合、登録 ID はデバイス リーフ (エンド エンティティ) 証明書のサブジェクト共通名 (CN) によって提供されます。 {registration_id}{registration_id} は共通名と一致する必要があります。

  • [Password] フィールドには、SAS トークンを使用します。 SAS トークンの形式は、HTTPS プロトコルや AMQP プロトコルの場合と同じです。

    SharedAccessSignature sr={URL-encoded-resourceURI}&sig={signature-string}&se={expiry}&skn=registration ResourceURI は {idScope}/registrations/{registration_id} の形式にする必要があります。 ポリシー名 (skn) は、registration に設定する必要があります。

    Note

    X.509 証明書の認証を使用する場合は、SAS トークン パスワードは不要です。

    SAS トークンの生成方法について詳しくは、DPS へのアクセス制御に関するページにあるセキュリティ トークンのセクションをご覧ください。

次の一覧には、DPS 実装固有の動作が含まれています。

  • DPS では、永続的なセッションはサポートされていません。 CleanSession フラグの値に関係なく、すべてのセッションは非永続的として扱われます。 CleanSession を true に設定することをお勧めします。

  • デバイス アプリが QoS 2 を使用してトピックをサブスクライブしている場合、DPS は SUBACK パケットに最大の QoS レベル 1 を許可します。 その後、DPS は QoS 1 を使用してデバイスにメッセージを配信します。

TLS または SSL の構成

MQTT プロトコルを直接使用するには、クライアントは TLS 1.2 経由で接続する必要があります。 この手順をスキップすると、接続エラーで失敗します。

デバイスの登録

DPS 経由でデバイスを登録するには、デバイスで $dps/registrations/res/#$dps/registrations/res/#として使用してサブスクライブする必要があります。 トピック フィルター内の複数レベルのワイルドカード # は、デバイスがトピック名のその他のプロパティを受信できるようにするためにのみ使用されます。 DPS では、 または ? ワイルドカードを使用#してサブトピックをフィルター処理することはできません。 DPS は汎用の pub-sub メッセージング ブローカーではないので、ドキュメント化されたトピック名とトピック フィルターのみがサポートされます。

デバイスでは、$dps/registrations/PUT/iotdps-register/?$rid={request_id}$dps/registrations/PUT/iotdps-register/?$rid={request_id}として使用して、DPS に登録メッセージを発行する必要があります。 ペイロードには、JSON 形式のデバイス登録オブジェクトを含める必要があります。 成功したシナリオでは、デバイスはトピック名に対する応答を $dps/registrations/res/202/?$rid={request_id}&retry-after=x 受け取ります。ここで、x は再試行後の値 (秒単位) です。 応答のペイロードには、JSON 形式の RegistrationOperationStatus オブジェクトが含まれています。

登録操作の状態のポーリング

デバイス登録操作の結果を受け取るため、デバイスで定期的にサービスをポーリングする必要があります。 デバイスが既にトピックに $dps/registrations/res/# サブスクライブしていると仮定すると、get 操作の状態メッセージをトピック名に $dps/registrations/GET/iotdps-get-operationstatus/?$rid={request_id}&operationId={operationId} 発行できます。 このメッセージの操作 ID は、前の手順で RegistrationOperationStatus 応答メッセージで受信した値である必要があります。 成功した場合、サービスはトピックに対して $dps/registrations/res/200/?$rid={request_id} 応答します。 応答のペイロードには、RegistrationOperationStatus オブジェクトが含まれています。 retry-after 期間と同じ遅延の後に応答コードが 202 の場合、デバイスでサービスのポーリングを続行する必要があります。 サービスで状態コード 200 が返された場合は、デバイス登録操作は正常に実行されています。

Websocket 経由の接続

Websocket 経由で接続する場合は、mqtt としてサブプロトコルを指定します。 RFC 6455 に従います。

次のステップ

MQTT プロトコルについて詳しくは、MQTT のドキュメントをご覧ください。

サンプル MQTT コードを参照するには、 MQTT アプリケーションのサンプルに関するページを参照してください。

DPS の機能を詳しく調べるには、次のリンクを使用してください。