このページの目次

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)を経由します。

パブリッシュ/サブスクライブモデル: Broker 経由で topic に基づきメッセージをフィルタリングして配信 温度センサー Publisher publish "home/bedroom/temp" 23.5 Broker Mosquitto / EMQX → 一致するすべてのサブスクライバにプッシュ "home/bedroom/temp" 完全一致 "home/+/temp" 単一レベルワイルドカード + "home/#" 複数レベルワイルドカード #(すべてのサブレベルを含む) Broker は topic の文字列マッチングのみを行い、メッセージの内容は問いません。+ は単一レベル、# は複数レベルおよびその下のすべてのサブレベルにマッチします。

QoS

QoS 0/1/2: ハンドシェイク回数で得られる配信保証 QoS 0 高々1回 PUBLISH qos=0 Pub→Broker、確認なし PUBLISH qos=0 Broker→Sub、確認なし fire and forget 確認なし ・ リトライなし QoS 1 少なくとも1回 PUBLISH qos=1,id=N Publisher→Broker PUBACK id=N Broker→Publisher ・ 確認 重複の可能性あり retransmission QoS 2 ちょうど1回 ①PUBLISH Pub→Broker ②PUBREC Broker→Pub ③PUBREL Pub→Broker ④PUBCOMP Broker→Pub 重複も欠落もない 4回のハンドシェイク確認 QoS の数字が大きいほどハンドシェイク回数が増え、配信の信頼性は高まりますが、レイテンシと帯域幅のオーバーヘッドも増加します。 MQTT では、グローバルな一律の指定ではなく、メッセージごとに選択権が与えられます。

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 の改善点

  1. Session expiry: 切断後にセッションを保持する期間(キュー内の QoS 1/2 メッセージは継続)
  2. Message expiry: 単一メッセージの TTL
  3. Shared subscriptions: 複数のサブスクライバによる負荷分散(ラウンドロビン)
  4. Reason codes: すべての ACK メッセージに具体的な理由を含む
  5. 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