MQTT(Message Queuing Telemetry Transport)を理解する

MQTT,勉強

なんかまた仕事でよくわからない通信に対応しろとなったので勉強してみる。

MQTTの概要

MQTT(Message Queuing Telemetry Transport)は、IoT(Internet of Things)やM2M(Machine to Machine)通信などで広く使用されるメッセージングプロトコルです。

MQTTプロトコルの開発と標準化は、OASIS(Organization for the Advancement of Structured Information Standards)によって行われ、現在MQTTの仕様書はOASISのウェブサイト上でMQTT Version 5.0として公開されています。


MQTTには、パブリッシャーとサブスクライバー、ブローカーの3つの主要な登場人物がいます。

登場人物役割
パブリッシャーメッセージの発行:
パブリッシャーは、特定のトピックに対してメッセージを発行します。
これは、センサーデータ、イベント、または任意の情報を含むことができます。
トピックの指定:
パブリッシャーは、メッセージを送信する際に特定のトピックを指定します。
トピックは、メッセージを受信するための識別子として機能します。
サブスクライバートピックの購読:
特定のトピックに対して購読を行います。
これにより、サブスクライバーはそのトピックに関連するメッセージを受信することができます。
メッセージの受信:
サブスクライバーは、購読したトピックに関連するメッセージを受信します。
これにより、センサーデータの収集、イベントの監視、または他の情報の取得が可能になります。
ブローカーメッセージの中継:
ブローカーは、パブリッシャーが送信したメッセージを受信し、それをサブスクライバーに配信します。
これにより、パブリッシャーとサブスクライバー間のメッセージの中継が可能になります。
トピックの管理:
ブローカーは、トピックの作成、削除、および管理を行います。
これにより、メッセージングシステム全体のトピックの構造が維持されます。
QoSの処理:
ブローカーは、メッセージングシステム内での品質サービス(Quality of Service)の処理を管理します。
これにより、メッセージの確実な配信や再送信が行われます。
認証およびセキュリティの管理:
ブローカーは、クライアントの認証やセキュリティポリシーの管理を行い、安全な通信を確保します。

MQTTでは、トピックという階層的なメッセージングシステムが使用されます。

パブリッシャーがメッセージをトピックに発行すると、サブスクライバーは同じトピックを購読している間、そのメッセージを受信します。

以下はMQTTの通信の主な流れです。

MQTTの通信

MQTTにおける通信では、UDPのような信頼性の低い通信プロトコルは非推奨とされており、主にTCPWebSocketTLS/SSLを用いて行われます。

通信プロトコル説明ポート番号
TCPMQTTのデフォルトのトランスポートプロトコル。
1883
TLS/SSLMQTTにセキュリティを追加するために使用。8883
WebSocketMQTT over WebSocketは、Webブラウザや他のWebクライアントから
MQTTブローカーに安全に接続するため使用。
80または443

MQTTの主な用途

MQTTはさまざまな産業や分野で幅広く使用されています。

具体的な使用例は以下となります。

用途利用方法
スマートホーム技術スマートホームデバイスの間での通信にMQTTが使用されます。
例えば、センサーデータの収集やデバイスの制御、家庭内通知などが該当します。
MQTTは、異なるホームオートメーションデバイスやプラットフォーム間での統合に役立ちます。
ヘルスケア医療機器やウェアラブルデバイスなどのヘルスケアテクノロジーにおいて、MQTTが使用されます。
患者の健康データのモニタリングやリアルタイムな情報の送信、および医療専門家とのリモートコミュニケーションが
可能になります。
自動車産業自動車のテレマティクスシステムや車載システムにおいて、MQTTが使用されます。
センサーデータの収集や車両間通信(V2V)、車両インフラストラクチャ通信(V2I)などの応用が該当します。
これにより、自動車のリモート監視、遠隔診断、および運転支援システムが実現されます。
産業IoT(IIoT)工場やプラントなどの産業環境において、センサーデータの収集や制御システムの通信にMQTTが利用されます。
これにより、生産ラインのモニタリング、機器の保守、およびリアルタイムな生産データの収集が可能になります。
気象監視気象センサーが設置された地点での気象データの収集や共有にMQTTが使用されます。
これにより、気象情報のリアルタイムな収集と地域間のデータ共有が実現されます。

MQTTの特徴


MQTTは軽量で効率的なメッセージングプロトコルであり、以下がその特徴となります。

特徴説明
軽量性MQTTは、ヘッダーサイズが小さく、バンド幅やリソース消費が少ないため、リソース制約のあるデバイスや低帯域幅のネットワーク環境で効率的に動作する。これにより、IoTデバイスやセンサーネットワークなどのリソースが限られた環境でも使用が可能となる。
パブリッシュ/サブスクライブモデルMQTTは、パブリッシュ/サブスクライブ(Pub/Sub)モデルを採用している。クライアントはブローカーに対してメッセージを発行(パブリッシュ)し、他のクライアントがそのメッセージを受信(サブスクライブ)する。このモデルにより、非同期な通信が可能となる。
QoS(Quality of Service)MQTTは、3つの異なる品質のサービスレベル(QoS)を提供する。QoSレベル0では、メッセージの到達を保証しません。QoSレベル1では、少なくとも一度の配信を保証します。QoSレベル2では、厳密な一度の配信を保証する。
セッション維持MQTTは、セッション維持機能を提供する。クライアントがブローカーとの接続を維持し続けることができる。この機能により、デバイスが一時的なネットワークの断続や再接続に対応し、メッセージの確実な送信を実現する。
拡張性MQTTは、拡張可能なプロトコルであり、さまざまな用途に柔軟に適応することが可能。MQTTの仕様は公開されており、オープンなコミュニティによって活発に開発が進められている。
セキュリティMQTTは、TLS/SSLを使用した暗号化通信をサポートしており、セキュアな通信を実現する。また、クライアント認証やアクセス制御などのセキュリティ機能も提供されている。

MQTT制御パケットの構造

MQTTの制御パケットは、Fixed HeaderとVariable Header、そして必要に応じてPayloadから構成されています。

要素説明サイズ
Fixed Headerすべての MQTT 制御パケットに共通の固定ヘッダ。2~5 byte
Variable Headerメッセージタイプや特定のパケットに固有の情報を含むヘッダ。任意(0~byte)
Payloadメッセージの本文やデータ。任意(0~byte)

Fixed Header


MQTTのFixed Headerは、メッセージの種類(MQTT Control Packet TypeFlags)と、メッセージの長さを表すフィールド(Remaining Length)で構成されています。

MQTT Control Packet Type

MQTT Control Packet Typeは、異なる種類のメッセージやコマンドを表すために使用される4bitの値となります。

種別送信者受信者用途
CONNECT(接続)0x1クライアントブローカークライアントがブローカーに接続を試みる際に使用
CONNACK(接続確認)0x2ブローカークライアントブローカーがクライアントの接続要求に応答するために使用
PUBLISH(パブリッシュ)0x3クライアントブローカークライアントがメッセージをブローカーに送信し、トピックにパブリッシュするために使用
PUBACK(パブリッシュ確認)0x4ブローカークライアントブローカーがQoSレベル1でPUBLISHメッセージの受信を確認するために使用
PUBREC(パブリッシュ受信確認)0x5ブローカークライアントブローカーがQoSレベル2でPUBLISHメッセージの受信を確認するために使用
PUBREL(パブリッシュリリース)0x6クライアントブローカークライアントがQoSレベル2でPUBRECメッセージに対する応答として送信
PUBCOMP(パブリッシュ完了)0x7ブローカークライアントブローカーがQoSレベル2でPUBRELメッセージの受信を確認するために使用
SUBSCRIBE(サブスクライブ)0x8クライアントブローカークライアントが特定のトピックにサブスクライブするために使用
SUBACK(サブスクライブ確認)0x9ブローカークライアントブローカーがクライアントのサブスクライブ要求に応答するために使用
UNSUBSCRIBE(サブスクライブ解除)0xaクライアントブローカークライアントが特定のトピックのサブスクリプションを解除するために使用
UNSUBACK(サブスクライブ解除確認)0xbブローカークライアントブローカーがクライアントのサブスクリプション解除要求に応答するために使用
PINGREQ(ピングリクエスト)0xcクライアントブローカークライアントがブローカーに対してピングを要求するために使用
PINGRESP(ピングレスポンス)0xdブローカークライアントブローカーがPINGREQメッセージに対する応答として送信
DISCONNECT(切断)0xeクライアント/
ブローカー
クライアント/
ブローカー
クライアントがブローカーとの接続を切断するために使用
また、ブローカーがクライアントとの接続を切断するためにも使用
AUTH(認証)0xfクライアントブローカークライアントが認証を行うために使用

Flags

Fixed Header内のMQTT Control Packet Typeに続くFlagsは、各MQTT Control Packet Typeごとに固有の意味を持つフラグとなります。

以下リストでreservedとなっているFlagについては、指定値が設定されていない場合、不正パケットとして認識されます。

種別フラグ用途bit 3bit 2bit 1bit 0
CONNECTRserved0000
CONNACKRserved0000
PUBLISH任意の値を指定DUPQoSQoSRETAIN
PUBACKRserved0000
PUBRECRserved0000
PUBRELRserved0010
PUBCOMPRserved0000
SUBSCRIBERserved0010
SUBACKRserved0000
UNSUBSCRIBERserved0010
UNSUBACKRserved0000
PINGREQRserved0000
PINGRESPRserved0000
DISCONNECTRserved0000
AUTHRserved0000

現状MQTT Control Packet TypeがPUBLISHの場合のみ、以下用途に応じた任意の値を設定する必要があります。

フラグ設定値
DUP (Duplicate Delivery)0: 以前に同じメッセージIDで送信されたメッセージの重複ではないことを示す。
1: 以前に同じメッセージIDで送信されたメッセージの重複であることを示す。
QoS (Quality of Service)0: メッセージの最大1回の配信が保証される。
1: メッセージは少なくとも1回配信される。
2: メッセージは正確に1回だけ配信される。
Retain (Retain Message)0: メッセージは保持されない。
1: メッセージが保持され、新しいサブスクライバーが接続したときに送信される。

Remaining Length

Remaining Length は、MQTTメッセージの可変長部分の長さを示すフィールドです。

Fixed Headerの一部であり、可変長エンコーディング方式によって表されます。

最初の7ビットは、1バイト目の残りの長さを表し、次のバイトが必要であれば次のバイトが、さらにその次のバイトが必要であれば次の次のバイトが続きます。8ビット目の各バイトでは、次のバイトが続くかどうかを示すために、Continuation Bitが使用されます。

Remaining Length
フィールドサイズ
Remaining Length
範囲
Remaining Length
最大値
10〜1270x7f
2128〜163830x7f 0xff
316384〜20971510x7f 0xff 0xff
42097152〜2684354550x7f 0xff 0xff 0xff

Variable Header

Variable Header(可変ヘッダー)は、Fixed Header(固定ヘッダー)の後に続く可変のフィールドであり、メッセージの特定のパラメータや設定に関する情報を含んでいます。

Variable Headerは、メッセージの種類によって含まれる情報が異なり、メッセージ内容によってはVariable Headerそのものが存在しない場合もあります。

Variable Headerの詳細については公式から確認をお願いします。

Payload

Payload(ペイロード)は、メッセージ本体であり、実際に送信されるデータを含んでいます。

Payloadは、PUBLISHメッセージ(パブリッシュメッセージ)やSUBSCRIBEメッセージ(サブスクライブメッセージ)など、さまざまなメッセージタイプで使用されます。

Payloadの詳細については公式から確認をお願いします。

MQTT,勉強MQTT