什么是MQTT协议?
介绍:
- MQTT协议是一种轻量级的消息传输协议,采用发布/订阅(Publish/Subscribe)的通信模式,适用于网络带宽有限、网络不稳定以及设备资源受限的场景。
MQTT协议的特点:
- 轻量级:协议开销小,适合资源受限的嵌入式设备。
- 安全可靠:MQTT协议是建立在TCP/IP协议之上,所以安全可靠。
- 支持不同的QoS等级:
| 等级 | 名称 | 交付机制 | 主要特点 |
|---|---|---|---|
| QoS 0 | 至多一次 | 不进行 MQTT 层的交付确认 | 开销小,消息可能丢失 |
| QoS 1 | 至少一次 | 使用 PUBACK 确认 | 消息可能重复 |
| QoS 2 | 恰好一次 | 使用多阶段握手 | MQTT 协议层保障消息交付一次 |
- 心跳保活:由于网络问题可能造成连接陷于假死状态,为了判断客户端和代理是否出现异常,MQTT定义自己的心跳机制,定期向代理发送报文,以便于快速识别出异常连接,让客户端快速与代理断开连接。
- 持久会话: 代理保留客户端发送过来的消息,以便于消息订阅端上线立刻获取消息。
MQTT报文结构:
MQTT报文由三部分组成,分别是:固定报头(Fixed header)、可变报头(Variable header)、有效载荷(Payload)。
- 固定报头(Fixed header):所有的数据包都包含这部分,用来表示数据的类型;
- 可变报头(Variable header):存在于部分数据包中,决定了可变头是否存在及其具体内容;
- 有效载荷(Payload):存在于部分数据包中,表示客户端收到的内容;
固定报头的格式:
-
固定报头的格式介绍:
byte 1的高四位取值范围:00001111,转化为十进制:015。
byte 1的低四位大多数是保留位,只有当高四位为Publish(0011)的时候,低四位的值才有意义。
| 二进制(4 bit) | 十进制 | 控制报文类型 | 中文名称 | 作用说明 |
|---|---|---|---|---|
0000 |
0 | Reserved | 保留 | 不允许作为有效控制报文类型使用 |
0001 |
1 | CONNECT | 连接请求 | 客户端向 Broker 发起连接请求,提供协议版本、客户端标识、认证信息等 |
0010 |
2 | CONNACK | 连接确认 | Broker 向客户端返回连接结果,表示连接是否被接受 |
0011 |
3 | PUBLISH | 发布消息 | 发布者向 Broker 发送业务消息,或 Broker 向订阅者转发消息 |
0100 |
4 | PUBACK | 发布确认 | 确认 QoS 1 的 PUBLISH 报文 |
0101 |
5 | PUBREC | 发布收到 | QoS 2 交互中,接收方确认收到 PUBLISH 报文 |
0110 |
6 | PUBREL | 发布释放 | QoS 2 交互中,发送方通知接收方继续完成消息交付流程 |
0111 |
7 | PUBCOMP | 发布完成 | QoS 2 交互中,确认消息交付流程完成 |
1000 |
8 | SUBSCRIBE | 订阅请求 | 客户端向 Broker 请求订阅一个或多个主题,并指定订阅选项 |
1001 |
9 | SUBACK | 订阅确认 | Broker 返回订阅结果及相应的授权或失败信息 |
1010 |
10 | UNSUBSCRIBE | 取消订阅请求 | 客户端请求取消对一个或多个主题过滤器的订阅 |
1011 |
11 | UNSUBACK | 取消订阅确认 | Broker 确认收到取消订阅请求;MQTT 5.0 还可提供逐项结果 |
1100 |
12 | PINGREQ | 心跳请求 | 客户端向 Broker 发送请求,以检查连接是否仍然有效 |
1101 |
13 | PINGRESP | 心跳响应 | Broker 对 PINGREQ 返回响应 |
1110 |
14 | DISCONNECT | 断开连接 | 客户端通知 Broker 连接即将关闭 |
1111 |
15 | AUTH | 认证报文 | 用于 MQTT 5.0 的增强认证流程;MQTT 3.1.1 不支持此报文类型 |
- 当高四位为Publish(0011)时,低四位的意义:
| Bit 位 | 字段 | 长度 | 作用 |
|---|---|---|---|
| Bit 3 | DUP | 1 bit | 表示该 PUBLISH 报文是否为重发报文 |
| Bit 2~1 | QoS | 2 bit | 表示消息的服务质量等级 |
| Bit 0 | RETAIN | 1 bit | 表示发布者是否要求 Broker 保留该消息 |
- 每一位的具体作用:
- Bit 3:DUP(重复发送标志),占一个bit位。
| DUP 值 | 含义 |
|---|---|
0 |
该报文不是按照 DUP 标志标记的重发报文 |
1 |
该报文是重发报文 |
- eg:客户端使用 QoS 1 发布消息后,没有收到 PUBACK,可能重新发送 PUBLISH 报文。如果这是对之前发送的 PUBLISH 报文的重发,则 DUP 可以设置为 1。
- 注意:DUP = 1 不代表接收方一定已经收到过这条消息,它表示发送方正在重发该报文。
- Bit 2~1:QoS(服务质量等级),QoS 占 2 bit,有 4 种二进制组合,但其中 11 是保留值。
| Bit 2 | Bit 1 | QoS 值 | 含义 |
|---|---|---|---|
0 |
0 |
0 | 至多一次,不进行 MQTT 层的交付确认 |
0 |
1 |
1 | 至少一次,通过 PUBACK 确认 |
1 |
0 |
2 | 恰好一次,通过四阶段交互完成交付 |
1 |
1 |
3 | 保留值 |
- Bit 0:RETAIN(保留标志),占一个bit位。
| RETAIN 值 | 含义 |
|---|---|
0 |
不要求 Broker 将本次发布的消息保存为新的保留消息 |
1 |
要求 Broker 将本次发布的消息保存为该主题的保留消息 |
- 注意:RETAIN 与 QoS 无关,二者作用不同。
- 举例:
| 十六进制 | 二进制 | DUP | QoS | RETAIN | 含义 |
|---|---|---|---|---|---|
30 |
0011 0000 |
0 | 0 | 0 | QoS 0,不保留 |
31 |
0011 0001 |
0 | 0 | 1 | QoS 0,保留 |
32 |
0011 0010 |
0 | 1 | 0 | QoS 1,不保留 |
33 |
0011 0011 |
0 | 1 | 1 | QoS 1,保留 |
34 |
0011 0100 |
0 | 2 | 0 | QoS 2,不保留 |
35 |
0011 0101 |
0 | 2 | 1 | QoS 2,保留 |
3A |
0011 1010 |
1 | 1 | 0 | QoS 1,重发,不保留 |