ホーム >ニュース MQTTプロトコルフォーマットの理解

MQTTプロトコルパケットを理解し、信頼できるアプリケーションを構築

バイ Ponlakshmi


MQTT Protocol Packet Format & Build Applications

MQTTプロトコル(メッセージキューイングテレメトリートランスポート)は、転送用に特別に設計されたTCPベースのメッセージングプロトコルです エッジデバイスからセントラルサーバーへのテレメトリーデータ。 Publish/Subscribeモデルを継承し、MQTTを有効にする クライアントは、中央MQTTブローカーを通じてデータを効率的に送受信します。 1999年の発明以来、MQTTはIoT導入の最も広く採用されたプロトコルになりました。 軽量な自然と信頼性。 一方、MQTT-SN(Sensor Network)はプロトコルを拡張します。 エッジまたは周辺機器、 Bluetoothのような低電力接続媒体上のデバイスとゲートウェイ間の通信。 それにもかかわらず 潜在的なMQTT-SNは、コアMQTTプロトコルのような広範な採用を得ていません。 多くのMQTTが 導入は市場ですぐに利用できます、 根本的な概念の深い理解を持つことは重要です。 この知識は、あなたが活用することを可能にします これらの実装は効果的に、高機能、障害のあるIoTアプリケーションを構築することができます。

MQTTプロトコルパケットタイプ

MQTT デバイスと MQTT サーバ間の公開サブスクリプションのやり取りは、一組のセットで容易に行えます。 定義済みのメッセージ。 シンプルさのために、発信と着信メッセージの両方が同じ標準に従う。 高いレベルで、MQTTプロトコル パケットは、より良い理解のために2つのタイプに分類することができます


MQTT プロトコル パケットを超えて、処理方法の世話をする他のいくつかの仕様があります。 セッション, 最後のメッセージとそれが非常にあるので、この記事でもカバーされる切断を保持する MQTTの実装について理解することが重要です。

MQTTプロトコル データパケット

データパケットは、実際のデータをその間に転送するのに役立ちますMQTTブローカーMQTTクライアント 公開と購読は、MQTT クライアントがその意思を送信し、聴くための主要なデータパケットです。 トピックとサーバーは、要件に基づいてデータを公開します。 コネクトパケットをこのリストに追加したいのは、その一部としてデータのセットとして送信されます。


  • 出版情報- MQTT 公開パケットには、データが必要なトピックが含まれています メッセージの保持と品質要求のような実際のデータといくつかの制御パラメータが公開される サービス
  • 会員登録・MQTT 購読は、送信された重要なメッセージの1つです クライアントは、リストを示すサーバーにMQTTの特長 トピックフィルタクライアントは聞きたい。 Packet は固定ヘッダを含んでいます。 可変ヘッダーとペイロード。
  • コネクト- MQTT Connect Packet は、MQTT 制御パケットの多くですが、 LastWillとRetainに関するデータ。 また、独自の識別子、MQTT認証情報、 クリーンなセッション セッションが永続的かどうかを言うフラグ。 クライアントからクライアントへ送信されるパケットクラウドホスト MQTT サーバーお問い合わせ

MQTTの特長 上記の3つのメッセージのパケット形式構造には、固定ヘッダー、変数ヘッダー、および ペイロード。

MQTTプロトコル制御パケット

制御パケットは、MQTTプロトコルにおけるデータ転送の成功を確実にするために不可欠です。 明確な理解 パケットの制御とMQTTサービスの品質(QoS) レベル効果的な実装には不可欠です。 ほとんどの制御パケットは、MQTT クライアントやサーバーに依存するコア実装層で管理されます。 利用、配信状態の保存、アクセシビリティの処理、メッセージの再送信などのタスクの管理 アプリケーションレベルで。


  • コンセプト– – このパケットは、接続リクエストを認識し、のみを含む MQTT 3の固定ヘッダー。 MQTT 5には、接続を拒否するための理由コードを送信するオプションがあります。 成功した接続に送信されたCONNACKは、可用性などのサーバー機能の開示を含みます 保持, ワイルドカードのサブスクリプション、共有サブスクリプション、サブスクリプション識別子、およびサポートされる最大QoS パケットサイズとサーバーは、クライアントが効率的に通信できるようにします。
  • サブスクライブ・MQTT 購読は、送信された重要なメッセージの1つです クライアントは、MQTT トピックフィルタのリストを示すサーバーに、クライアントはリスニングに興味があります お問い合わせ パケットは固定ヘッダー、可変ヘッダー、ペイロードが含まれています。
  • フィードバック– – このパケットは、サブスクリプションメッセージに対する応答で送信されます。 MQTTの特長 クライアントMQTTのトピック フィルター(s)お問い合わせ このパケットには、固定および可変ヘッダーとペイロードが含まれています。
  • 免責事項– – このパケットはクライアントからサーバーに送信され、指示します。 特定のトピックに対して、さらなるメッセージを送信を停止するサーバー。 メッセージには固定ヘッダが含まれています。 変数ヘッダーおよびペイロード。
  • フォロー– – クライアントからのトピックフィルタのUnsubscribeの受領について、 サーバは、サブスクリプションとして保存したトピックフィルタのリストからそのトピックフィルタを削除する必要があります クライアント。 unsuback は固定ヘッダー、可変ヘッダー、ペイロードが含まれています。
  • ディスコネクト– – 一度にMQTTの特長 プラットフォームMQTT デバイスからこのリクエストを受信し、クライアントを切断する必要があります。 接続を閉じます。 接続中に設定されたクリーンなセッションパラメータは、クライアントの 将来のサブスクリプションメッセージは、保存または廃棄されます。 ザ・ウィル メッセージは削除する必要があります。 パケットは固定ヘッダーのみです。 MQTT 5 では、サーバーはまた送ることができます クライアントがプロトコルに合致しない場合は、クライアントに接続します。
  • フィードバック– – このパケットはクライアントやサーバーからアクセシビリティとして送信できます。 QoSレベル1で受け取ったPUBLISHパケット。 PUBACKが受信されていない場合は、送信者は、 再送信時に設定した DUP フラグのメッセージ。 送信者は受信後にキューからメッセージを削除できます このアクセシビリティ パケットは固定ヘッダと可変ヘッダが含まれています。
  • PUBREC、PUBRELおよびPUBCOMPMQTT QoSレベル2MQTT PUBLISHのパックの1つの配達を丁度保障して下さい。 これらの制御パケットは、このQoSレベル2配送を確実にするために、あらかじめ定義されたシリーズで交換されます。 このシリーズ パケットフローはクライアントとサーバーの両方で続きます。 受信機がPUBLISHEDのパケットを受け取るとき、 PUBRECを承認として送信します。 PUBLISHed パケットの送信者は、PUBREL パケットをそのまま送信しなければなりません。 PUBREC対応 受信機はPUBRECに応答してPUBCOMPを送ります。 これらの制御パケットには、 固定および可変的なヘッダー。
  • PINGREQ、ピンレス・ これらのパケットは、接続を生き続けるために使用され、 接続リクエスト中にMQTT Keep Aliveセットに基づいて動作します。 MQTTの責任です。 クライアントは、PingREQ パケットをライブ時間を保持する間隔で送信します。 ザ・オブ・ザ・標準MQTT サーバー送信する PingRESP パケットをアクセノレッジメントとして。 PingReq が受信されていない場合は、サーバーがクライアントの接続を切断します。 一般的には待ち時間 2xは、接続を解除する前に、生きている時間を保持します。 これらのパケットは固定ヘッダーのみです。

MQTTプロトコルパケットフォーマットとサイズ

MQTTの特長 パケットは、固定ヘッダ、可変ヘッダ、ペイロードの3つの部分に広く分けられます。 お問い合わせ 実装を上回るスタンダード MQTTクライアント, この情報は必要なくない場合. 但し、方法の理解のため クライアントを使用するには、適切な API を使用します。このハンズオンを使用できます。 固定ヘッダフィールドは制御で構成されています フラグ; 変数ヘッダーには、パケットの長さが含まれている。 ペイロードは、セットされた長さと等しい 変数ヘッダー。 パケット長フィールドの最小サイズは1バイトで、メッセージは127未満です。 バイト。


最小のパケットサイズは2バイトで、コントロールフィールドと1つのパケット長フィールドしか存在しません。 最大パケットサイズは256MBです。 127バイト未満のパケットは1バイトのパケット長フィールドを持ちます。 ザ・オブ・ザ・ 127 以下、16383 未満のパケットは 2 バイトを使用します。 8ビットで使われる7ビットは 継続ビット。


MQTT Protocol packet size - Explained

制御分野

8ビット制御フィールドは、2バイトの固定ヘッダーのメインバイトです。 2つに分けられます 4ビットフィールドとすべてを含む プロトコルコマンドとレスポンス。 最初の4つの最も重要なビットは、コマンドまたは 残りが残っている間メッセージのタイプ フィールド、 4ビットは制御フラグとして使用されます。

MQTT control field structure

コントロールフラグ

16 個の可能なフラグがありますが、ビット数の制限が使用されます。 公開メッセージは最も多くなります 使用方法 これらのフラグ。


  • QoS 1 または 2 でメッセージを再公開したときに重複フラグが使用されます。
  • QoS フラグは 0,1,2 の QoS レベルを示すために公開するときに使用されます。
  • ザ・オブ・ザ・MQTT はメッセージを保持しますメッセージを公開する際にもフラグも使用されます。

残り長さ

Remaining の長さは変数ヘッダーを含む現在のパケットに残されたバイトの数です ペイロードデータ。 Remaining の長さは、Remaining の長さをエンコードするために使用されるバイトを除外します。 維持の長さはあります 値アップのために1バイトを使用する可変長エンコード方式でエンコード 127 へ。 少なくとも7 各バイトの重要なビットはデータをエンコードし、そこにあることを示すために最も重要なビットが使用されます 次のバイトで 表現。 したがって、各バイトは128値と1つの「継続ビット」をエンコードします。 最大の数 残りのバイト 長さフィールドは4つです。


MQTT Packet Format Remaining length in Fixed Header

可変ヘッダー

MQTT 制御パケットには、変数ヘッダコンポーネントがあります。 可変長ヘッダーフィールドは MQTTに常に存在しません メッセージ。 一部のMQTTメッセージタイプまたはコマンドは、このフィールドに追加の制御情報を運ぶ必要があります。 その間に残っている 固定ヘッダーとペイロード。 パケットタイプにより、変数ヘッダーは異なります。

MQTTの特長 パケット形式例:メッセージ構造の接続

例として、詳細を見てみましょうMQTTクライアントコネクトメッセージ。


MQTT プラットフォームで TCP レベルの接続を確立した後、最初のパケットは、 CONNECT パケット。 コネクタ パケットは、ネットワーク接続を経由して送信する必要があります。 MQTT が送信する 2 番目の CONNECT パケット クライアントは無視され、切断されます。

固定ヘッダ


MQTT Packet - fixed header

可変ヘッダー

変数ヘッダーは固定ヘッダーの横に置き、ヘッダの部分として4つの主要な部品があります。 彼らは、 プロトコル名 バイト、プロトコルレベル、フラグを接続し、キープアライブします。 これらの各部品はあらかじめ定義されています バイトサイズとそれらが存在する順序。


プロトコル名

これらのバイトはプロトコル名を保存します。 プロトコル名はそのまま保存されます。MQTTの特長で 4 バイト。 これらのフィールドの他の文字は、サーバーからクライアントの接続を解除します。


MQTT Packet - Variable Header - protocol name bytes

プロトコルレベル

プロトコルバージョンを定義します。 MQTTブローカーのプロトコルレベルは、MQTT 3.1/3.1.1と5の4つです。 お問い合わせMQTT 5バージョンお問い合わせ その他送信 値が切断につながる。 MQTTブローカーは、サポートしているバージョンに基づいてクライアントを切断することもできます。


MQTT protocol Packet version level Explained

フラグを接続する

これは単一のバイトフィールドで、ペイロード内のデータの存在または欠如を表します。MQTT認証(ユーザー名とユーザー名) パスワードお問い合わせ ウィール保持やクリーンなセッションのような他のフィールドはどちらかになります true または false と QoS フィールドは、WILL Message に続く QoS レベルを指定します。


MQTT Protocol format - connect flags Explained

MQTTの特長 生き続ける

MQTTの特長 生き続けるのは2バイトのパケットで、保存する最大時間は65535秒(18)です。 営業時間 ただし、要件に基づいて30秒または分程度保つことをお勧めします。 MQTTの特長 クライアントは、定義された値を超えていない間隔で制御パケット(PINGREQ)を送信する必要があります アライブ。 ザ・キープ Alive 値は、クライアントによる制御パケットの送信時間に依存します。


keep alive

MQTTプロトコルペイロードフォーマット

ペイロードにはMQTTクライアントが含まれています 認証(ユーザー名、パスワード)。 クライアント ID は、クライアントごとにユニークでなければなりません。 クライアントがクライアント ID を指定しない場合、ブローカーはクライアントごとに固有のクライアント ID に応答します。 お問い合わせ クライアント ID を空のフィールドに送信します。 クライアントは 拒否。 クライアントID、 トピックは、メッセージ, ユーザー名、パスワード。


Connect パケットのすべてのフィールドは、文字列の形式になります。 TCPレベルの確立後 接続、クライアントはMQTT Connectを送信する必要があります 合理的な時間内で。 接続パケットが届かない場合は、MQTT ブローカーはクライアントを切断します。 アフター 成功した検証、ブローカーはどちらか エラーがいくつかある場合は、ゼロペイロードまたは切断でCONNACKパケットに応答 接続。 成功した関係の後で、 ブローカーは、接続されたリストに新しいクライアントを追加し、セッションは維持され、監視されます データパケットだけでなく、生き続ける。


あなたがゼロから構築している場合は、フォローしてください完全なMQTTクライアント開発者ガイドそしてそれをよりよく理解し、実現する指定。

MQTT導入 - 関連読書

非常に成功したMQTTアプリケーションについては、MQTTプロトコルを超えて追加の記事を読んでください。


MQTT アプリケーションを使用する準備をデプロイする

IoT 実装のジャンプスタート

セキュアMQTT ビルドされたダッシュボードでブローカー - オンプレミス&クラウド