MQTT协议
MQTT(Message Queuing Telemetry Transport, 消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的"轻量级"通讯协议,该协议构建于TCP/IP协议上,由IBM在1999年发布。

MQTT实现
角色划分:
- 订阅者(Subscriber):接收消息的客户端
- 发布者(Publisher):发送消息的客户端
- 代理服务器(Broker):消息中继服务器
架构分类:
- 服务器端:仅包含代理服务器
- 客户端:包含订阅者和发布者
通信特点:
- 客户端可同时具备发布和订阅功能
- 通过向代理服务器发送连接请求建立通信

设计原则与特性
精简设计
把传输量降到最低
- 设计理念:仅传输必要内容,去除冗余功能
- 适用场景:考虑物联网设备网络条件苛刻(远距离传输、时断时续)
- 实现方式:协议头精简,数据包体积最小化
发布/订阅模式
一对多消息发布
- 工作模式:
- 采用(Pub/sub)模式
- 优势:
- 解除应用程序耦合
- 一条消息可被多个订阅者接收
- 类似广播机制,节省带宽资源
- 主题结构:
- 采用分层结构(如home/temperature)
- 支持通配符订阅(#表示多级,+表示单级)
动态主题管理
允许用户动态创建主题
- 管理特性:
- 运行时动态创建/修改主题
- 支持主题取消订阅
- 发布者可灵活切换主题
- 示例:温湿度传感器可动态发布home/temperature和home/humidity两个主题
服务质量管理
三种消息发布服务质量
- QoS 0(至多一次):
- 代理服务器最多推送一次
- 不保证消息到达
- QoS 1(至少一次):
- 保证消息至少到达一次
- 可能产生重复消息
- QoS 2(只有一次):
- 确保消息精确到达一次
- 适用于计费系统等关键场景
遗嘱特性
通知客户端异常中断的机制
- 工作机制:
- 客户端首次连接时设置遗嘱消息
- 异常断开时代理服务器执行遗嘱
- 应用场景:
- 网络不稳定导致的意外断开
- 设备故障通知
- 实现方式:通过心跳包检测连接状态,超时后触发遗嘱
MQTT消息报文
MQTT是应用层协议,需要借助TCP/IP协议进行传输,与HTTP/FTP协议类似
固定头部
用于区分多种消息类型(如连接、发布、订阅等)
-
结构组成:
-
首字节:表示MQTT消息的报文类型及控制标记
-
高4位表示协议类型,对应16种消息类型
-
常见类型:
-
1:CONNECT(客户端连接请求)
-
2:CONNACK(连接确认)
-
3:PUBLISH(发布消息)
-
8:SUBSCRIBE(订阅请求)
-
12:PINGREQ(心跳请求)
-
特殊值:14为DISCONNECT(断开连接),15为保留值
-
-
-
剩余长度:标识消息报文的剩余部分长度
- 低四位表示位域定义(仅PUBLISH消息有效):
- DUP位(bit3):0表示首次发送,1表示重发消息
- QoS位(bit2-1):
- 00:最多发送一次(QoS=0)
- 01:至少发送一次(QoS=1)
- 10:精确发送一次(QoS=2)
- 11:非法值,触发连接关闭
- 保留位(bit0):固定为0
- 低四位表示位域定义(仅PUBLISH消息有效):
-
-
功能特点:通过首字节的高4位和低4位分别承载不同类型的信息
可变头部
部分协议类型中存在,部分协议中不存在
- 协议名称:固定为"MQTT"字符串,占用6个字节(byte 1-6),其中:
- byte 1-2:长度标识(0x00 0x04)
- byte 3-6:ASCII码分别为’M’(0x4D)、‘Q’(0x51)、‘T’(0x54)、‘T’(0x54)
- 协议级别:byte 7表示协议版本号,值为4表示MQTT 3.1.1版本
- 连接标志:byte 8包含7个控制位(从高位到低位):
- User Name Flag:用户名标识
- Password Flag:密码标识
- Will Retain:遗嘱保留标志
- Will QoS:遗嘱服务质量(2位)
- Will Flag:遗嘱标志
- Clean Session:清理会话标志
- Reserved:保留位(必须为0)

MQTT连接:在TCP连接建立后,客户端发送CONNECT报文(PSH,ACK标志),长度37字节
消息载体
包含消息的主要内容