MQTT从入门到提高(五):MQTT3.1.1协议应用详解(3)- PUBLISH
文章目录
相关博文:
- MQTT3.1.1 Plus Errata 01中文翻译
- MQTT从入门到提高(一):从0到1快速搭建MQTT测试环境
- MQTT从入门到提高(二):MQTT TLS加密传输
- MQTT从入门到提高(三):MQTT3.1.1协议应用详解(1)- 协议框架
- MQTT从入门到提高(四):MQTT3.1.1协议应用详解(2)- CONNECT
- MQTT从入门到提高(五):MQTT3.1.1协议应用详解(3)- PUBLISH
4. MQTT控制包详解
4.3 PUBLISH——发布消息
PUBLISH 控制包从客户端发送到服务器或从服务器发送到客户端以传输应用程序消息。
4.3.1 固定报文头
-
DUP
- DUP=0时,表明该数据包为首次发送。QoS=0的报文,DUP必须设置为0。
- DUP=1时,表明该数据包之前已经发送过,本地为重新发送。客户端或服务器重新发送数据包时,必须将DUP设置为1
-
QoS
QoS=3不得使用,接收端收到QoS=3,应关闭链接。
QoS消息传递的三种服务质量场景:- “最多一次”,根据操作环境的最大努力传递消息。可能会发生消息丢失。例如,此级别可用于环境传感器数据,其中单个读数是否丢失并不重要,因为下一个读数将很快发布。
- “至少一次”,确保消息到达但可能出现重复。
- “只有1此”,保证消息只到达一次。例如,此级别可用于重复或丢失消息可能导致应用不正确费用的计费系统。
-
Retain - 保留标志
- 客户端PUBLISH到服务器
- Retain标志为1,则服务器必须存储应用程序消息及其 QoS,以便可以将其传递给订阅匹配其主题名称的未来订阅者,建立新订阅时,必须将每个匹配主题名称上的最后保留消息(如果有)发送给订阅者 [MQTT-3.3.1-6] 。
- 如果服务器接收到 RETAIN 标志设置为 1 的 QoS 0 消息,它必须丢弃之前为该主题保留的任何消息,它应该将新的 QoS 0 消息存储为该主题的新保留消息。
- Retain标志为1,则服务器必须存储应用程序消息及其 QoS,以便可以将其传递给订阅匹配其主题名称的未来订阅者,建立新订阅时,必须将每个匹配主题名称上的最后保留消息(如果有)发送给订阅者 [MQTT-3.3.1-6] 。
- 服务端 PUBLISH到客户端
- 当向客户端发送 PUBLISH 数据包时,如果由于客户端进行新订阅而发送消息,则服务器必须将 RETAIN 标志设置为 1。客户端收到PUBLISH报文后,客户端将Retain标志置0,而不论报文中的Retain设置为何值,客户端不关系Retain的配置,仅需要知道是保留信息即可。
- 退出机制:清除保留信息的方法
- RETAIN=1且负载为空,报文将会转发给订阅客户端,并且会删除服务器保留的保留消息,将来新订阅者不会收到任何保留消息。 - 如果 RETAIN 标志为 0,则在客户端发送给服务器的 PUBLISH 数据包中,服务器不得存储该消息,也不得删除或替换任何现有的保留消息
- 应用场景
- 保留消息在发布者不定期发送状态消息时很有用,新订户将收到最新状态。
- 客户端PUBLISH到服务器
-
Remaining Length剩余长度字段
其包含可变报文头和负载的长度。PUBLISH报文的负载的长度计算公式为
Le n p a y l o a d=Le n r e m a i n i n g l e n−Le n 可 变 报 文 头 Len_{payload} = Len_{remaining_len} - Len_{可变报文头}Lenpayload=Lenremaininglen−Len可变报文头
4.3.2 可变报文头
-
Topic Name主题名称
其格式为UTF-8编码字符串,PUBLISH主题名称不能包含通配符。 -
Package Identifier
仅在QoS=1、2的Publish报文
4.3.3 负载
长度为0的负载也是有效的,数据格式为二进制编码。
4.3.4 行动
服务器收到客户端发送的PUBLISH报文后,会根据客户端订阅主题过滤器进行分发,接收的客户端的行为与收到的QoS的值有关,QoS的设置影响PUBLISH发布业务逻辑,其区别如图:
4.4 PUBACK
PUBACK 数据包是对具有 QoS 级别 1 的 PUBLISH 数据包的响应。Package Identifier数据包标识符来源于PUBLISH报文中的Package Identifier。
4.5 PUBREC
PUBREC 数据包是对具有 QoS 2 的 PUBLISH 数据包的响应。它是 QoS 2 协议交换的第二个数据包。Package Identifier数据包标识符来源于PUBLISH报文中的Package Identifier。
4.6 PUBREL
PUBREL 数据包是对 PUBREC 数据包的响应。它是 QoS 2 协议交换的第三个数据包。Package Identifier数据包标识符来源于PUBLISH报文中的Package Identifier。
4.7 PUBCOMP
PUBCOMP 数据包是对 PUBREL 数据包的响应。它是 QoS 2 协议交换的第四个也是最后一个数据包。Package Identifier数据包标识符来源于PUBLISH报文中的Package Identifier。
相关博文:
- MQTT3.1.1 Plus Errata 01中文翻译
- MQTT从入门到提高(一):从0到1快速搭建MQTT测试环境
- MQTT从入门到提高(二):MQTT TLS加密传输
- MQTT从入门到提高(三):MQTT3.1.1协议应用详解(一)
- MQTT从入门到提高(四):MQTT3.1.1协议应用详解(二)- CONNECT