PUBLISH(发布消息)
含义:客户端到服务端或者服务端到客户端发布消息控制报文,是双向的。
一.固定报头
DUP 重发标志
当DUP被设置为0,表示客户端或者服务器是第一次发送这个PUBLISH报文
当DUP被设置为1,表示这可能是一个早期报文的重发
当Qos=0时,DUP 必须为0
Qos服务质量等级
-
QoS 0(At most once)“至多一次”
消息发布完全依赖底层 TCP/IP 网络。会发生消息丢失或重复。这一级别可用于如下情况,环境传感器数据,丢失一次读记录无所谓,因为不久后还会有第二次发送。
-
QoS 1(At least once)“至少一次”
确保消息到达,但消息重复可能会发生。
-
QoS 2(Exactly once)“只有一次”
**注:**发布者或者订阅者设置的QoS分别是和服务器端异步执行的,即使发布者设置发布消息为QoS2,订阅者也可以通过QoS0或QoS1来订阅该消息(这样就是QoS的降级downgrade)。
RETAIN保留标志
如果被置为1,服务端必须存储这个topic和它的QoS ,以便它可以被Broker分发给未来的和主题名匹配的订阅者,但是RETAIN=1的Qos=0的PUBLISH的报文发送服务器后,保留消息可能会被服务器选择丢弃保留消息。
保留消息能使新订阅的客户端立即收到最新的状态消息,而不用等待发布者发送下一个更新,也就是topic的保留标志是最后已知的良好值。
如果要删除保留消息,只需向该topic重新publish数据,RETAIN=TRUE,Payload为空,新订阅者就不会收到保留消息。
如果客户端发给服务端的 PUBLISH 报文的保留标志位为0, 服务端不能存储这个消息也不能移除或替换任何现存的保留消息。
MQTT Essentials第8部分:保留消息
二.可变报头
- 主题名(Topic name)
- 报文标识符(Package Identify)- -只有当Qos=1,2时才有
三.payload
根据用户自定义
PUBLISH 报文的预期响应
PUBACK(发布确认Qos1)
含义:发布确认,对 QoS 1 等级的 PUBLISH 报文的响应
一.固定报头
- 0x40
- 0x02
二.可变报头
- 等待确认的 PUBLISH 报文的报文标识符
二.payload
无
PUBREC(发布收到,step1)
含义:发布收到,对 QoS 等级 2 的 PUBLISH 报文的响应。它是 QoS 2 等级协议交换的第二个报文。
一.固定报头
- 0x50
- 0x02
二.可变报头
- 等待确认的 PUBLISH 报文的报文标识符
二.payload
无
PUBREL(发布释放,Qos2,Step2)
含义:发布释放,报文是对 PUBREC 报文的响应。 它是 QoS 2 等级协议交换的第三个报文。
一.固定报头
- 0x62
- 0x02
二.可变报头
- 等待确认的 PUBREC 报文的报文标识符
二.payload
无
PUBCOMP(发布完成,Qos2,step3)
含义:发布完成,是对 PUBREL 报文的响应。 它是 QoS 2 等级协议交换的第四个也是最后一个报文。
一.固定报头
- 0x70
- 0x02
二.可变报头
- 等待确认的 PUBREL 报文的报文标识符
二.payload
无
下面用wireshark抓下包
Publisher(Qos=0)Subscriber(Qos=0)
30 1f
00 0f 74 65 73 74 2f 73 61 6d 70 6c 65 2f 70 75 62
74 68 69 73 20 69 73 20 61 20 74 65 73 74
Publisher(Qos=1)Subscriber(Qos=1)
32 21
00 0f 74 65 73 74 2f 73 61 6d 70 6c 65 2f 70 75 62 00 04
74 68 69 73 20 69 73 20 61 20 74 65 73 74
Publisher(Qos=2)Subscriber(Qos=2)
34 21
00 0f 74 65 73 74 2f 73 61 6d 70 6c 65 2f 70 75 62 00 0d
74 68 69 73 20 69 73 20 61 20 74 65 73 74