
第一层.简述MQTT 是一种基于发布/订阅模式的轻量级通讯协议该协议构建于TCP/IP协议上MQTT最大优点在于可以以极少的代码和有限的带宽为连接远程设备提供实时可靠的消息服务。作为一种低开销低带宽占用的即使通讯协议使其在物联网小型设备移动应用等方面有较广泛的应用。MQTT是一个基于客服端-服务器的消息发布/订阅传输协议。MQTT协议是轻量简单开发和易于实现的这些特点使它适用范围非常广泛。第二层.核心特点1.轻量级 固定报头最小仅2字节协议开销极低2.发布/订阅 解耦发送方和接收方实现一对多通信3.三种QoS 0(至多一次) 1(至少一次) 2(恰好一次)4.双向通信 客户端和服务器均可主动发送消息5.遗嘱消息 异常断连时自动发布预定义消息6.保留消息 新订阅者立即获取最新状态7.会话持久化 断连重连后恢复未传递的消息8.最低功耗 适合电池供电的嵌入式设备9.TLS/SSL加密 支持传输安全加密Client客户端可以时发布者订阅者或者两者兼备。Broker服务器消息中枢 负责接收发布 匹配订阅 转发消息 维护会话 QoS确认。特点空间解耦发布者不需要知道订阅者地址时间解耦借助持久会话订阅者离线时消息可暂存。同步解耦发布者发出消息后不必等待订阅者处理第三层0.MQTT 协议 核心概念-Topic、QoS、Broker发布/订阅模型2.1主题Topic主题是UTF-8字符串用/分层区分大小写home/livingroom/temperature发布者发布到某个主题订阅者订阅感兴趣的主题: 匹配单层 home//temperaure匹配home/livingroom/temperature#: 匹配多层必须在末尾 home/# 匹配 home/livingroom/temperature注意:通配符只能用于订阅不能用于发布。$开头通常是 Broker 系统主题如$SYS/...。MQTT 5.0 支持共享订阅$share/group1/home//temperature。2.2QoS 概览QoS 名称 可靠性 典型 场景0 至多一次可能丢传感器周期上报1 至少一次可能重复控制命令2 恰好一次不丢不重支付、关键告警2.3Broker 做什么Broker 负责接收客户端连接维护订阅关系匹配主题并转发处理 QoS 确认保存保留消息、会话、离线消息处理遗嘱消息权限控制。第四层 协议骨架——MQTT 报文格式固定报头、可变报头、Payload、VBI、属性┌──────────────────────────────────────────┐│ 固定报头 Fixed Header ← 所有报文必须 │├──────────────────────────────────────────┤│ 可变报头 Variable Header ← 部分报文有 │├──────────────────────────────────────────┤│ 有效载荷 Payload ← 部分报文有 │└──────────────────────────────────────────┘固定报头Byte 1:┌───────────────┬───────────────┐│ 报文类型 4 bit │ 标志位 4 bit │└───────────────┴───────────────┘报文类型4个位 0001-1111 c 客户端 s服务端1 connect c-s 请求连接2 connack s-c 连接确认3 publish c-s 发布消息4 puback c-s Qos1确认5 pubrec c-s Qos2收到6 pubrel c-s Qos2释放7 pubcomp c-s Qos2完成8 subscribe c-s 订阅9 suback s-c 订阅完成10 unsubscribe c-s 取消订阅11 unsuback s-c 取消订阅确认12 pingreq c-s 心跳请求13 pingresp s-c 心跳响应14 disconnect c-s 断开连接15 auth c- mqtt 5.0增强认证标志位4bit┌───────┬───────┬───────┬───────┐│ DUP │ QoS │ QoS │ RETAIN││ bit3 │ bit2 │ bit1 │ bit0 │└───────┴───────┴───────┴───────┘DUP:重复标志Qos:服务质量RETAIN:保证消息标志Byte 2...n:┌──────────────────────────────────────────┐│ 剩余长度 Remaining Length ││ 可变字节整数 VBI ││ 可变报头长度 有效载荷长度 │└──────────────────────────────────────────┘最后这个表示报文表示剩余长度┌─────────────────────────────────────┐│ Byte 1 │ 7-bit 数据 │ 续位1 │ ← 高位置1表示还有后续├─────────────────────────────────────┤│ Byte 2 │ 7-bit 数据 │ 续位0 │ ← 高位为0表示最后一个字节└─────────────────────────────────────┘每字节使用低 7 位编码数据每字节最高位第 8 位表示是否还有后续字节1还有0结束最大 4 字节可表示范围0 ~ 268,435,455256 MB可变报头可变报头的内容严格依赖于报文类型不同报文的字段各不相同。MQTT 5.0 新增——属性Properties属性部分结构┌──────────────────────────────────────────┐│ 属性长度 (Properties Length) ││ └ 可变字节整数表示后面所有属性的总长度 │├──────────────────────────────────────────┤│ 属性 1 │ 属性标识符 │ 属性值 ││ 属性 2 │ 属性标识符 │ 属性值 ││ ... │└──────────────────────────────────────────┘CONNECT 报文CONNECT 报文是客户端与服务端建立连接时发送的第一个报文。固定报文 0x10 剩余长度可变报文:┌──────────────────────────────────────────┐│ 协议名称 (Protocol Name) ││ 格式: UTF-8 字符串 MQTT ││ 二进制: 0x00 0x04 M Q T T │ ← 6 字节├──────────────────────────────────────────┤│ 协议版本 (Protocol Version) ││ MQTT 5.0 5, MQTT 3.1.1 4 │ ← 1 字节├──────────────────────────────────────────┤│ 连接标志 (Connect Flags) ││ ┌─────┬─────┬─────┬─────┬─────┬─────┬────┐││ │User │Pass │Will │Will │Will │Clean│Resv│││ │Name │word │Retain│QoS │Flag │Start│0 │││ │(1) │(1) │(1) │(2) │(1) │(1) │(1) │││ └──7──┴──6──┴──5──┴4─3─┴──2──┴──1──┴──0─┘│ ← 1 字节├──────────────────────────────────────────┤│ 保持连接 (Keep Alive) ││ 单位: 秒, 0禁用 Keep Alive 检测 │ ← 2 字节├──────────────────────────────────────────┤│ 属性 (Properties) │ ← 变长└──────────────────────────────────────────┘有效载荷┌──────────────────────────────────────────┐│ 客户端标识符 (Client ID) │ ← UTF-8 字符串├──────────────────────────────────────────┤│ 遗嘱属性 (Will Properties) [可选] │ ← Will Flag1├──────────────────────────────────────────┤│ 遗嘱主题 (Will Topic) [可选] │ ← Will Flag1├──────────────────────────────────────────┤│ 遗嘱载荷 (Will Payload) [可选] │ ← Will Flag1├──────────────────────────────────────────┤│ 用户名 (User Name) [可选] │ ← User Name Flag1├──────────────────────────────────────────┤│ 密码 (Password) [可选] │ ← Password Flag1└──────────────────────────────────────────┘第五层 MQTT5.0新特性原因码 所有确认报文(connack suback等)都携带原因码属性 所有报文类型都可携带键值对属性会话过期 会话可以设置过期时间不再永久保存报文过期 每个消息可以设置过期时间主题别名 用短整型代替主题字符串用户属性 支持自定义键值对元数据订阅选项 no local retain as published retain handling增强认证 支持scram kerberos等多轮认证请求/响应模式 response topiccorrelation data服务器断开 服务器可以主动断开连接流量控制 receive maximum控制并行消息数第六层 会话Clean Start(全新开始)Clear Start行为1服务端丢弃该客户端的所有现有会话数据开始全新会话0服务端尝试恢复客户端之前的会话Seesion Expiry Interval(会话过期时间)值含义0连接断开时会话立即过期0xFFFF FFFF会话用永不过期其他会话在断开后N秒过期会话保存的数据客户端会话数据├── 已订阅的主题列表及订阅选项├── 所有 QoS 1 和 QoS 2 的未确认消息├── 所有 QoS 2 的未完成报文标识符└── 遗嘱消息如果设定了 Will保留消息(Retained Message)发布者发送 PUBLISH (RETAIN1) topic: sensor/temp payload: 25.5°CBroker 行为1. 将消息转发给当前所有订阅者2. 在 Broker 上存储该主题的最后一条保留消息新订阅者之后的订阅 topic: sensor/temp→ 立即收到保留消息 25.5°C无需等待下次发布→ 然后继续接收后续发布的实时消息取消保留向该主题发送一条空 payload 的保留消息 (payload, RETAIN1)遗嘱消息Will Message客户端在 CONNECT 时设定Will Topic: device/statusWill Payload: offlineWill QoS: 1Will Retain: true正常场景客户端主动发送 DISCONNECT → Broker 不发送遗嘱消息异常断连场景客户端网络断开 / 掉电 / 崩溃→ Broker 检测到 Keep Alive 超时→ Broker 自动发布遗嘱消息给所有订阅者→ device/status → offline其他设备立即可知该设备离线