本页目录

MQTT

为低带宽、高延迟、不可靠的 IoT 网络设计的最简洁 pub/sub 协议——QoS 0/1/2 提供三级递送保证,retained message 实现状态同步,will message 处理离线通知。MQTT 5.0 增加了 session expiry 和 shared subscriptions 等企业特性。

概述

MQTT(Message Queuing Telemetry Transport, 1999/2013)是最简洁的 pub/sub 消息协议,专门为低带宽、高延迟、不可靠的 IoT 网络设计。发布者不直接连订阅者——所有消息经过 broker(Mosquitto/EMQX),topic 支持通配符过滤。QoS 0/1/2 提供三种递送保证,retained message 和 will message 实现状态同步和离线通知。MQTT 5.0(2019)增加了 session expiry、shared subscriptions 等企业特性。

模型

MQTT 是极简的 pub/sub 协议,专为低带宽、高延迟、不可靠网络设计 (IoT, M2M)。所有消息经过 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 最多一次 PUBLISH qos=0 Pub→Broker,不确认 PUBLISH qos=0 Broker→Sub,不确认 fire and forget 不确认 · 不重试 QoS 1 至少一次 PUBLISH qos=1,id=N Publisher→Broker PUBACK id=N Broker→Publisher · 确认 可能重复 retransmission QoS 2 恰好一次 ①PUBLISH Pub→Broker ②PUBREC Broker→Pub ③PUBREL Pub→Broker ④PUBCOMP Broker→Pub 不重复不丢失 四次握手确认 QoS 数字越大、握手次数越多,递送越可靠,但延迟和带宽开销也越高—— MQTT 把选择权交给每条消息,不是全局一刀切。

MQTT CONNECT/CONNACK

CONNECT:
  protocol_name: "MQTT" (v3.1.1) or "MQIsdp" (v3.1)
  protocol_level: 4 (v3.1.1) or 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 (新 session), 1 (已有 session 恢复)
  return_code: 0=success, 1-5=失败原因

Will Message

客户端连接时声明: "如果我意外断开, broker 发这条消息": CONNECT will_topic + will_message + will_retain。客户端异常断开 (TCP close 或 keepalive timeout) → broker 发布 will message。

MQTT 5.0 改进

  1. Session expiry: 断开后 session 保留多久 (队列中的 QoS 1/2 消息继续)
  2. Message expiry: 单条消息 TTL
  3. Shared subscriptions: 多个 subscriber 负载均衡 (round-robin)
  4. Reason codes: 所有 ACK 消息含具体原因
  5. Topic aliases: 1/2-byte alias 替完整 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