MQTT协议(三)

一.PUBLISH报文

1、固定报头

(1)  重发标志DUP:如果DUP标志被设置为0, 表示第一次请求发送这个PUBLISH报文,如果DUP标志被设置为1, 表示这可能是一个早前报文请求的重发。客户端或服务器请求重发一个PUBLISH报文时, 必须将DUP标志设置为1,另外对于QoS0的消息, DUP标志必须设置为0

(2) 服务质量等级 QoS:这个字段表示消息分发的服务质量等级保证,PUBLISH报文不能将QoS所有的位设置为1。如果服务器或客户端收到QoS所有位都为1的PUBLISH报文, 它必须要关闭网络连接

(3)  保留标志 RETAIN:如果客户端发给服务器的PUBLISH报文的保留(RETAIN)标志被设置为1, 服务器要存储这个应用消息和它的服务质量等级(QoS),以便它可以被分发给未来的主题名匹配的订阅者 。一个新的订阅建立时,如果匹配的主题名存在最近保留的消息,它必须被发送给这个订阅者。如果服务器收到一条保留(RETAIN)标志为1的QoS0消息, 它必须丢弃之前为那个主题保留的任何消息,而且应该将这个新的QoS0消息当作那个主题的新保留消息, 但是任何时候都可以选择丢弃它,如果这种情况发生了, 那么那个主题将没有保留消息。服务器发送PUBLISH报文给客户端时,如果是一个新订阅客户端, 它必须将报文的保留标志设为1 ,如果是发送给一个已建立的订阅客户端, 服务端必须将保留标志设为0,而不管它收到的这个消息中保留标志的值

(4)  剩余长度字段:等于可变报头的长度加上有效载荷的长度

2、可变报头:可变报头包含主题名和报文标识符

(1) 主题名 Topic Name:主题名(Topic Name)用于决定有效载荷数据应该被发布到那个信息通道,它是 UTF-8编码的字符串,PUBLISH报文中的主题名不能包含通配符,服务器会根据客户端PUBLISH报文的主题名来匹配客户端订阅的主题过滤器

(2) 报文标识符 Packet Identifier:只有当QoS是1或2时, 报文标识符( Packet Identifier) 字段才能出现在PUBLISH报文

示例(主题名为a/b,报文标识符为10)

3、有效载荷:有效载荷包含将被发布的应用消息。 有效载荷的长度这样计算: 用固定报头中的剩余长度字段的值减去可变报头的长度。可以有零长度有效载荷的

4、响应:PUBLISH报文的接收者根据PUBLISH报文中的QoS等级发送响应

5、动作Actions:客户端使用PUBLISH报文发送应用消息给服务器,然后服务器使用PUBLISH报文分发应用消息给每一个订阅匹配的客户端。客户端使用带通配符的主题过滤器请求订阅时, 发布消息的主题可能会匹配多个过滤器。 对于这种情况, 服务器先分发给所有订阅匹配的QoS等级最高的客户端,之后按照订阅的QoS等级分发给每一个匹配的订阅者

二.PUBACK报文

PUBACK报文是对QoS1等级的PUBLISH报文的响应。

1、固定报头

剩余长度字段:表示可变报头的长度,对PUBACK报文这个值等于2

2、可变报头:包含了等待确认的PUBLISH报文的报文标识符。

3、有效载荷:没有

猜你喜欢

转载自blog.csdn.net/qq_21231413/article/details/88245187