MQTT(Message Queuing Telemetry Transport)を理解する
なんかまた仕事でよくわからない通信に対応しろとなったので勉強してみる。
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のような信頼性の低い通信プロトコルは非推奨とされており、主にTCP、WebSocket、TLS/SSLを用いて行われます。
通信プロトコル | 説明 | ポート番号 |
---|---|---|
TCP | MQTTのデフォルトのトランスポートプロトコル。 | 1883 |
TLS/SSL | MQTTにセキュリティを追加するために使用。 | 8883 |
WebSocket | MQTT 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 Type、Flags)と、メッセージの長さを表すフィールド(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 3 | bit 2 | bit 1 | bit 0 |
---|---|---|---|---|---|
CONNECT | Rserved | 0 | 0 | 0 | 0 |
CONNACK | Rserved | 0 | 0 | 0 | 0 |
PUBLISH | 任意の値を指定 | DUP | QoS | QoS | RETAIN |
PUBACK | Rserved | 0 | 0 | 0 | 0 |
PUBREC | Rserved | 0 | 0 | 0 | 0 |
PUBREL | Rserved | 0 | 0 | 1 | 0 |
PUBCOMP | Rserved | 0 | 0 | 0 | 0 |
SUBSCRIBE | Rserved | 0 | 0 | 1 | 0 |
SUBACK | Rserved | 0 | 0 | 0 | 0 |
UNSUBSCRIBE | Rserved | 0 | 0 | 1 | 0 |
UNSUBACK | Rserved | 0 | 0 | 0 | 0 |
PINGREQ | Rserved | 0 | 0 | 0 | 0 |
PINGRESP | Rserved | 0 | 0 | 0 | 0 |
DISCONNECT | Rserved | 0 | 0 | 0 | 0 |
AUTH | Rserved | 0 | 0 | 0 | 0 |
現状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 最大値 |
---|---|---|
1 | 0〜127 | 0x7f |
2 | 128〜16383 | 0x7f 0xff |
3 | 16384〜2097151 | 0x7f 0xff 0xff |
4 | 2097152〜268435455 | 0x7f 0xff 0xff 0xff |
Variable Header
Variable Header(可変ヘッダー)は、Fixed Header(固定ヘッダー)の後に続く可変のフィールドであり、メッセージの特定のパラメータや設定に関する情報を含んでいます。
Variable Headerは、メッセージの種類によって含まれる情報が異なり、メッセージ内容によってはVariable Headerそのものが存在しない場合もあります。
Variable Headerの詳細については公式から確認をお願いします。
Payload
Payload(ペイロード)は、メッセージ本体であり、実際に送信されるデータを含んでいます。
Payloadは、PUBLISHメッセージ(パブリッシュメッセージ)やSUBSCRIBEメッセージ(サブスクライブメッセージ)など、さまざまなメッセージタイプで使用されます。
Payloadの詳細については公式から確認をお願いします。