MQTT - AWS IoT Core

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

MQTT

MQTTは、制約のあるデバイス用に設計され、軽量で広く採用されているメッセージングプロトコルです。MQTT に対する AWS IoT サポートは、MQTT v3.1.1 仕様, いくつかの違いがあります. AWS IoT と MQTT v3.1.1 の仕様の違いについては、AWS IoT と MQTT バージョン 3.1.1 の仕様の違い

AWS IoT Core は、MQTT プロトコルと MQTT over WSS プロトコルを使用するデバイス接続をサポートします。-AWS IoT デバイス SDKsは両方のプロトコルをサポートしており、デバイスを AWS IoT に接続するための推奨される方法です。AWS IoT デバイス SDK は、デバイスおよびクライアントが AWS IoT Core サービスに接続してアクセスするために必要な機能をサポートし、AWS IoT サービスが必要とする認証プロトコルをサポートします。AWS デバイス SDK を使用して AWS IoT に接続する方法と、サポートされている言語での AWS IoT の例へのリンクについては、AWS IoT Device SDK を使用した MQTT との接続。認証方法と MQTT メッセージのポートマッピングの詳細については、」プロトコル、ポートマッピング、認証

AWS IoT に接続するには AWS IoT デバイス SDK を使用することをお勧めしますが、必須ではありません。ただし、AWS IoT デバイス SDK を使用しない場合は、必要な接続と通信のセキュリティを提供する必要があります。クライアントは送信する必要がありますサーバーネームインディケーション (SNI) TLS 拡張接続要求で。SNI を含まない接続試行は拒否されます。詳細については、「」を参照してください。AWS IoT でのトランスポートセキュリティ。クライアントを認証するために IAM ユーザーと AWS 認証情報を使用するクライアントは、正しい署名バージョン 4認証。

AWS IoT Device SDK を使用した MQTT との接続

このセクションでは、AWS IoT デバイス SDK へのリンクと、デバイスを AWS IoT に接続する方法を示すサンプルプログラムのソースコードへのリンクを示します。ここでリンクされているサンプルアプリは、WSS 経由の MQTT プロトコルと MQTT を使用して AWS IoT に接続する方法を示しています。

C++

AWS IoT C++ Device SDK の使用

Python

AWS IoT Device SDK for Python の使用

JavaScript

AWS IoT Device SDK for JavaScript の使用

Java

AWS IoT Device SDK for Java の使用

Embedded C

AWS IoT Device SDK の使用

重要

このSDKは、経験豊富な組み込みソフトウェア開発者による使用を目的としています。

MQTT Quality of Service (QoS) オプション

AWS IoT および AWS IoT デバイス SDK は、MQTT のサービス品質 (QoS) レベル0および1。MQTT プロトコルは、第 3 レベルの QoS、レベル2ですが、AWS IoT ではサポートされていません。QoS 機能をサポートするのは MQTT プロトコルだけです。HTTPS では QoS はサポートされません。

次の表は、各 QoS レベルが、メッセージブローカーに対して発行されるメッセージおよびメッセージブローカーによって発行されるメッセージにどのように影響

QoSレベルでは...

メッセージは...

コメント

QoS レベル

送信回数 0 回以上

このレベルは、信頼できる通信リンクを介して送信されるメッセージや、問題なく見逃されるメッセージに使用する必要があります。

QoS レベル

少なくとも 1 回送信した後、PUBACK応答が受信されました

送信者が受信するまで、メッセージは完全とは見なされませんPUBACK応答を使用して、正常に配信されたことを示します。

MQTT 永続セッションの使用

永続セッションには、クライアントによって確認されていないサービス品質 (QoS) が 1 のクライアントのサブスクリプションとメッセージが格納されます。切断されたデバイスが永続セッションに再接続すると、セッションが再開され、そのサブスクリプションが復元され、再接続前に受信され、クライアントによって確認されていないサブスクライブされたメッセージがクライアントに送信されます。

永続セッションの作成

MQTT 永続的セッションを作成するには、CONNECTメッセージを表示し、cleanSessionフラグを0。送信するクライアントのセッションが存在しない場合は、CONNECTメッセージが表示された場合は、新しい永続的セッションが作成されます。クライアントのセッションがすでに存在する場合は、そのクライアントは既存のセッションを再開します。

永続セッション中の操作

クライアントは、sessionPresent属性を、接続確認済み(CONNACK) メッセージを使用して、永続的セッションが存在するかどうかを確認できます。もしsessionPresent1永続的セッションが存在し、クライアントに格納されているメッセージはすべて、クライアントがCONNACKを参照してください。詳細については、永続セッションへの再接続後のメッセージトラフィック。もしsessionPresent1の場合、クライアントが再サブスクライブする必要はありません。ただし、sessionPresent0では、永続的セッションが存在しないため、クライアントはトピックフィルターに再度サブスクライブする必要があります。

クライアントは、永続的セッションに参加した後、各オペレーションにフラグを追加することなく、メッセージをパブリッシュしてトピックフィルターにサブスクライブできます。

永続セッションへの再接続後のメッセージトラフィック

永続的セッションは、クライアントと MQTT メッセージブローカー間の継続的な接続を表します。クライアントが永続的セッションを使用してメッセージブローカーに接続すると、クライアントが接続中に作成するすべてのサブスクリプションがメッセージブローカーによって保存されます。クライアントの接続が切断されると、クライアントがサブスクライブしているトピックにパブリッシュされた未確認の QoS 1 メッセージと新しい QoS 1 メッセージが保存されます。メッセージはアカウントの制限に従って保存され、その制限を超えるメッセージは削除されます。永続的メッセージの制限事項の詳細については、「」を参照してください。AWS IoT Core エンドポイントとクォータ。クライアントが永続的セッションに再接続すると、すべてのサブスクリプションが回復され、保存されたメッセージがクライアントに送信されます。その際の最大レートは 1 秒あたり 10 メッセージです。

再接続後、格納されたメッセージは、1 秒あたり 10 個の格納されたメッセージに制限されたレートでクライアントに送信され、Publish requests per second per connectionの制限に達しました。保存済みメッセージの配信率は制限されるため、再接続後に配信する保存済みメッセージが 10 個を超える場合、保存済みメッセージの配信には数秒かかります。

永続セッションの終了

次の条件は、永続的セッションを終了する方法を示しています。

  • 永続セッションの有効期限が経過したとき。永続的セッションの有効時間タイマーは、クライアントが切断されたか、接続がタイムアウトしたかのいずれかによって、クライアントが切断されたことをメッセージブローカーが検出したときに開始します。

  • クライアントがCONNECTメッセージを設定します。cleanSessionフラグを1

注記

セッション終了時にクライアントへの送信を待機している保存済みメッセージは破棄されますが、送信できなかった場合でも、標準のメッセージングレートで課金されます。メッセージの料金の詳細については、」AWS IoT Core。有効期限間隔は設定できます。

永続セッションの有効期限が切れた後の再接続

有効期限が切れる前にクライアントが永続セッションに再接続しない場合、セッションは終了し、保存されたメッセージは破棄されます。セッションの有効期限が切れた後にクライアントが再接続すると、cleanSessionフラグを0に設定されている場合、サービスは新しい永続セッションを作成します。以前のセッションのサブスクリプションまたはメッセージは、以前のセッションの期限が切れたときに破棄されたため、このセッションでは使用できません。

永続的セッションメッセージの課金

メッセージブローカーがクライアントまたはオフラインの永続セッションにメッセージを送信すると、メッセージが AWS アカウントに課金されます。永続的なセッションを持つオフラインデバイスが再接続してセッションを再開すると、保存されたメッセージはデバイスに配信され、アカウントに再度課金されます。メッセージの料金の詳細については、」AWS IoT Core 料金 — メッセージング

デフォルトの永続的セッションの有効時間は、標準の制限引き上げプロセスを使用して、1 時間を延長できます。セッションの有効期限を長くすると、オフラインデバイス用にさらに多くのメッセージが保存され、それらのメッセージは標準のメッセージレートでアカウントに課金されるため、メッセージの料金が増加する可能性があります。セッションの有効期限は概算であり、セッションはアカウントの制限よりも最大 30 分間持続する可能性があります。ただし、セッションはアカウントの制限よりも短くなることはありません。セッション制限の詳細については、」AWS のサービスクォータ

コネクト属性の使用

ConnectAttributesを使用すると、IAM ポリシーの接続メッセージで使用する属性 (PersistentConnectおよびLastWill。とConnectAttributesを使用すると、デバイスにデフォルトで新機能へのアクセスを許可しないポリシーを構築できます。これは、デバイスが侵害された場合に役立ちます。

connectAttributes でサポートされる機能は以下のとおりです。

PersistentConnect

を使用するにはPersistentConnect機能を使用すると、クライアントとブローカー間の接続が中断されたときに、クライアントが接続中に作成するすべてのサブスクリプションが保存されます。

LastWill

を使用するにはLastWill機能を使用して、メッセージをLastWillTopicクライアントが予期せず切断したとき。

デフォルトでは、ポリシーには非永続的な接続があり、この接続には属性が渡されません。永続接続が必要な場合は、IAM ポリシーで永続接続を指定する必要があります。

を使用する場合ConnectAttributesの例については、接続ポリシーの例

AWS IoT と MQTT バージョン 3.1.1 の仕様の違い

メッセージブローカーの実装は、MQTT v3.1.1 仕様と似ていますが、次のように仕様とは異なります。

  • AWS IoT では、MQTT のサービス品質 (QoS) レベル 0 と 1 のみがサポートされています。AWS IoT は、QoS レベル 2 のパブリッシュまたはサブスクライブをサポートしていません。QoS 2 レベル 2 がリクエストされると、メッセージブローカーは PUBACK または SUBACK を送信しません。

  • AWS IoT では、QoS レベル 0 でトピックにサブスクライブすると、メッセージが 0 回以上配信されます。メッセージは複数回配信される場合があります。複数回配信されるメッセージは、異なるパケット ID を使用して送信される場合があります。これらの場合、DUP フラグは設定されません。

  • 接続リクエストに応答するとき、メッセージブローカーは CONNACK メッセージを送信します。このメッセージには、接続で前のセッションを再開するかどうかを示すフラグが含まれます。

  • クライアントがトピックにサブスクライブすると、メッセージブローカーは SUBACK を送信してから、クライアントが新しい一致するメッセージの受信を開始するまでに、遅延が生じる場合があります。

  • MQTT の仕様では、ブローカーがトピックに送信された最後のメッセージを保持して以後のすべてのトピックサブスクライバーに送信することをリクエストするように、パブリッシャーをプロビジョニングします。AWS IoT では、保持されたメッセージはサポートされません。ブローカーがメッセージを保持するようにリクエストされた場合、接続は切断されます。

  • メッセージブローカーは、クライアント ID を使用して、各クライアントを識別します。クライアント ID は MQTT ペイロードの一部としてクライアントからメッセージブローカーに渡されます。クライアント ID が同じ 2 つのクライアントを、メッセージブローカーに同時に接続することはできません。あるクライアントが別のクライアントのクライアント ID を使用してメッセージブローカーに接続すると、新しいクライアント接続が受け入れられ、以前に接続されたクライアントは切断されます。

  • まれに、メッセージブローカーは、パケット ID が異なる同じ論理 PUBLISH メッセージを再送信する場合があります。

  • メッセージブローカーは、メッセージと ACK の受信順序を保証しません。