MQTT 控制报文 - SUBSCRIBE订阅报文,SUBACK,UNSUBSCRIBE,UNSUBACK - 第5章

2023-11-01

目录

5.1 SUBSCRIBE - 订阅主题报文

5.1.1 固定报头

5.1.2 可变报头

5.1.3 有效载荷

5.2 SUBACK - 订阅确认

5.2.1 固定报头

5.2.2 可变报头

5.2.3 有效载荷

5.3 UNSUBSCRIBE - 取消订阅

5.3.1 固定报头

5.3.2 可变报头

5.3.3 有效载荷

5.4 UNSUBACK - 取消订阅确认

5.4.1 固定报头

5.4.2 可变报头


5.1 SUBSCRIBE - 订阅主题报文

客户端向服务端发送SUBSCRIBE报文用于创建一个或多个订阅。每个订阅注册客户端关心的一个或多个主题。为了将应用消息转发给那些订阅匹配的主题,服务端发送PUBLISH报文给客户端。SUBSCRIBE报文也(为每个订阅)指定了最大的QoS等级,服务端根据这个发送应用消息给客户端。

 

5.1.1 固定报头

 

SUBSCRIBE 固定报头 的数据格式
  Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
byte 1 MQTT 报文的类型(8 - SUBSCRIBE) Reserved 保留位
8,0x8 - SUBSCRIBE 0 0 1 0
byte 2~4 剩余长度
 

 

SUBSCRIBE控制报固定报头的第3,2,1,0位是保留位,必须分别设置为0,0,1,0。服务端必须将其它的任何值都当做是不合法的并关闭网络连接。

剩余长度字段:等于SUBSCRIBE可变报头的长度(2字节)加上有效载荷的长度。

 

 

5.1.2 可变报头

可变报头包含客户端报文标识符。

报文标识符相当于自定义的Topic的ID,用ID号去代替具体的Topic,而不是字段,使得区分发来的Topic的同时又可以节省流量,可自定义,建议自己预先拟定一个服务ID表。

订阅返回,返回Topic订阅成功信息,返回的不是具体Topic,返回的就是报文标识符。

 

SUBSCRIBE 可变报头 的数据格式
byte 1 报文标识符 MSB
byte 2 报文标识符 LSB

 

 

5.1.3 有效载荷

SUBSCRIBE报文的有效载荷包含了一个主题过滤器列表,它们表示客户端想要订阅的主题。SUBSCRIBE报文有效载荷中的主题过滤器列表必须是UTF-8字符串。服务端应该支持包含通配符的主题过滤器。如果服务端选择不支持包含通配符的主题过滤器,必须拒绝任何包含通配符过滤器的订阅请求。每一个过滤器后面跟着一个字节,这个字节被叫做 服务质量要求(Requested QoS)。它给出了服务端向客户端发送应用消息所允许的最大QoS等级。

SUBSCRIBE报文的有效载荷必须包含至少一对主题过滤器 和 QoS等级字段组合。没有有效载荷的SUBSCRIBE报文是违反协议的。

 

SUBSCRIBE 有效载荷 的数据格式
byte 1 Topic长度 MSB
byte 2 Topic长度 LSB
byte 3...N 主题过滤器(Topic Filter)
byte N+1 服务质量要求(Requested QoS)
   
byte N+2 Topic长度 MSB
byte N+3 Topic长度 LSB
byte N+4...X 主题过滤器(Topic Filter)
byte X+1 服务质量要求(Requested QoS)
... ... ... ...

 

当前版本的协议没有用到服务质量要求(Requested QoS)字节的高六位。如果有效载荷中的任何位是非零值,或者QoS不等于0,1或2,服务端必须认为SUBSCRIBE报文是不合法的并关闭网络连接。

响应:服务端收到客户端发送的一个SUBSCRIBE报文时,必须使用SUBACK报文响应。

服务端发送给客户端的SUBACK报文对每一对主题过滤器 和QoS等级都必须包含一个返回码。这个返回码必须表示那个订阅被授予的最大QoS等级,或者表示这个订阅失败。服务端可以授予比订阅者要求的低一些的QoS等级。为响应订阅而发出的消息的有效载荷的QoS必须是原始发布消息的QoS和服务端授予的QoS两者中的最小值。如果原始消息的QoS是1而被授予的最大QoS是0,允许服务端重复发送一个消息的副本给订阅者。

 

 

5.2 SUBACK - 订阅确认

服务端发送SUBACK报文给客户端,用于确认它已收到并且正在处理SUBSCRIBE报文。

SUBACK报文包含一个返回码清单,它们指定了SUBSCRIBE请求的每个订阅被授予的最大QoS等级。

 

 

5.2.1 固定报头

 

SUBACK 固定报头 的数据格式
  Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
byte 1 MQTT 报文的类型(9 - SUBACK) Reserved 保留位
9,0x9 - SUBACK 0 0 0 0
byte 2 剩余长度
 

 

 

5.2.2 可变报头

可变报头包含等待确认的SUBSCRIBE报文的报文标识符。

 

SUBACK 可变报头 的数据格式
byte 1 报文标识符 MSB
byte 2 报文标识符 LSB

 

5.2.3 有效载荷

有效载荷包含一个返回码清单。每个返回码对应等待确认的SUBSCRIBE报文中的一个主题过滤器。返回码的顺序必须和SUBSCRIBE报文中主题过滤器的顺序相同。

下面表格描述了有效载荷中单字节编码的返回码字段。

 

SUBACK 有效载荷 的数据格式
  Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
byte 1 返回码
X 0 0 0 0 0 X X

 

允许的返回码值:

0x00 - 最大 Qos0

0x01 - 成功 - 最大 Qos1

0x02 - 成功 - 最大 Qos2

0x80 - Failure 失败

0x00, 0x01, 0x02, 0x80之外的SUBACK返回码是保留的,不能使用。

 

 

5.3 UNSUBSCRIBE - 取消订阅

客户端发送UNSUBSCRIBE报文给服务端,用于取消订阅主题。

 

5.3.1 固定报头

 

UNSUBSCRIBE 固定报头 的数据格式
  Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
byte 1 MQTT 报文的类型(10 - UNSUBSCRIBE) Reserved 保留位
10,0xA - UNSUBSCRIBE 0 0 1 0
byte 2~4 剩余长度
 

 

UNSUBSCRIBE报文固定报头的第3,2,1,0位是保留位且必须分别设置为0,0,1,0。服务端必须认为任何其它的值都是不合法的并关闭网络连接。

 

5.3.2 可变报头

可变报头包含一个报文标识符。

UNSUBSCRIBE 可变报头 的数据格式
byte 1 报文标识符 MSB
byte 2 报文标识符 LSB

 

5.3.3 有效载荷

UNSUBSCRIBE报文的有效载荷包含客户端想要取消订阅的主题过滤器列表。UNSUBSCRIBE报文中的主题过滤器必须是连续打包的UTF-8编码字符串。

UNSUBSCRIBE报文的有效载荷必须至少包含一个消息过滤器。没有有效载荷的UNSUBSCRIBE报文是违反协议的。

 

UNSUBSCRIBE 有效载荷 的数据格式
byte 1 Topic长度 MSB
byte 2 Topic长度 LSB
byte 3...N 主题过滤器(Topic Filter)
   
byte N+1 Topic长度 MSB
byte N+2 Topic长度 LSB
byte N+3...X 主题过滤器(Topic Filter)
... ... ... ...

 

UNSUBSCRIBE的有效载荷比SUBSCRIBE少了服务质量要求(Requested QoS)。

响应:UNSUBSCRIBE报文提供的主题过滤器(无论是否包含通配符)必须与服务端持有的这个客户端的当前主题过滤器集合逐个字符比较。如果有任何过滤器完全匹配,那么它(服务端)自己的订阅将被删除,否则不会有进一步的处理

如果服务端删除了一个订阅:

  1. 它必须停止分发任何新消息给这个客户端。
  2. 它必须完成分发任何已经开始往客户端发送的QoS 1和QoS 2的消息。
  3. 它可以继续发送任何现存的准备分发给客户端的缓存消息。

服务端必须发送UNSUBACK报文响应客户端的UNSUBSCRIBE请求。UNSUBACK报文必须包含和UNSUBSCRIBE报文相同的报文标识符 。即使没有删除任何主题订阅,服务端也必须发送一个SUBACK响应。

 

 

5.4 UNSUBACK - 取消订阅确认

服务端发送UNSUBACK报文给客户端用于确认收到UNSUBSCRIBE报文。

 

5.4.1 固定报头

 

UNSUBACK​​​​​​​​​​​​​​ 固定报头 的数据格式
  Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
byte 1 MQTT 报文的类型(11 - UNSUBACK) Reserved 保留位
11,0xB - UNSUBACK 0 0 0 0
byte 2 剩余长度
0x02

 

剩余长度字段:表示可变报头的长度,对UNSUBACK报文这个值等于2。

 

5.4.2 可变报头

可变报头包含等待确认的UNSUBSCRIBE报文的报文标识符。

 

UNSUBACK​​​​​​​ 可变报头 的数据格式
byte 1 报文标识符 MSB
byte 2 报文标识符 LSB

 

UNSUBACK报文没有有效载荷

 

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

MQTT 控制报文 - SUBSCRIBE订阅报文,SUBACK,UNSUBSCRIBE,UNSUBACK - 第5章 的相关文章

  • 基于select实现socket的超时功能

    今天遇到一个要求 套接字连上之后 由于在recv数据时就阻塞住了 一般会要求等待5s之后假如超时就返回失败 通过select实现了一下要求 define BUF SIZE 128 define RESPONSE TIMEOUT 5 int
  • Unity 输出图集中的图片

    1 大图导入unity 修改配置 Texture Type Sprite 2D and UI Sprite Mode Multiple Read Write enabled true format RGBA 32 bit 脚本如下 usin
  • finereport普通报表的移动端自适应方案

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 移动端报表呈现 首先要求的是页面随手机屏幕大小自动放缩 自适应 下面给出一个普通报表中的finereport移动端自适应方案 适用于finereport 7 1之前的版本
  • 常用的正则表达式

    Email地址 w w w w w w 域名 a zA Z0 9 a zA Z0 9 0 62 a zA Z0 9 a zA Z0 9 0 62 电话号码 1 3 d 4 5 9 5 0 35 9 6 2567 7 0 8 8 d 9 0
  • CTFshow web入门 web2

    CTFshow web入门 web2 点开链接 发现鼠标右键无法调出快捷菜单 按F12也没用 这可能也对应了题目的 JS前台拦截 不懂 我猜应该是 通过手动点击浏览器开发者工具 我用的是谷歌浏览器 在浏览器关闭按钮下方的三个小点里 也可以利

随机推荐

  • 视频教程-手机订餐管理系统商业项目视频课程-Java

    手机订餐管理系统商业项目视频课程 19年软件开发经验 设计开发40多个大型软件 10年从事高等教育 主要为java系列课程 带你轻松进入java生涯 赖国荣 198 00 立即订阅 扫码下载 CSDN程序员学院APP 1000 技术好课免费
  • linux局域网下远程启动机器

    环境说明 两台局域网内的linux主机 本环境的系统为centos 5 3 X86 64 控制主机为 192 168 10 149 被控制主机为 192 168 10 150 一 在控制主机上安装远程开机需要的软件 root tomcat2
  • Keil5不显示结构体提示的办法

    如果你已经排除了汉化与文件名问题 且发现Configuration 配置 下Text Completi on 文本补语 中不存在Show Code Completion List for 显示代码完成列表 有可能是因为你同时安装了MDK5和
  • 组件page-container的使用 避免踩坑!!

    属性介绍 page container是微信小程序的一个视图容器 主要的功能就是实现一个弹窗的功能 该组件所包含的属性不多 比较关键的属性就是显示容器和容器位置的属性以及各种事件触发函数 如下 show主要通过一些page containe
  • 论文阅读—基于采样的快速区域优化

    kRRT Kinodynamic B RRT 选取吸引点 实验 前端 双向运动 缩短时间 通过采样方向划定有偏采样 实现轨迹的区域优化 A 产生吸引点 减少迭代次数 后端区域优化 5阶多项式 BVP求解有约束方程 Kinodynamic B
  • 数据结构进阶篇,链表专题

    2 两数相加 题目 给你两个 非空 的链表 表示两个非负的整数 它们每位数字都是按照 逆序 的方式存储的 并且每个节点只能存储 一位 数字 请你将两个数相加 并以相同形式返回一个表示和的链表 你可以假设除了数字 0 之外 这两个数都不会以
  • matlab求多元函数的极小值,如何用matlab或lingo求解多元函数的最小值

    如何用matlab或lingo求解多元函数的最小值 求最优成本 minC minC X P 价格P固定 重量X变动为整数 如无法得出整数解 有小数解也可 X x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 P
  • Unity入门(一)——Unity的安装与相关环境配置

    大家好 最近我打算入门Unity 也在网络找了一些教程进行学习 现在就由我为大家分享一下自己的学习过程 也作为入门Unity的学习记录 安装与环境配置 unity官网 Unity官网下载 下载并安装Unity Hub 然后在unity hu
  • element UI 按需引入

    1 npm安装 全局安装element npm i element ui S 2 按需引入 借助 babel plugin component 2 1 首先安装 babel plugin component npm install babe
  • 微信网页分享:错误码:63002,invalid signature(只改了APPID和SECRET就不行了)

    网上有说明配置白名单 JS域名 什么的就不再说明了 我遇到的情况是改了APPID和SECRET 就报错误码 63002 invalid signature 原因是改之前调用了之前的APPID和SECRET 这个会保存一个access tok
  • pygame.surface.blit()方法4个参数的使用方法

    pygame surface blit方法将一个图像 Surface实例 绘制到另一个图像 Surface实例 上 如screen是一个Surface实例 方法blit具体使用方法如下 rect screen blit source des
  • 无线通信复习大纲

    题型 选择填空 名词解释 简答3 4 计算3 4 从二 四章出 第一章 1 无线电波传播方式 天波 地波 3种 依据不同的频率 无线电波在空间的传播有三种基本方式 地球表面波传播 天波传播和空间波传播 1 地球表面波传播 地球表面波 Gro
  • 一线案例:如何提高UGC征集转化率?

    作者 Curry 关注中国互联网出海 专注海外运营推广及本地化运营方法论 关键词 主路径分析 关键环节转化率 工具 友盟 移动统计 U App AI版 2019 友盟杯 数据分析大赛参与奖作品 我们是一款短视频类App 为实现内容冷启动 除
  • 用户切换

    一 切换root登陆 sudo i是Linux终端命令下改变用户对命令使用权限的命令 例如 在Linux命令终端中 开始为 user ubuntu 当使用 该命令后 会出现输入密码的提示 之后输入密码 就会变为 root ubuntu 这样
  • java中的Excel导出

    1 在pom xml文件中添加maven依赖
  • 啥是python的位置传参和关键字传参

    Python中的函数可以使用位置传参和关键字传参 位置传参是指函数调用时根据参数在函数定义时的顺序来传递参数值 例如 def func a b c print a b c func 1 2 3 输出 1 2 3 在这个例子中 调用func
  • android dialog背景模糊化效果

    最近做项目有这样的需求 在activity中启动一个dialog时 启动的dialog的背景设为启动acitivity的模糊化图片 实现思路 1 截屏 获取当前activity的界面 2 将获取的照片进行模糊化 3 将模糊化的图片设为dia
  • Eclipse全局搜索

    Eclipse中全局搜索和更替 Eclipse全局搜索步骤 使用快捷键 ctrl H 打开文件搜索对话框 选择 File Search 标签 在Containing text中输入你需要搜索的字符串 在Scope中 选择你要搜索的范围 点击
  • Python tkinter Canvas画布完全攻略

    Tkinter 提供了 Canvas 组件来实现绘图 程序既可在 Canvas 中绘制直线 矩形 椭圆等各种几何图形 也可绘制图片 文字 UI 组件 如 Button 等 Canvas 允许重新改变这些图形项 Tkinter 将程序绘制的所
  • MQTT 控制报文 - SUBSCRIBE订阅报文,SUBACK,UNSUBSCRIBE,UNSUBACK - 第5章

    目录 5 1 SUBSCRIBE 订阅主题报文 5 1 1 固定报头 5 1 2 可变报头 5 1 3 有效载荷 5 2 SUBACK 订阅确认 5 2 1 固定报头 5 2 2 可变报头 5 2 3 有效载荷 5 3 UNSUBSCRIB