MQTT协议(四)>>> 【PUBLISH】发布消息
PUBLISH控制报文是指从客户端向服务端或者服务端向客户端传输一个应用消息。
需要注意的是:上传更新数据流是PUBLISH 中一个特殊的上传方式(发送给 $dp话题),PUBLISH 不等于上传更新数据流。
PUBLISH 更像是发送邮件,而更新数据是针对某一特定数据流进行数据更新。
固定报头
重发标志 DUP
位置:第1个字节,第3位
如果DUP标志被设置为0,表示这是客户端或服务端第一次请求发送这个PUBLISH报文。如果DUP标志被设置为1,表示这可能是一个早前报文请求的重发。
客户端或服务端请求重发一个PUBLISH报文时,必须将DUP标志设置为1。
对于QoS 0的消息,DUP标志必须设置为0。
服务端发送PUBLISH报文给订阅者时,收到(入站)的PUBLISH报文的DUP标志的值不会被传播。
发送(出站)的PUBLISH报文与收到(入站)的PUBLISH报文中的DUP标志是独立设置的,它的值必须单独的根据发送(出站)的PUBLISH报文是否是一个重发来确定。
服务质量等级
位置:第1个字节,第2-1位。
保留标志 RETAIN
位置:第1个字节,第0位。
如果客户端发给服务端的PUBLISH报文的保留(RETAIN)标志被设置为1,服务端必须存储这个应用消息和它的服务质量等级(QoS)。
即将消息存储起来,以后有客户端订阅该主题就把之前的消息发出去
剩余长度字段
等于可变报头的长度加上有效载荷的长度。
可变报头
主题名 Topic Name
主题名(Topic Name)用于识别有效载荷数据应该被发布到哪一个信息通道。
主题名必须是PUBLISH报文可变报头的第一个字段。
PUBLISH报文中的主题名不能包含通配符。
报文标识符 Packet Identifier
只有当QoS等级是1或2时,报文标识符(Packet Identifier)字段才能出现在PUBLISH报文中。
如下为PUBLISH 报文可变报头示例:
因为主题名占了3字节,故报文标识符为10
有效载荷
有效载荷包含将被发布的应用消息。即纯文本字符串、JSON 字符串。
数据的内容和格式是应用特定的。
响应
PUBLISH报文的接收者必须按照根据PUBLISH报文中的QoS等级发送响应
动作 Actions
客户端使用PUBLISH报文发送应用消息给服务端,目的是分发到其它订阅匹配的客户端。
服务端使用PUBLISH报文发送应用消息给每一个订阅匹配的客户端。