MQTT从入门到提高 | 05MQTT3.1.1之PUBLISH发布工作流

Posted i机器未来

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MQTT从入门到提高 | 05MQTT3.1.1之PUBLISH发布工作流相关的知识,希望对你有一定的参考价值。

这是机器未来的第30篇文章

原文首发地址:https://blog.csdn.net/RobotFutures/article/details/125755790

1. 概述

本文描述了MQTT协议中最核心的应用协议PUBLISH–发布消息工作流。

2. PUBLISH发布消息

PUBLISH 控制包从客户端发送到服务器或从服务器发送到客户端以传输应用程序消息。

2.1 固定报文头

2.1.1 DUP

  • DUP=0时,表明该数据包为首次发送。QoS=0的报文,DUP必须设置为0。
  • DUP=1时,表明该数据包之前已经发送过,本地为重新发送。客户端或服务器重新发送数据包时,必须将DUP设置为1

2.1.2 QoS - 服务质量

QoS=3不得使用,接收端收到QoS=3,应关闭链接。

QoS消息传递的三种服务质量场景:

  • “最多一次”,根据操作环境的最大努力传递消息。可能会发生消息丢失。例如,此级别可用于环境传感器数据,其中单个读数是否丢失并不重要,因为下一个读数将很快发布。
  • “至少一次”,确保消息到达但可能出现重复。
  • “只有1次”,保证消息只到达一次。例如,此级别可用于重复或丢失消息可能导致应用不正确费用的计费系统。

2.1.3 Retain - 保留标志

2.1.3.1 客户端PUBLISH到服务器

  • Retain标志为1,则服务器必须存储应用程序消息及其 QoS,以便可以将其传递给订阅匹配其主题名称的未来订阅者,建立新订阅时,必须将每个匹配主题名称上的最后保留消息(如果有)发送给订阅者 [MQTT-3.3.1-6] 。
  • 如果服务器接收到 RETAIN 标志设置为 1 的 QoS 0 消息,它必须丢弃之前为该主题保留的任何消息,它应该将新的 QoS 0 消息存储为该主题的新保留消息。

2.1.3.2 服务端 PUBLISH到客户端

  • 当向客户端发送 PUBLISH 数据包时,如果由于客户端进行新订阅而发送消息,则服务器必须将 RETAIN 标志设置为 1。客户端收到PUBLISH报文后,客户端将Retain标志置0,而不论报文中的Retain设置为何值,客户端不关系Retain的配置,仅需要知道是保留信息即可。
  • 退出机制:清除保留信息的方法
    • RETAIN=1且负载为空,报文将会转发给订阅客户端,并且会删除服务器保留的保留消息,将来新订阅者不会收到任何保留消息。
    • 如果 RETAIN 标志为 0,则在客户端发送给服务器的 PUBLISH 数据包中,服务器不得存储该消息,也不得删除或替换任何现有的保留消息
  • 应用场景
    • 保留消息在发布者不定期发送状态消息时很有用,新订户将收到最新状态。

2.1.4 Remaining Length剩余长度字段

其包含可变报文头和负载的长度。PUBLISH报文的负载的长度计算公式为
L e n p a y l o a d = L e n r e m a i n i n g l e n − L e n 可 变 报 文 头 Len_payload = Len_remaining_len - Len_可变报文头 Lenpayload=LenremaininglenLen

2.2 可变报文头

2.2.1 Topic Name主题名称

其格式为UTF-8编码字符串,PUBLISH主题名称不能包含通配符。

2.2.2 Package Identifier

仅在QoS=1、2的Publish报文,唯一标识一个发布工作流,用于MQTT Broker、发布者、订阅者之间交互

2.2.3 负载

长度为0的负载也是有效的,数据格式为二进制编码。

2.3 不同QoS下的PUBLISH发布工作流

服务器收到客户端发送的PUBLISH报文后,会根据客户端订阅主题过滤器进行分发,接收的客户端的行为与收到的QoS的值有关,QoS的设置影响PUBLISH发布业务逻辑,其区别如图:

2.3.1 QoS = 0, 最多传递1次,无需确认订阅者是否收到

2.3.2 QoS=1,至少一次传递,保证订阅者至少收到1次

2.3.3 QoS=2,确保订阅者仅收到1次

3. PUBACK

PUBACK 数据包是对具有 QoS 级别 1 的 PUBLISH 数据包的响应。Package Identifier数据包标识符来源于PUBLISH报文中的Package Identifier。

4. PUBREC

PUBREC 数据包是对具有 QoS 2 的 PUBLISH 数据包的响应。它是 QoS 2 协议交换的第二个数据包。Package Identifier数据包标识符来源于PUBLISH报文中的Package Identifier。
4.6 PUBREL

5. PUBREL

PUBREL 数据包是对 PUBREC 数据包的响应。它是 QoS 2 协议交换的第三个数据包。Package Identifier数据包标识符来源于PUBLISH报文中的Package Identifier。
4.7 PUBCOMP

6. PUBCOMP

PUBCOMP 数据包是对 PUBREL 数据包的响应。它是 QoS 2 协议交换的第四个也是最后一个数据包。Package Identifier数据包标识符来源于PUBLISH报文中的Package Identifier。

《MQTT快速入门系列》快速导航:

写在末尾:

  • 博客简介:专注AIoT领域,追逐未来时代的脉搏,记录路途中的技术成长!
  • 专栏简介:从0到1掌握MQTT分布式协议。
  • 面向人群:零基础编程爱好者
  • 专栏计划:接下来会逐步发布跨入人工智能的系列博文,敬请期待

以上是关于MQTT从入门到提高 | 05MQTT3.1.1之PUBLISH发布工作流的主要内容,如果未能解决你的问题,请参考以下文章

物联网之MQTT3.1.1和MQTT5协议 (16) AUTH 报文

物联网之MQTT3.1.1和MQTT5协议 (13) PINGREQ报文

物联网之MQTT3.1.1和MQTT5协议 (12) UNSUBACK 报文

物联网之MQTT3.1.1和MQTT5协议 (17) 操作行为

物联网之MQTT3.1.1和MQTT5协议 (15) DISCONNECT报文

物联网之MQTT3.1.1和MQTT5协议 (18) 安全