概述
MQTT
- MQTT 协议简介
- 发布和订阅
- QoS
- QoS 0
- QoS 1
- QoS 2
- MQTT 数据包结构
- 固定头 Fixed Header
- 可变头 Variable Header
- 消息体 Payload
MQTT 协议简介
MQTT 全称 Message Queuing Telemetry Transport,即消息队列遥测传输协议,是一种基于客户端/服务器的、发布/订阅模式的轻量级的通讯协议。
该协议构建与 TCP/IP 协议之上,可以使用少量的代码和有限的带宽为远程设备连接提供实时可靠的消息服务,故其在物联网、小型设备以及移动应用等方面应用广泛。
发布和订阅
MQTT 基于发布/订阅模式提供一对多的消息分发机制,消息并不是采用点对点的方式进行传递,而是通过 MQTT 服务器(broker)进行消息的分发。
QoS
为保证消息的稳定传输,MQTT 提供了 3 种不同的服务质量,即 QoS(Quality of Service)。
QoS 是消息的发送方 Sender 与接收方 Receiver 之间达成的协议。
QoS 0
意味着 Sender 发送一条消息,Receiver 至多可以收到一次。即 Sender 发送消息后便不再询问,无论消息发送成功或失败,因此 Receiver 最多仅可能收到一次消息。
QoS 1
意味着 Sender 发送一条消息,Receiver 至少可以收到一次。Sender 在发送消息结束后,持续等待 Receiver 的接收应答,若没有收到应答,则会继续重新发送消息,直到接收到应答为止,因此 Receiver 至少收到一次消息,并且该模式下 Receiver 可能收到重复的消息。
QoS 2
意味着 Sender 发送一条消息,Receiver 确保可以收到且仅收到一次。Sender 在发送消息后,首先将消息保存本地,并等待 Receiver 应答。接收到应答之后,根据应答包内容找到本地对应的消息并删除。若长时间没有得到 Receiver 应答,Sender 会重新发送数据,并重复上述过程,因此 Receiver 可以确保消息收到且仅收到一次。
MQTT 数据包结构
MQTT 数据包结构主要分为 3 部分:
-
固定头(Fixed Header):存在于所有 MQTT 数据包当中,标识数据包的类型以及分组
-
可变头(Variable Header):存在于部分 MQTT 数据包当中,标识可变头是否存在以及其具体内容
-
消息体(Payload):存在于部分 MQTT 数据包当中,标识消息的具体内容
固定头 Fixed Header
固定头结构的前四个比特位(7-4)标识 MQTT 的消息类型,具体标识和描述如下:
值 | 消息类型 | 流向 | 描述 |
---|---|---|---|
0000 | Resevered | 无 | 保留 |
0001 | CONNECT | 客户端 -> 服务端 | 客户端请求连接到服务器 |
0010 | CONNACK | 服务端 -> 客户端 | 连接确认 |
0011 | PUBLISH | 双向 | 发布消息 |
0100 | PUBACK | 双向 | 发布确认 |
0101 | PUBREC | 双向 | 发布收到 |
0110 | PUBREL | 双向 | 发布释放 |
0111 | PUBCOMP | 双向 | 发布完成 |
1000 | SUBSCRIBE | 客户端 -> 服务端 | 客户端请求订阅 |
1001 | SUBACK | 服务端 -> 客户端 | 订阅确认 |
1010 | UNSUBSCRIBE | 客户端 -> 服务端 | 客户端请求取消订阅 |
1011 | UNSUBACK | 服务端 -> 客户端 | 取消订阅确认 |
1100 | PINGREQ | 客户端 -> 服务端 | PING 请求 |
1101 | PINGRESP | 服务端 -> 客户端 | PING 应答 |
1110 | DISCONNECT | 客户端 -> 服务端 | 中断连接 |
1111 | Resevered | 无 | 保留 |
固定头结构的后四位(3-0)作为标识位使用,在不使用标识位的消息类型当中,标识位作为保留位使用。在 PUBLISH 消息类型中,后四位的标识信息如下:
消息类型 | Bit 3 | Bit 2 | Bit 1 | Bit 0 |
---|---|---|---|---|
PUBLISH | DUP | Qos | Qos | RETAIN |
-
DUP:用于保证消息的可靠传输,若设置为 1,则在下边的边长中传递 MessageId,并需要回复确认消息以保证消息传输完成
-
QoS:两比特位 QoS 用于标识服务质量,00 代表 Qos 0,01 代表 QoS 1,10 代表 QoS 2,11 为预留位
-
RETAIN:用于标识本消息是否需要服务端保留,若有新的订阅者出现,则将该消息推送给新的订阅者
可变头 Variable Header
可变头位于固定头和消息负载之间,其内容根据消息类型不同而不同,一般作为包的标识使用。
Bit | 7 - 0 |
---|---|
Byte 1 | 包标签符(MSB) |
Byte 2 | 包标签符(LSB) |
… | … |
消息体 Payload
消息体用于传输具体的信息,在不同消息类型中传输的内容不同,主要存在于一下消息体中:
消息类型 | 消息体内容 |
---|---|
CONNECT | 客户端的 clientID、订阅的 topic、消息内容 Message、用户名及密码 |
SUBSCRIBE | 订阅的主题、QoS |
SUBACK | 对 SUBCRIBE 所申请订阅的主题和 QoS 进行回复 |
UNSUBCRIBE | 订阅的主题 |
最后
以上就是甜甜蜡烛为你收集整理的【基础】MQTT 协议基础MQTT 协议简介MQTT 数据包结构的全部内容,希望文章能够帮你解决【基础】MQTT 协议基础MQTT 协议简介MQTT 数据包结构所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复