首页 > 其他分享 >MQTT控制报文格式 -- PUBLISH 消息发布

MQTT控制报文格式 -- PUBLISH 消息发布

时间:2023-10-16 14:55:52浏览次数:35  
标签:QoS 报文格式 -- PUBLISH 消息 数据包 服务端 客户端

该数据包定义了客户端和服务端发布MQTT消息格式。

1. 固定包头 Fixed header

Bit

7

6

5

4

3

2

1

0

byte 1

MQTT Control Packet type (3)

DUP flag

QoS level

RETAIN

 

0

0

1

1

X

X

X

X

byte 2

Remaining Length

固定包头的第一个字节描述如下
  • 高4位表示数据包类型
  • bit3 DUP flag 重传标志,重传的数据包,该位为1,所有QoS 0 的消息,该位永远为0
  • bit1-bit2 QoS Level 服务质量级别,值为 0,1,2
  • bit0 RETAIN 保留标识位,如果值=1 ,则要求接收方必须存储消息,以便将其传递给其他订阅者。如果接收方收到QoS 0 消息且RETAIN=1,则它必须丢弃先前为该主题保留的任何消息。而保存当前消息作为新保留消息。当向客户端发送PUBLISH 包时,如果客户端进行新订阅而发送消息,则服务端需要将RETAIN标志设置为1。
    保留标志位1且Payload部分为0 的数据包也将由接收方正常处理,并发送到订阅主题名称匹配的客户端。
    如果RETAIN=0 ,则接收方不得存储该消息,也不得删除或替换任何现有的保留消息。

第2-5个字节表示剩余长度

2. 可变包头 Variable Header

PUBLISH数据包的可变包头依次包含两个部分,主题名称Topic Name 和报文标识 Packet Identifier

2.1 主题名称 Topic Name

主题名称以UTF-8编码,PUBLISH包的主题名称不包含通配符(区别于订阅)
服务器发送到订阅客户端的PUBLISH 数据包中的主题名称必须与订阅主题匹配。由于允许服务器覆盖主题名称,因此它可能与原始PUBLISH数据包中的主题名称不同。

2.2 报文标识 Packet Identifier

该字段仅出现在 QoS1 和QoS 2 的消息中,以UTF-8字符编码

3. 载荷 Paylaod

以UTF-8 编码的应用消息,Payload 部分的长度可以通过从固定包头的剩余长度字段中减去可变包头的长度来计算。
Payload长度为0 也是有效的PUBLISH 消息。

4. 响应和动作

4.1 Response

接收方收到PUBLISH 消息后,必须按下表进行响应

Qos Level Response
QoS 0 None
QoS 1 PUBACK
QoS 2 PUBREC

4.2 Actions

客户端使用PUBLISH 消息发送给服务端,以便服务端(Broker)分发
服务端使用PUBLISH 消息发送给订阅主题匹配的每个客户端。
当客户端使用的是包含通配符的主题过滤器订阅时,客户端的订阅可能会重叠,发布的消息可能与多个过滤器匹配。此时,服务端需要尽可能将消息传递给客户端,遵守匹配订阅的最大QoS 级别来发送消息。
接收放收到PUBLISH 数据包时的操作取决于QoS级别,如果服务端实现未授权客户端执行发布,它无法通知该客户端。它必须根据正常的QoS规则做出肯定的确认,或者关闭网络连接。

标签:QoS,报文格式,--,PUBLISH,消息,数据包,服务端,客户端
From: https://www.cnblogs.com/aimigi/p/17767042.html

相关文章

  • milkv-duo启动流程分析:手动构建boot.sd
    目录上电测试制作boot.sd编译Linux内核multi.its上电测试在上一篇,我们构建了fip.bin。让我们继续用以前的boot.sd。我们插上电源,U-Boot2021.10(Oct152023-14:17:51+0800)cvitek_cv180xDRAM:63.3MiBgd->relocaddr=0x82435000.offset=0x2235000MMC:cv-sd@43100......
  • Python处理Request请求
    一、HTTP知识:request请求方式有GET/POST/PUT/PATCH/DELETE/COPY/HEAD/OPTIONS/LINK/VIEW等常用的request请求有:get和post两种形式。1.GET用于获取资源,当采用GET方式请求指定资源时,被访问的资源经服务器解析后立即返回响应内容。通常以GET方式请求特定资源时,请求中不应该......
  • Bulk RNA-seq process
    目的:对illumina数据进行处理,利用RNA-Seq发现新的RNA变体和剪接位点,或量化mRNA以进行基因表达分析等。对两组或多组样本的转录组数据,通过差异表达分析和对所发现的差异表达基因集合进行功能富集分析以推断生物学功能。数据准备:数据下载:Human genome(GRCh38/hg3):Indexo......
  • 设计模式01 —— 设计模式简介
    设计模式01——设计模式简介本教程参考:菜鸟教程-学的不仅是技术,更是梦想!(runoob.com)为本人学习笔记,和课程学习笔记,希望各位大佬多多指点!设计模式的简介设计模式可以看作一套被人反复使用的,多人知晓的代码设计的经验总结。设计模式是软件工程的基石。以下是完全版:设......
  • 约瑟夫环问题
    我今天要讲的问题是约瑟夫环问题。本蒟蒻第一篇学术文章,多多支持,写的不好请见谅。洛谷题库约瑟夫环问题这题是一道好题目,我这里推荐两种解法1.直接模拟我用了一个数组来模拟,在圈内为无穷大,不在圈内则为0。模拟时要注意以下几点:如果当前已经出了圈,那么这个位置不算一人。......
  • Gym101064L The Knapsack problem
    CF传送门发现物品的体积很小,尝试从此处入手。设\(K\)为最大的物品体积。把背包体积\(m\)分成差不超过\(K\)的两部分,然后合并。这样需要求出\(f(\frac{m}{2}-K\sim\frac{m}{2}+K)\)。递归地,可以发现需要求出\(f(\frac{m}{2^k}-K\sim\frac{m}{2^k}+K)\)。最......
  • Go - Creating a TCP Client
    Problem: YouwanttocreateaTCPclienttosenddatatoaTCPserver.Solution: UsetheDialfunctioninthenetpackagetoconnecttoaTCPserver. CreatingaTCPclientissimilartocreatingaTCPserverbutevensimpler.Themaindifferenceistha......
  • html 电脑端banner图片百分比自动缩放
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>Title</title><style>.banner_pic{width:100%;height:284px;bor......
  • PySyft官方文档
    可以直接看官方的,其他材料参差不齐。https://github.com/OpenMined/PySyft/tree/syft_0.2.x/examples/tutorials官方公司是https://www.openmined.org/,openmined。注意是openmined,不是openmind!好多以讹传讹的,真是醉了。......
  • 「解题报告」[ABC267F] Exactly K Steps
    「解题报告」[ABC267F]ExactlyKSteps大家好,我是个毒瘤,我非常喜欢没脑子做法,于是我就用点分治过了这个题.离线在每个点存下与其相关的询问.考虑如何计算跨重心的答案.记录下每个点在当前重心下的深度,同时开一个桶\(t_{k,0/1}\)存下当前深度为\(k\)的,来自重心的不同......