MQTT v5.0------SUBSCRIBE 报文
SUBSCRIBE 报文
固定报头:

剩余长度字段
表示可变报头的长度加上有效载荷的长度,被编码为变长字节整数。
可变报头
SUBSCRIBE报文可变报头按顺序包含以下字段:报文标识符(Packet Identifier),属性(Properties)。
范例:可变报头(没有属性),报文标识符为10

SUBSCRIBE 报文的属性存在可变头部中。
- 11 (0x0B),订阅标识符(Subscription Identifier)标识符。取值范围从1到268,435,455。。订阅标识符的值为0或包含多个订阅标识符将造成协议错误。
- 38 (0x26),用户属性(User Property)标识符。
.SUBSCRIBE载荷

MQTT 5.0 中 SUBSCRIBE 报文中的 Payload 包含了订阅选项(Subscription Options)。
SUBSCRIBE报文的载荷包含一列主题过滤器,指明客户端希望订阅的主题。主题过滤器必须为UTF-8 编 码的字符串。每个主题过滤器之后跟着一个订阅选项(Subscription Options)字节。

订阅选项(Subscription Options)的第 0 位和第 1 位表示 QoS 最大值。该字段给出了服务器可以发送给客户端应用消息的最大 QoS 等级。如果 QoS 值为 3,就会触发协议错误。
订阅选项第 2 位表示非本地选项(No Local)。如果值为 1,应用消息就不会发布给订阅发布主题的发布者本身,如果在共享订阅中将该选项设置为 1 的话,就会触发协议错误。
订阅选项的第 3 位表示保留为已发布(Retain As Published)。若该值为 1,服务器须将转发消息的 RETAIN flag 设为与接收到的 PUBLISH 报文的 RETAIN flag 一致。若该值为 0,不管接收到的 PUBLISH 报文中的 RETAIN flag 是何值,服务器都需将转发消息的 RETAIN flag 置为 0。
订阅选项的第 4 第 5 位表示保留处理 (Retain Handling)。此选项指示当订阅建立时,是否发送保留消息。此选项不影响之后的任何保留消息的发送。如果没有匹配主题过滤器的保留消息,则此选项所有 值的行为都一样。值可以设置为:
- 0 = 订阅建立时发送保留消息
- 1 = 订阅建立时,若该订阅当前不存在则发送保留消息
- 2 = 订阅建立时不要发送保留消息
订阅选项的第 6 第 7 位是预留给未来使用的。如果有效载荷的任何一个预留位非零,那么服务器就会将该报文视为格式错误的报文。
已存在订阅的情况下不发送保留消息是很有用的,比如重连完成时客户端不确定订阅是否在之前的 会话连接中被创建。
不发送保存的保留消息给新创建的订阅是很有用的,比如客户端希望接收变更通知且不需要知道最 初的状态。
对于某个指示其不支持保留消息的服务端,发布保留和保留处理选项的所有有效值都将得到同样的 结果:订阅时不发送任何保留消息,且所有消息的保留标志都会被设置为0。
范例:

SUBSCRIBE行为
当服务端收到来自客户端的SUBSCRIBE报文时,必须使用SUBACK报文作为相应
SUBACK报文必须和待确认的SUBSCRIBE报文有相同的报文标识符
允许服务端在发送SUBACK报文之前就开始发送与订阅相匹配的PUBLISH报文
如果服务端收到的SUBSCRIBE报文中的一个主题过滤器与当前会话的一个非共享订阅(Non-shared Subscription)相同,那么必须使用新的订阅替换现存的订阅 。新订阅的主题过滤器与之前 的订阅相同,但其订阅选项可能不同。如果保留处理选项为0,任何匹配该主题过滤器的保留消息必须被重发,但替换订阅不能造成应用消息的丢失 。
如果服务端收到的非共享主题过滤器(Non-shared Topic Filter)不同于当前会话的任何主题过滤器,一个新的非共享订阅将被创建。如果保留处理选项不为2,所有相匹配的保留消息将发送给客户端。
如果服务端收到的主题过滤器与服务端已存在的某个共享订阅(Shared Subscription)主题过滤器相同,则将此会话添加到该共享订阅中。不发送任何保留消息。
如果服务端收到的共享订阅主题过滤器(Shared Subscription Topic Filter)与任何已存在的共享订阅主题 过滤器都不同,一个新的共享订阅将被创建。将此会话作为订阅者添加到该共享订阅。不发送任何保留消息。
如果服务端收到的SUBSCRIBE报文包含多个主题过滤器,服务端必须当做收到一系列多个SUBSCRIBE 报文来处理--除了将它们的响应组合为单个SUBACK响应
服务端发送给客户端的SUBACK报文必须为每一个主题过滤器/订阅选项对包含一个原因码,此原因码必须说明为该订阅授予的最大QoS等级,或指示订阅失败
。服务端可能授予了低于订阅者所请求的最大QoS等级。响应该订阅的应用消息QoS等级必须为该消息发布时的QoS等级和服务端授予的最大QoS等级二者最小值
在原始消息发布的QoS等级为1,且授予的 最大QoS等级为0的情况下,服务端允许发送重复的消息副本给订阅者。
如果订阅客户端的某个主题过滤器已被授予的最大QoS等级为1,那么匹配此过滤器的QoS等级为0的应用消息按照QoS等级为0分发给此客户端。这意味着客户端最多只能收到该消息的一个 副本。
另一方面,发布到相同主题的QoS等级为2的消息,其QoS等级被服务端降级为1以便分 发给该客户端。因此该客户端可能收到此消息的多个副本。
如果订阅客户端被授予的最大QoS等级为0,那么按照QoS等级为2发布的应用消息在繁忙时可 能会丢失,但服务端不应该发送重复的消息副本。发布到相同主题的QoS等级为1的消息,分发 给该客户端时可能会丢失或重复。
MQTT v5.0------SUBSCRIBE 报文的更多相关文章
- MQTT v5 (MQTT 5.0) 新特性介绍
https://blog.csdn.net/mrpre/article/details/87267400 背景 MQTT v3.1.1 作为一个经典的版本,一般能够满足大部分需求:为了避免落后,我们也 ...
- 转战物联网·基础篇08-例说MQTT协议各控制报文
前面讨论了MQTT协议的控制报文的格式,下面分别举例探讨各个控制报文的详细内容. 01.CONNECT – 连接服务端 客户端到服务端的网络连接建立后,客户端发送给服务端的第一个报文必须是CO ...
- 转战物联网·基础篇07-深入理解MQTT协议之控制报文(数据包)格式
在MQTT协议中,一个控制报文(数据包)的结构按照前后顺序分如下三部分: 结构名 中文名 解释说明 Fixed header 固定报头 报文的最开始部分,所有报文都包含这个部分 Variable ...
- eclipse Run On Server 异常:could not load the Tomcat Server configuration at Servers\tomcat V5.0 Sertomcat
eclipse Run On Server 异常:could not load the Tomcat Server configuration at Servers\tomcat V5.0 Serto ...
- 条形码软件开发包Dynamic .NET TWAIN v5.0提供WPF功能
Dynamsoft是一家著名的开发条形码控件开发包的公司,其旗下 Dynamic .NET TWAIN产品近日升级到v5.0版本,对于在支持WPF功能方面有着较大的改进.下面就让我们一起来看看这次更新 ...
- 大白菜U盘启动制作工具装机维护版V5.0–大白菜U盘下载中心
大白菜U盘启动制作工具装机维护版V5.0–大白菜U盘下载中心 大白菜U盘启动制作工具装机维护版V5.0
- HP-Socket v5.0.1:支持 IPv6 及多 SSL 证书
HP-Socket 是一套通用的高性能 TCP/UDP/HTTP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP/HTTP 通信系统,提供 C/ ...
- Senparc.Weixin SDK v5.0 升级公告
经过五年半的持续维护,Senparc.Weixin SDK 逐步丰满和完善,在升级的过程中,我们为基础库(Senparc.Weixin.dll)加入了许多通用的功能,例如加密/解密算法.通用缓存方法等 ...
- ThinkPHP V5.0 正式版发布
ThinkPHP5.0版本是一个颠覆和重构版本,官方团队历时十月,倾注了大量的时间和精力,采用全新的架构思想,引入了更多的PHP新特性,优化了核心,减少了依赖,实现了真正的惰性加载,支持compose ...
随机推荐
- rsync免密码远程复制文件
目标: 从云服务器(112.77.69.212)把mongodb中的文件同步到本地. 步骤一:在云服务器上创建用户 $ adduser monbak $ passwd monbak 步骤二:设置免密登 ...
- Java数据类型(2)------自动封装拆箱
目的: 自动装箱和拆箱从Java 1.5开始引入,目的是将原始类型值转自动地转换成对应的对象,以使用对象的API和引用类型操作.自动装箱与拆箱的机制可以让我们在Java的变量赋值或者是方法调用等情况下 ...
- Nginx 核心配置-可优化配置参数
Nginx 核心配置-可优化配置参数 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.nginx的官网查看指令帮助信息方法 1>.打开nginx的官网(https://ng ...
- plv8 + hashids 生成短连接id
此文章是转载文章的一个学习,稍有改动 环境准备 plv8 环境 version: '3.6' services: postgres: image: dalongrong/plv8:2.3.12 ...
- idea开发工具
IDEA简介 IDEA 全称 IntelliJ IDEA,是java编程语言开发的集成环境.IntelliJ在业界被公认为最好的java开发工具之一,尤其在智能代码助手.代码自动提示.重构.J2EE支 ...
- BILIBILI之滑块验证
bilibili的滑动验证码图片比较好玩,和前一篇不大一样. 采用canvas方法,分析发现只找到一个图片,不过,可以通过设置display截图方式获得2张图(完整图片,带缺口的图片),取得图片后接下 ...
- Codeforces Global Round 3 题解
这场比赛让我上橙了. 前三题都是大水题,不说了. 第四题有点难想,即使想到了也不能保证是对的.(所以说下面D的做法可能是错的) E的难度是 $2300$,但是感觉很简单啊???说好的歪果仁擅长构造的呢 ...
- html文本或元素6px间距问题
html中的文本内容或者是具有inline或inline-block的元素之间会6px的间距, 这是因为html文当中若出现文字分隔符(文字分隔符主要指空格或者换行等), 那么其就会被渲染成一个空格( ...
- 基于Linux(中标麒麟)上QT的环境搭建
最近由于公司需要,需要在中标麒麟上进行QT的二次开发,但是网上的资料很少,就算是有也基本都是其他的版本的Linux上的搭建.中标麒麟本身的资料也很好,而且还只能试用60天. 下面就介绍下我对此环境的搭 ...
- Math的round方法
代码如下,后面的注释是输出的结果 public static void main(String[] args) { System.out.println(Math.round(0.399)); Sys ...