次の方法で共有


IoT Hub の MQTT 5 のサポート (非推奨)

バージョン: 2.0 API バージョン: 2020-10-01-preview

このドキュメントでは、MQTT バージョン 5.0 プロトコルに対する IoT Hub のデータ プレーン API について定義します。 この API の完全な定義については、API リファレンスを参照してください。

IoT Hub の MQTT 5 のサポートは非推奨となり、IoT Hub では MQTT の機能サポートが制限されます。 ソリューションに MQTT v3.1.1 または v5 のサポートが必要な場合は、Azure Event Grid での MQTT サポートをお勧めします。 詳細については、IoT Hub と Event Grid での MQTT サポートの比較に関するページを参照してください。

[前提条件]

  • プレビュー モードが有効になっている新しい IoT ハブを作成します。 MQTT 5 はプレビュー モードでのみ使用でき、既存の IoT ハブをプレビュー モードに切り替えることはできません。 詳細については、「プレビューモードを有効にする」を参照してください
  • MQTT 5 の仕様に関して事前の知識。

サポートと制限のレベル

IoT Hub による MQTT 5 のサポートはプレビュー段階であり、次のように制限されています (特に明記されていない限り、CONNACK のプロパティを使用してクライアントに通知されます)。

  • 公式 の Azure IoT デバイス SDK はまだ サポートされていません。
  • サブスクリプション ID はサポートされていません。
  • 共有サブスクリプションはサポートされていません。
  • RETAIN はサポートされていません。
  • Maximum QoS1です。
  • Maximum Packet Size256 KiB です (操作ごとにさらに制限されます)。
  • 割り当てられたクライアント ID はサポートされていません。
  • Keep Alive19 min に制限されます (liveness 検査の最大遅延 – 28.5 min)。
  • Topic Alias Maximum10です。
  • Response Information はサポートされていません。CONNACKResponse Information プロパティが含まれている場合でも、CONNECT から Request Response Information プロパティは返されません。
  • Receive Maximum (PUBLISH で許可される未処理で未確認の QoS: 1 パケット (クライアントからサーバーの方向) の最大数) は 16 です。
  • 1 つのクライアントが持つことのできるサブスクリプションの数は 50 以下です。 クライアントがサブスクリプションの制限に達した場合、 SUBACK はサブスクリプションの 0x97 (クォータ超過) 理由コードを返します。

接続のライフサイクル

接続

この API を使用して IoT Hub にクライアントを接続するには、MQTT 5 の仕様に従って接続を確立します。 クライアントは、TLS ハンドシェイクが成功してから 30 秒以内に CONNECT パケットを送信する必要があります。そうしないと、サーバーによって接続が閉じられます。 CONNECT パケットの例を次に示します。

-> CONNECT
    Protocol_Version: 5
    Clean_Start: 0
    Client_Id: D1
    Authentication_Method: SAS
    Authentication_Data: {SAS bytes}
    api-version: 2020-10-10
    host: abc.azure-devices.net
    sas-at: 1600987795320
    sas-expiry: 1600987195320
    client-agent: artisan;Linux
  • Authentication Method プロパティは必須であり、使用される認証方法を示します。 認証方法の詳細については、「認証」を参照してください。
  • Authentication Data プロパティの処理は、Authentication Method によって異なります。 Authentication MethodSAS に設定されている場合は、Authentication Data が必要であり、それに有効な署名が含まれている必要があります。 認証データの詳細については、「認証」を参照してください。
  • api-version プロパティは必須であり、この仕様を適用するには、この仕様のヘッダーで提供される API バージョンの値に設定されている必要があります。
  • host プロパティは、テナントのホスト名を定義するために使用されます。 TLSハンドシェイク中にClient HelloレコードでSNI拡張機能が提示されない限り、これは必須です。
  • sas-at は、接続の日時を定義するために使用されます。
  • sas-expiry は、提供された SAS の有効期限を定義するために使用されます。
  • client-agent は、必要に応じて、接続を作成するクライアントに関する情報を伝えるために使用されます。

仕様全体を通じて、Authentication Method および名前が大文字になっている他のプロパティは、MQTT 5 のファースト クラス プロパティです。詳細については、MQTT 5 の仕様で説明されています。 api-version およびダッシュケースの他のプロパティは、IoT Hub API に固有のユーザーのプロパティです。

IoT Hub は、認証と、接続をサポートするためのデータのフェッチが完了すると、CONNACK パケットで応答します。 接続が正常に確立された場合、CONNACK は次のようになります。

<- CONNACK
    Session_Present: 1
    Reason_Code: 0x00
    Session_Expiry_Interval: 0xFFFFFFFF # included only if CONNECT specified value less than 0xFFFFFFFF and more than 0x00
    Receive_Maximum: 16
    Maximum_QoS: 1
    Retain_Available: 0
    Maximum_Packet_Size: 262144
    Topic_Alias_Maximum: 10
    Subscription_Identifiers_Available: 0
    Shared_Subscriptions_Available: 0
    Server_Keep_Alive: 1140 # included only if client did not specify Keep Alive or if it specified a bigger value

これらの CONNACK パケットのプロパティは、MQTT 5 の仕様に従っています。 それらは、IoT Hub の機能を反映しています。

認証

Authentication Method クライアントの CONNECT プロパティで、この接続に使用する認証の種類が定義されています。

  • SAS - Shared Access Signature が CONNECTAuthentication Data プロパティで提供されます。
  • X509 - クライアントは、クライアント証明書認証を利用します。

認証方法が IoT Hub で構成されているクライアントの方法と一致しない場合、認証は失敗します。

この API では、Authentication Method パケットで CONNECT プロパティを設定する必要があります。 Authentication Method プロパティが指定されていない場合、接続は Bad Request 応答で失敗します。

以前の API バージョンで使用されていたユーザー名とパスワードによる認証はサポートされていません。

SAS

SAS ベースの認証の場合、クライアントは接続コンテキストの署名を提供する必要があります。 この署名により、MQTT 接続の信頼性が証明されます。 署名は、IoT Hub のクライアント構成の 2 つの認証キーのうちのいずれかに基づいている必要があります。 または、共有アクセス ポリシーの 2 つの共有アクセス キーのいずれかに基づいている必要があります。

署名する文字列は、次のように構成されている必要があります。

{host name}\n
{Client Id}\n
{sas-policy}\n
{sas-at}\n
{sas-expiry}\n
  • host name は、SNI 拡張機能 (TLS ハンドシェイクの間にクライアントによって Client Hello レコードで提示されます) または host パケットの CONNECT ユーザー プロパティから派生します。
  • Client Id は、CONNECT パケット内のクライアント識別子です。
  • sas-policy - 存在する場合は、認証に使用される IoT Hub アクセス ポリシーが定義されています。 CONNECT パケットではユーザー プロパティとしてエンコードされます。 省略可能: 省略すると、デバイス レジストリの認証設定が代わりに使用されることを意味します。
  • sas-at - 存在する場合は、接続の日時 (現在の日時) が指定されます。 time パケットでは CONNECT 型のユーザー プロパティとしてエンコードされます。
  • sas-expiry は、認証の有効期限を定義するために使用されます。 CONNECT パケットにおけるtime 型のユーザー プロパティです。 このプロパティが必要です。

省略可能なパラメーターを省略する場合は、署名する文字列の代わりに空の文字列を使用する必要があります。

デバイスの対称キーのいずれかに基づいて文字列をハッシュするには、HMAC-SHA256 が使用されます。 その後、ハッシュ値は Authentication Data プロパティの値として設定されます。

X509

Authentication Method プロパティが X509 に設定されている場合、IoT Hub により、指定されたクライアント証明書に基づいて接続の認証が行われます。

再認証

SAS ベースの認証が使用されている場合は、有効期間の短い認証トークンを使用することをお勧めします。 接続の認証を維持し、有効期限切れによる切断を防ぐには、クライアントから AUTH (再認証) を指定した Reason Code: 0x19 パケットを送信することで再認証を行う必要があります。

-> AUTH
    Reason_Code: 0x19
    Authentication_Method: SAS
    Authentication_Data: {SAS bytes}
    sas-at: {current time}
    sas-expiry: {SAS expiry time}

ルール:

  • Authentication Method は、初期認証に使用されたものと同じである必要があります
  • 接続がもともと共有アクセス ポリシーに基づく SAS を使用して認証されていた場合、再認証で使用される署名は、同じポリシーに基づいている必要があります。

再認証が成功した場合、IoT Hub によって AUTH (成功) を含む Reason Code: 0x00 パケットが送信されます。 それ以外の場合、IoT Hub により DISCONNECT (非承認) を含む Reason Code: 0x87 パケットが送信されて、接続は閉じられます。

切断

サーバーは、以下を含むいくつかの理由でクライアントを切断する場合があります:

  • クライアントが否定応答(または受信確認)を直接行うことができない方法で不適切な動作をしている場合、
  • サーバーが接続の状態を最新の状態に保つことができない、
  • 別のクライアントが同じ ID で接続しています。

サーバーは、MQTT 5.0 の仕様で定義されている任意の理由コードで切断する場合があります。 留意事項:

  • 135 (未承認) 再認証が失敗した、現在の SAS トークンの有効期限が切れた、またはデバイスの資格情報が変更されたとき。
  • 142 (セッション引き継ぎ) 同じクライアント ID を使用して新しい接続が開かれたとき。
  • 159 (接続率超過) IoT Hub の接続率がしきい値を超えたとき。
  • 131 (実装固有のエラー) は、この API で定義されているカスタム エラーに使用されます。 切断の原因に関する詳細情報を伝えるには、status および reason プロパティが使用されます (詳細については「応答」を参照)。

オペレーション

この API のすべての機能は、操作として表されます。 テレメトリ送信操作の例を次に示します。

-> PUBLISH
    QoS: 1
    Packet_Id: 3
    Topic: $iothub/telemetry
    Payload: Hello

<- PUBACK
    Packet_Id: 3
    Reason_Code: 0

この API での操作の完全な仕様については、「IoT Hub データ プレーン MQTT 5 API リファレンス」を参照してください。

この仕様のすべてのサンプルは、クライアントの観点から示されています。 -> という記号はクライアントがパケットを送信することを意味し、<- は受信することを意味します。

メッセージのトピックとサブスクリプション

この API の操作のメッセージで使用されるトピックは、$iothub/ で始まります。 MQTT ブローカーのセマンティクスは、これらの操作には適用されません (詳細については、「Topics beginning with $ ($ で始まるトピック)」を参照してください)。 この API で定義されていない $iothub/ で始まるトピックは、サポートされていません。

  • 未定義のトピックにメッセージを送信すると、Not Found 応答が返されます (詳細については「応答」を参照)。
  • 未定義のトピックをサブスクライブすると、SUBACK (トピック フィルター無効) を含む Reason Code: 0x8F になります。

トピック名とプロパティ名は大文字と小文字が区別され、完全に一致している必要があります。 たとえば、$iothub/telemetry/ はサポートされませんが、$iothub/telemetry はサポートされます。

$iothub/.. の下のサブスクリプションでのワイルドカードはサポートされていません。 つまり、クライアントで $iothub/+ または $iothub/# をサブスクライブすることはできません。 それを実行しようとすると、SUBACK (ワイルドカード サブスクリプションは非サポート) を含む Reason Code: 0xA2 になります。 操作に対するトピック名でのパス パラメーターの代わりの単一セグメント ワイルドカード (+) のみがサポートされます。

やり取りの種類

この API のすべての操作は、次の 2 種類のやり取りのいずれかに基づいています。

  • オプションの受信確認を含むメッセージ (MessageAck)
  • 要求 - 応答 (ReqRep)

操作は、方向によっても異なります (初期メッセージ交換での方向によって決まります)。

  • クライアントからサーバーへ (c2s)
  • サーバーからクライアントへ (s2c)

たとえば、テレメトリの送信は "受信確認を含むメッセージ" の種類のクライアントからサーバーへの操作であり、ダイレクト メソッドの処理は要求 - 応答の種類のサーバーからクライアントへの操作です。

メッセージ受信確認のやり取り

オプションの受信確認を含むメッセージ (MessageAck) のやり取りは、MQTT での PUBLISHPUBACK パケットの交換として表されます。 受信確認はオプションであり、送信側は PUBLISH を含む QoS: 0 パケットを送信することによって、それを要求しないことを選択できます。

クライアントによって宣言された Maximum Packet Size のために PUBACK パケット内のプロパティを切り捨てる必要がある場合、IoT Hub は、与えられた制限内に収まる範囲で可能な限り多くのユーザー プロパティを保持します。 リストの最初にあるユーザー プロパティの方が、後にあるものより、送信される可能性が高くなります。Reason String プロパティは最も低い優先順位です。

MessageAck の簡単なやり取りの例

メッセージ:

PUBLISH
    QoS: 1
    Packet_Id: 34
    Topic: $iothub/{request.path}
    Payload: <any>

確認応答 (成功):

PUBACK
    Packet_Id: 34
    Reason_Code: 0

要求 - 応答のやり取り

要求 - 応答 (ReqRep) のやり取りでは、要求と応答の両方が PUBLISHQoS: 0 パケットに変換されます。

Correlation Data プロパティを両方で設定する必要があり、要求パケットと応答パケットを一致させるためにそれが使用されます。

この API では、すべての ReqRep 操作に対して 1 つの応答トピック $iothub/responses が使用されます。 クライアントからサーバーへの操作の場合、このトピックのサブスクライブまたはサブスクライブ解除は必要はありません。すべてのクライアントをサブスクライブすることがサーバーにより想定されます。

ReqRep の簡単なやり取りの例

依頼:

PUBLISH
    QoS: 0
    Topic: $iothub/{request.path}
    Correlation_Data: 0x01 0xFA
    Payload: ...

応答 (成功):

PUBLISH
    QoS: 0
    Topic: $iothub/responses
    Correlation_Data: 0x01 0xFA
    Payload: ...

ReqRep のやり取りで、要求または応答メッセージとして PUBLISH を含む QoS: 1 パケットはサポートされません。 要求 PUBLISH を送信すると、Bad Request の応答になります。

Correlation Data プロパティでサポートされる最大長は 16 バイトです。 Correlation Data パケットの PUBLISH プロパティに 16 バイトより長い値が設定されている場合、IoT Hub により結果として DISCONNECT を含む Bad Request が送信され、接続が閉じられます。 この動作は、この API 内で交換されるパケットにのみ適用されます。

Correlation Data は任意のバイト シーケンスです。たとえば、UTF-8 文字列であることは保証されません。

ReqRep の場合、応答には定義済みのトピックが使用されます。要求の PUBLISH パケットの応答トピック プロパティは無視されます (送信側によって設定されている場合)。

クライアントは、IoT Hub により自動的に、クライアントからサーバーへのすべての ReqRep 操作に対する応答トピックにサブスクライブされます。 クライアントが応答トピックから明示的にサブスクライブを解除した場合でも、IoT Hub により自動的にサブスクリプションに復帰されます。 サーバーからクライアントへの ReqRep のやり取りの場合でも、デバイスをサブスクライブする必要があります。

メッセージ プロパティ

操作のプロパティ (システムまたはユーザー定義) は、MQTT 5 ではパケット プロパティとして表されます。

ユーザー プロパティ名は大文字と小文字が区別され、定義されているとおりのスペルである必要があります。 たとえば、Trace-ID はサポートされませんが、trace-id はサポートされます。

仕様外でプレフィックス @ が付いていないユーザー プロパティが含まれる要求は、エラーになります。

システム プロパティは、ファースト クラス プロパティ (Content Type など) またはユーザー プロパティとしてエンコードされます。 仕様には、サポートされているシステム プロパティの完全な一覧が用意されています。 サポートされることが仕様に明記されていない限り、ファースト クラス プロパティはすべて無視されます。

ユーザー定義プロパティが許可される場合、その名前は @{property name} の形式に従う必要があります。 ユーザー定義プロパティでは、有効な UTF-8 の文字列値のみがサポートされます。 たとえば、値が MyProperty1 である 15 プロパティは、名前が @MyProperty で値が 15 のユーザー プロパティとしてエンコードされる必要があります。

IoT Hub によりユーザー プロパティが認識されない場合は、エラーと見なされ、IoT Hub の応答は PUBACK (実装固有エラー) と Reason Code: 0x83 (不正要求) が含まれる status: 0100 になります。 受信確認が要求されなかった場合 (QoS: 0)、同じエラーの DISCONNECT パケットが返送され、接続が終了します。

string 以外に、次のデータ型がこの API で定義されています。

  • time: 1970-01-01T00:00:00.000Z からのミリ秒数。 たとえば、1600987195320 の場合は 2020-09-24T22:39:55.320Z になります。
  • u32: 32 ビットの符号なし整数。
  • u64: 64 ビットの符号なし整数。
  • i32: 32 ビットの符号付き整数。

[応答]

やり取りは、SuccessBad RequestNot Found、その他のさまざまな結果になる場合があります。 結果は、status ユーザー プロパティによって相互に区別されます。 可能な場合、Reason Code パケットの PUBACK の意味は (MessageAck のやり取りの場合)、status と一致します。

クライアントにより CONNECT パケットで Request Problem Information: 0 が指定された場合、PUBACK プロパティも含め、MQTT 5 の仕様に準拠するために、status パケットでユーザー プロパティは送信されません。 この場合でも、クライアントは Reason Code を利用して、受信確認が肯定か否定かを判断できます。

すべてのやり取りには既定値 (または成功) があります。 Reason Code0 で、status プロパティは "設定されていない" です。 それ以外の場合:

  • MessageAck のやり取りの場合、PUBACK は 0x0 (成功) 以外の Reason Code を取得します。 結果をさらに明確にするため、status プロパティが存在する場合があります。
  • ReqRep のやり取りの場合、応答 PUBLISHstatus プロパティ セットを取得します。
  • QoS: 0 を使用して直接 MessageAck のやり取りに応答する方法はないため、応答情報を含む DISCONNECT パケットが代わりに送信された後、切断されます。

例:

不正な要求(MessageAck)

PUBACK
    Reason_Code: 131
    status: 0100
    reason: Unknown property `test`

未承認 (MessageAck):

PUBACK
    Reason_Code: 135
    status: 0101

未承認 (ReqRep):

PUBLISH
    QoS: 0
    Topic: $iothub/responses
    Correlation_Data: ...
    status: 0101

必要に応じて、IoT Hub により次のユーザー プロパティが設定されます。

  • status - 操作の状態に関する IoT Hub の拡張コード。 このコードは、結果を区別するために使用できます。
  • trace-id – 操作のトレース ID。内部調査に使用できる操作に関する追加の診断情報が、IoT Hub によって保持される場合があります。
  • reason - status プロパティによって示される状態で操作が終了した理由に関する詳細情報を提供する、人間が判読できるメッセージ。

クライアントにより CONNECT パケットの Maximum Packet Size プロパティが非常に小さい値に設定されている場合、すべてのユーザー プロパティがパケットに収まらず、含まれないものが出る可能性があります。

reason は人のみを対象としており、クライアント ロジックでは使用できません。 この API を使用すると、警告やバージョンの変更なしで、いつでもメッセージを変更できます。

クライアントによって CONNECT パケットで RequestProblemInformation: 0 が送信された場合は、MQTT 5 の仕様に従い、ユーザー プロパティは受信確認に含まれません。

状態コード

status プロパティにより、操作の状態コードが伝達されます。 それは、コンピューターによる読み取りが効率よく行われるように最適化されています。 0501 のような文字列で 16 進数としてエンコードされる 2 バイトの符号なし整数で構成されます。 コードの構造 (ビット マップ):

7 6 5 4 3 2 1 0 | 7 6 5 4 3 2 1 0
0 0 0 0 0 R T T | C C C C C C C C

1 バイト目はフラグに使用されます。

  • ビット 0 と 1 は、結果の種類を示します。
    • 00 - 成功
    • 01 - クライアント エラー
    • 10 - サーバー エラー
  • ビット 2: 1 は、エラーが再試行可能であることを示します
  • ビット 3 から 7 は予約されているため、0 に設定する必要があります

2 バイト目には、実際の個別の応答コードが含まれています。 フラグが異なるエラー コードで、2 バイト目の値が同じになる場合があります。 たとえば、0001010102010301 の各エラー コードは意味が異なる場合があります。

たとえば、Too Many Requests はクライアントの再試行可能なエラーで、独自のコードは 1 です。 その値は、0000 0101 0000 0001 または 0x0501 です。

クライアントは、種類ビットを使用して、操作が正常に終了したかどうかを識別できます。 また、クライアントは再試行可能ビットを使用して、操作を再試行する必要があるかどうかを判断することもできます。

推奨事項

セッションの管理

CONNACK パケットの Session Present プロパティにより、以前に作成されたセッションがサーバーによって復元されたかどうかが示されます。 このプロパティを使用して、トピックをサブスクライブするか、またはサブスクリプションは既に行われているのでサブスクライブをスキップするかを判断します。

Session Present を利用するには、クライアントは行ったサブスクリプション (つまり、送信された SUBSCRIBE パケットと、正常な理由コードを含む SUBACK を受信したもの) を追跡する必要があります。または、1 つの SUBSCRIBE/SUBACK の交換で、すべてのトピックへのサブスクリプションを確認する必要があります。 それ以外の場合、クライアントが 2 つの SUBSCRIBE パケットを送信し、サーバーがそれらのパケットの 1 つだけを正常に処理すると、サーバーは Session Present: 1CONNACK を通知し、クライアントのサブスクリプションの一部のみを受け入れます。

古いバージョンのクライアントですべてのトピックがサブスクライブされていなかった場合を回避するため、クライアントの動作が変更されたときは (たとえば、ファームウェアの更新の一部として)、無条件でサブスクライブすることをお勧めします。 また、古いサブスクリプションが残されないように (サブスクリプションの許容最大数を消費しないように)、使用されなくなったサブスクリプションは明示的にサブスクライブ解除します。

バッチ処理

メッセージのバッチを送信するための特別な形式はありません。 TLS およびネットワークのリソースを集中的に消費する操作のオーバーヘッドを削減するには、基になる TLS/TCP スタックに渡す前に、パケット (PUBLISHPUBACKSUBSCRIBE など) をバンドルします。 また、クライアントで "バッチ" 内のトピック エイリアスを簡単に作成できます。

  • 接続に対する最初の PUBLISH パケットに完全なトピック名を格納し、トピックのエイリアスをそれに関連付けます。
  • 同じトピックに対する後続のパケットでは、空のトピック名とトピック エイリアス プロパティを使用します。

移動

このセクションでは、従前の MQTT サポートと比較した API の変更点を示します。

  • トランスポート プロトコルは MQTT 5 です。 以前は MQTT 3.1.1 です。
  • SAS 認証のためのコンテキスト情報は、署名と共にエンコードされるのではなく、CONNECT パケットに直接格納されます。
  • 使用する認証方法を示すためには、Authentication Method が使用されます。
  • Shared Access Signature は、Authentication Data プロパティに格納されます。 以前は、Password フィールドが使用されました。
  • 操作に関するトピックが異なります。
    • テレメトリ: $iothub/telemetry ではなく devices/{Client Id}/messages/events
    • コマンド: $iothub/commands ではなく devices/{Client Id}/messages/devicebound
    • パッチ ツインの報告: $iothub/twin/patch/reported ではなく $iothub/twin/PATCH/properties/reported
    • ツインの望ましい状態の変更の通知: $iothub/twin/patch/desired ではなく $iothub/twin/PATCH/properties/desired
  • クライアント - サーバーの要求 - 応答操作の応答トピックのサブスクリプションは必要ありません。
  • トピック名セグメントのエンコード プロパティの代わりに、ユーザー プロパティが使用されます。
  • プロパティ名は、特別なプレフィックスを使用する略語ではなく、「ダッシュケース」命名規則で記述されます。 ユーザー定義のプロパティには、代わりにプレフィックスが必要になりました。 たとえば、$.midmessage-id になり、myProperty1@myProperty1 になります。
  • 要求 - 応答操作の要求と応答メッセージを関連付けるためには、トピックでエンコードされた $rid プロパティではなく、Correlation Data プロパティが使用されます。
  • テレメトリ イベントには、iothub-connection-auth-method プロパティがスタンプされなくなりました。
  • デバイスからのサブスクリプションがないと、C2D コマンドは消去されません。 デバイスがサブスクライブするか、期限が切れるまで、キューに登録されたままになります。

例示

テレメトリの送信

メッセージ:

-> PUBLISH
    QoS: 1
    Packet_Id: 31
    Topic: $iothub/telemetry
    @myProperty1: My String Value # optional
    creation-time: 1600987195320 # optional
    @ No_Rules-ForUser-PROPERTIES: Any UTF-8 string value # optional
    Payload: <data>

確認:

<- PUBACK
    Packet_Id: 31
    Reason_Code: 0

代替受信確認 (制限された)

<- PUBACK
    Packet_Id: 31
    Reason_Code: 151
    status: 0501

ツインの状態を取得して送信する

依頼:

-> PUBLISH
    QoS: 0
    Topic: $iothub/twin/get
    Correlation_Data: 0x01 0xFA
    Payload: <empty>

応答 (成功):

<- PUBLISH
    QoS: 0
    Topic: $iothub/responses
    Correlation_Data: 0x01 0xFA
    Payload: <twin/desired state>

応答 (禁止):

<- PUBLISH
    QoS: 0
    Topic: $iothub/responses
    Correlation_Data: 0x01 0xFA
    status: 0102
    reason: Operation not allowed for `B2` SKU
    Payload: <empty>

ダイレクト メソッド呼び出しを処理する

依頼:

<- PUBLISH
    QoS: 0
    Topic: $iothub/methods/abc
    Correlation_Data: 0x0A 0x10
    Payload: <data>

応答 (成功):

-> PUBLISH
    QoS: 0
    Topic: $iothub/responses
    Correlation_Data: 0x0A 0x10
    response-code: 200 # user defined response code
    Payload: <data>

status が設定されていません - 成功応答です。

応答: 機器が使用できません。

-> PUBLISH
    QoS: 0
    Topic: $iothub/responses
    Correlation_Data: 0x0A 0x10
    status: 0603

QoS 0 使用中のエラー、パート 1

依頼:

-> PUBLISH
    QoS: 0
    Topic: $iothub/twin/gett # misspelled topic name - server won't recognize it as Request-Response interaction
    Correlation_Data: 0x0A 0x10
    Payload: <data>

応答:

<- DISCONNECT
    Reason_Code: 144
    reason: "Unsupported topic: `$iothub/twin/gett`"

QoS 0 使用中のエラー、パート 2

依頼:

-> PUBLISH # missing Correlation Data
    QoS: 0
    Topic: $iothub/twin/get
    Payload: <data>

応答:

<- DISCONNECT
    Reason_Code: 131
    status: 0100
    reason: "`Correlation Data` property is missing"

次のステップ