このページの目次
MQTT
低帯域・高レイテンシ・信頼性の低い IoT ネットワーク向けに設計された最も簡潔な pub/sub プロトコル。QoS 0/1/2 で3段階の配信保証を提供し、retained message による状態同期、will message によるオフライン通知を実現。MQTT 5.0 では session expiry や shared subscriptions などのエンタープライズ機能が追加されました。
概要
MQTT(Message Queuing Telemetry Transport、1999/2013)は、低帯域・高レイテンシ・信頼性の低い IoT ネットワーク向けに特別に設計された、最も簡潔な pub/sub メッセージプロトコルです。パブリッシャはサブスクライバに直接接続せず、すべてのメッセージは broker(Mosquitto/EMQX)を経由し、topic はワイルドカードによるフィルタリングをサポートします。QoS 0/1/2 は3種類の配信保証を提供し、retained message と will message は状態同期とオフライン通知を実現します。MQTT 5.0(2019)では、session expiry、shared subscriptions などのエンタープライズ機能が追加されました。
モデル
MQTT は、低帯域・高レイテンシ・信頼性の低いネットワーク(IoT、M2M)向けに設計された、極めてシンプルな pub/sub プロトコルです。すべてのメッセージは central broker(Mosquitto、EMQX)を経由します。
QoS
MQTT CONNECT/CONNACK
CONNECT:
protocol_name: "MQTT" (v3.1.1) または "MQIsdp" (v3.1)
protocol_level: 4 (v3.1.1) または 5 (v5.0)
flags: clean_session, will_flag, will_qos, will_retain, password_flag, username_flag
keep_alive: 秒 (publisher は keep_alive 秒以内に PINGREQ を送信する必要があります)
client_id: 一意の ID (空の場合 → broker が割り当て、v5.0 のみ)
[will_topic, will_message] ← will_flag=1 の場合
[username, password]
CONNACK:
session_present: 0 (新しいセッション), 1 (既存のセッションの再開)
return_code: 0=成功, 1-5=失敗理由
Will Message
クライアントは接続時に宣言します。「もし私が異常に切断された場合、このメッセージを broker が送信してください」: CONNECT will_topic + will_message + will_retain。クライアントが異常切断(TCP close または keepalive タイムアウト)すると、broker は will message をパブリッシュします。
MQTT 5.0 の改善点
- Session expiry: 切断後にセッションを保持する期間(キュー内の QoS 1/2 メッセージは継続)
- Message expiry: 単一メッセージの TTL
- Shared subscriptions: 複数のサブスクライバによる負荷分散(ラウンドロビン)
- Reason codes: すべての ACK メッセージに具体的な理由を含む
- Topic aliases: 1/2バイトのエイリアスで完全な topic を置き換え → 帯域幅を節約
参考
- broker: Eclipse Mosquitto (C), EMQX (Erlang), VerneMQ
- ツール:
mosquitto_pub -h broker -t topic -m "hello", MQTT Explorer
Keywords: MQTT, pub/sub, QoS, retained, will, Mosquitto, IoT, topic filter