MQTT协议(三)——控制报文之发布消息(PUBLISH)、发布确认(PUBACK)、发布收到(PUBREC)、发布释放(PUBREL)和发布完成(PUBCOMP)
一、消息发布
PUBLISH控制报文不光是客户端发送给服务端,也能服务端发送给客户端,就是个传递应用消息的。
1.固定头
推送的固定头报文类型是3。
DUP是重发标志,如果DUP标志被设置为0,表示这是客户端或服务端第一次请求发送这个PUBLISH报文。如果DUP标志被设置为1,表示这可能是一个早前报文请求的重发。
Qos是服务质量等级,有三种状态。
RETAIN是保留位,保留位的意义上一篇已经阐述。值得注意的是如果想清除一个在服务端有保留有效荷载的topic,只要发送一个保留位为1切有效荷载为零字节的publish报文就行,
服务端会把这个空报文转发给订阅者,并清除这个topic的保留信息,后续再关注这个topic的客户端不会再收到消息了。
2.可变头
可变报头按顺序包含主题名和报文标识符。
主题名就是平时说的topic,推送订阅都是依靠这个标识,可以理解为其他mq的topic。
报文标识符就是报文的id,服务端用来唯一标识报文的属性,只有当QoS等级是1或2时,报文标识符(Packet Identifier)字段才能出现在PUBLISH报文中,因为这俩需要服务端答复
客户端,如果没有这个标识,服务端不知道要针对哪条报文进行答复。
可变头示例:
示例中的主题名为 “a/b”,长度等于3,报文标识符为 “10”
3.有效载荷
有效载荷包含将被发布的应用消息。数据的内容和格式是应用特定的。有效载荷的长度这样计算:用固定报头中的剩余长度字段的值减去可变报头的长度。包含零长度有效载荷的PUBLISH报文是合法的。
注意:根据固定头中的qos等级,接收到publish报文端需要给予响应。
这里补充一下qos:
qos0:最多就发送一次,你别告诉我你收没收到,你找到订阅这个主题的你就推就行。
qos1:至少发送一次,发送完你告诉我你收没收到(PUBACK),如果你不告诉我,我就一直发。
qos2:确保一次送达,我给你发(PUBLISH),你给我回一个你收到了(PUBREC),我再给你发一个你确定你收到了吗(PUBREL),你再给我回一个收到了别发了求你了(PUBCOMP)
二、发布确认
PUBACK报文是对QoS 1等级的PUBLISH报文的响应。
1.固定头
没啥说的,类型4.
2.可变头
可变头就俩个字节。就是报文标识符。
3.有效载荷
无
三、发布收到
PUBREC报文是对QoS等级2的PUBLISH报文的响应。它是QoS 2等级协议交换的第二个报文。
1.固定头
没啥说的,类型5.
2.可变头
可变头就俩个字节。就是报文标识符。
3.有效载荷
无
四、发布释放
PUBREL报文是对PUBREC报文的响应。它是QoS 2等级协议交换的第三个报文。
1.固定头
没啥说的,类型6.
2.可变头
可变头就俩个字节。就是报文标识符。
3.有效载荷
无
五、发布完成
PUBCOMP报文是对PUBREL报文的响应。它是QoS 2等级协议交换的第四个也是最后一个报文。
1.固定头
没啥说的,类型7.
2.可变头
可变头就俩个字节。就是报文标识符。
3.有效载荷
无