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.有效载荷

 

posted @ 2020-12-09 16:56  胖达利亚  阅读(5534)  评论(0编辑  收藏  举报