MQTT学习笔记(4)报文分析之PUBLISH

2023-05-16


PUBLISH(发布消息)


含义:客户端到服务端或者服务端到客户端发布消息控制报文,是双向的。

一.固定报头
这里写图片描述

DUP 重发标志
当DUP被设置为0,表示客户端或者服务器是第一次发送这个PUBLISH报文
当DUP被设置为1,表示这可能是一个早期报文的重发
当Qos=0时,DUP 必须为0

Qos服务质量等级
这里写图片描述

  • QoS 0(At most once)“至多一次”
    消息发布完全依赖底层 TCP/IP 网络。会发生消息丢失或重复。这一级别可用于如下情况,环境传感器数据,丢失一次读记录无所谓,因为不久后还会有第二次发送。
    这里写图片描述

  • QoS 1(At least once)“至少一次”
    确保消息到达,但消息重复可能会发生。
    这里写图片描述

  • QoS 2(Exactly once)“只有一次”
    这里写图片描述

**注:**发布者或者订阅者设置的QoS分别是和服务器端异步执行的,即使发布者设置发布消息为QoS2,订阅者也可以通过QoS0或QoS1来订阅该消息(这样就是QoS的降级downgrade)。

RETAIN保留标志
如果被置为1,服务端必须存储这个topic和它的QoS ,以便它可以被Broker分发给未来的和主题名匹配的订阅者,但是RETAIN=1的Qos=0的PUBLISH的报文发送服务器后,保留消息可能会被服务器选择丢弃保留消息。
保留消息能使新订阅的客户端立即收到最新的状态消息,而不用等待发布者发送下一个更新,也就是topic的保留标志是最后已知的良好值

如果要删除保留消息,只需向该topic重新publish数据,RETAIN=TRUE,Payload为空,新订阅者就不会收到保留消息。

如果客户端发给服务端的 PUBLISH 报文的保留标志位为0, 服务端不能存储这个消息也不能移除或替换任何现存的保留消息。
MQTT Essentials第8部分:保留消息

二.可变报头

  • 主题名(Topic name)
  • 报文标识符(Package Identify)- -只有当Qos=1,2时才有

三.payload
根据用户自定义


PUBLISH 报文的预期响应


这里写图片描述


PUBACK(发布确认Qos1)


含义:发布确认,对 QoS 1 等级的 PUBLISH 报文的响应
一.固定报头

  • 0x40
  • 0x02

二.可变报头

  • 等待确认的 PUBLISH 报文的报文标识符

二.payload


PUBREC(发布收到,step1)


含义:发布收到,对 QoS 等级 2 的 PUBLISH 报文的响应。它是 QoS 2 等级协议交换的第二个报文。
一.固定报头

  • 0x50
  • 0x02

二.可变报头

  • 等待确认的 PUBLISH 报文的报文标识符

二.payload


PUBREL(发布释放,Qos2,Step2)


含义:发布释放,报文是对 PUBREC 报文的响应。 它是 QoS 2 等级协议交换的第三个报文。
一.固定报头

  • 0x62
  • 0x02

二.可变报头

  • 等待确认的 PUBREC 报文的报文标识符

二.payload


PUBCOMP(发布完成,Qos2,step3)


含义:发布完成,是对 PUBREL 报文的响应。 它是 QoS 2 等级协议交换的第四个也是最后一个报文。
一.固定报头

  • 0x70
  • 0x02

二.可变报头

  • 等待确认的 PUBREL 报文的报文标识符

二.payload

下面用wireshark抓下包
Publisher(Qos=0)Subscriber(Qos=0)
这里写图片描述

30 1f 
00 0f 74 65 73 74 2f 73 61 6d 70 6c 65 2f 70 75 62 
74 68 69 73 20 69 73 20 61 20 74 65 73 74

Publisher(Qos=1)Subscriber(Qos=1)
这里写图片描述

32 21 
00 0f 74 65 73 74 2f 73 61 6d 70 6c 65 2f 70 75 62 00 04 
74 68 69 73 20 69 73 20 61 20 74 65 73 74

这里写图片描述

Publisher(Qos=2)Subscriber(Qos=2)
这里写图片描述

34 21 
00 0f 74 65 73 74 2f 73 61 6d 70 6c 65 2f 70 75 62 00 0d 
74 68 69 73 20 69 73 20 61 20 74 65 73 74   

这里写图片描述

这里写图片描述

这里写图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MQTT学习笔记(4)报文分析之PUBLISH 的相关文章

随机推荐

  • 每日一篇论文推荐

    每日一篇论文推荐 7 5 Unsupervised Hyperspectral Denoising Based on Deep Image Prior and Least Favorable Distribution7 6 WINNet W
  • ISP图像信号处理 | GAMES204-计算成像

    图像信号处理 GAMES204 计算成像 Dead Pixel CorrectionBlack Level CompensationAnti aliasingLens Shading CorrectionNoise Reduction3AS
  • np.max()、np.argmax()、np.maximum()、np.min()、np.argmin()、np.minimum()、np.sum()

    numpy专题 最值 求和 最大值np max np argmax np maximum 求和np sum 网上已经有很多对于这几个函数的讲解资料 xff0c 但总感觉讲得有些乱 xff0c 特别是对于高维数组 xff0c 如果指定了某个轴
  • Cortex-M3 (NXP LPC1788)之EEPROM存储器

    EEPROM是一种非易失性存储器 xff0c 主要用于存储相对少量的数据 xff0c 如存储一些系统的配置信息 通过系统的EEPROM控制模块可以轻松的进行EERPOM的存储控制 要正确使用EEPROM需要配置掉电寄存器EEPWRDWN确定
  • sqlalchemy.exc.ArgumentError: Could not parse rfc1738 URL from string

    错误信息 sqlalchemy exc ArgumentError Could not parse rfc1738 URL from string 原 flask sqlacodegen mysql root 64 127 0 0 1 fo
  • 面试题汇总:网络编程

    1 tcp和udp的区别 xff1f xff08 1 xff09 TCP面向连接 xff08 如打电话要先拨号建立连接 xff09 UDP是无连接的 xff0c 即发送数据之前不需要建立连接 xff1b xff08 2 xff09 TCP提
  • CentOS7 安装学之思开源考试系统Mysql版

    环境介绍 序号项目版本1操作系统CentOS Linux release 7 9 2009 Core 2redis7 0 03Mysqlmysql Ver 8 0 29 for Linux on x86 64 MySQL Community
  • Cisco catalyst 交换机升级步骤

    交换机升级步骤 1 准备一个FAT32的U盘 2 到cisco官网上下载交换机镜像 3 将U盘插到交换机上 xff0c 登入交换机concole输入dir usbflash0 xff1a 找到该镜像 xff0c 注意镜像不要放在中文目录下
  • 【性能】【内存】zram解读

    1 背景 nbsp 通过压缩长时间不在前台的进程来节省内存占用 不会像swap一样频繁操作闪存 也可以减少IO操作节省资源 延长闪存寿命 不过内存压缩是一种用时间换空间 的方式 cpu解压缩过程也是需要消耗少量cpu资源 尽管当前andro
  • wifi连接过程抓包

    下面是一次wifi连接过程发送数据的抓包 xff0c 有些包没抓到 xff0c 但还是比较全的 1 4包 xff0c 探测请求 响应过程 STA发出探测请求包Probe ReqAP做出回应 xff0c 发出探测响应包Probe Rsp 5
  • mbedtls学习(6)RSA算法

    RSA算法 RSA算法是一种非对称加密算法 xff0c 特点时加密解密算法不同且加密解密密钥不同 xff0c 即一般公钥加密 xff0c 私钥解密 下面时RSA算法关键参数 n 模数 xff0c 位长度为1024比特或者2048比特e 公开
  • LVGL lv_label标签控件(5)

    lv label 相关API在lv label h中 文本模式 span class token keyword enum span span class token punctuation span span class token co
  • LVGL lv_page页面控件(23)

    lv page 页面控件 xff0c 是由2个lv cont容器控件构成 xff0c 其中一个容器作为lv page页面控件的背景层 xff0c 另一个容器作为lv page页面控件的载体 xff0c 此载体存放其他任何子对象 xff0c
  • FreeRTOS消息队列、信号量、互斥量、递归互斥量实现步骤

    文章目录 消息队列消息队列结构读队列步骤写队列步骤 作用 信号量信号量结构 获取信号量释放信号量 互斥量 xff08 锁 xff09 互斥量结构 获取互斥量释放互斥量 递归互斥量 xff08 递归锁 xff09 获取递归互斥量释放递归互斥量
  • GDB调试宏

    参考 GDB需要调试宏只需用 g3选项编译 g 默认选项 xff0c 同 g2 g0 不生成任何调试信息 xff0c 和编译时不加 g 是一样的 g1 生成最少量的调试信息 xff0c 这些信息足够用来通过backtrace查看调用栈符号信
  • GDB格式化打印结构体

    参考 GDB pretty print set print pretty on GDB 打印数组索引 set print array span class token operator span indexes on 例子 span cla
  • 8080接口

    文章目录 简介引脚写时序读时序 简介 8080接口是由英特尔设计 xff0c 是一种并行 异步 半双工通信协议 xff0c 作用是用于外扩RAM ROM xff0c 后面也用于LCD接口 引脚 写时序 先拉低选中器件 xff0c 如果要写入
  • Centos 7离线安装最新版mysql

    测试环境 CentOS Linux release 7 9 2009 Core 1 准备工作 下载离线安装包 xff1a 1 1 浏览器打开地址 xff1a https dev mysql com downloads mysql 1 2 选
  • C语言UDP socket编程

    C语言UDP socket编程 UDP 服务器步骤如下 xff1a 1 创建等链接套接字fd 61 socket 2 绑定待链接套接字bind fd 服务器ip和端口 3 等待信息recvfrom fd 对端地址 UDP 客户端步骤如下 x
  • MQTT学习笔记(4)报文分析之PUBLISH

    PUBLISH xff08 发布消息 xff09 含义 xff1a 客户端到服务端或者服务端到客户端发布消息控制报文 xff0c 是双向的 一 固定报头 DUP 重发标志 当DUP被设置为0 xff0c 表示客户端或者服务器是第一次发送这个