MQTT 5.0协议新特性介绍

news2024/11/28 1:44:33

MQTT 5.0协议新特性介绍

项目中逐步完成了 MQTT 5.0的开发,这里介绍下MQTT 5.0 的一些新特性。

  • MQTT 3.1.1 规范见:点击查看
  • MQTT 5.0 规范见:点击查看

格式

首先,协议上,增加了一个 Property字段,正是这个字段,使得 MQTT 5.0 可以支持众多的新特性。而在MQTT 3.1.1中,MQTT没有任何可以拓展的地方,限制了MQTT拓展功能的可能性。

request/response 模式

MQTT 本身是 订阅/推送 模式,不像HTTP那样 请求/响应 模式。那么MQTT是如何在 订阅/推送 模式下支持 request/response 模式呢?
这里简单翻译了 http://docs.oasis-open.org/mqtt/mqtt/v5.0/cos01/mqtt-v5.0-cos01.html#Request/_Response 中举例的场景:

(1)A publish 一个消息,消息topic假设是”topicA”,该消息 通过Property携带了Response Topic,假设该字段是”topicresponse”。
(2)订阅了”topicA”的接收端B(有可能有多个)收到了该消息。
(3)B处理完”topicA”后,会publish 一个 topic 名字是 “topicresponse” 的消息。该消息有可能是A订阅的,也有可能是其他人订阅的。
(4)A publish 的消息,可能还会携带Correlation Data属性,假设其值是”msgresponse”,这样B发publish的消息就是(“topicresponse”, “msgresponse”)。

Server redirection

Server可以发送 CONNACK 或者 DISCONNECT,其 Reason Codes 可以是0x9c或者0x9d,表示Client需要往另一个Server发送请求。
0x9C 类似 HTTP 的 302, 0x9d 类似 HTTP的 301。
CONNACK 或者 DISCONNECT 可以通过 Property携带Server redirection,其值可以告诉Client往哪个Server发送请求,类似HTTP的”Location”首部。

AUTH控制报文

MQTT 单纯通过 CONNECT可能无法提供足够的信息给Server进行身份认证,所以 Server 在收到 MQTT 的 CONNECT 后,回复 AUTH控制报文给Client,Client接着也用 AUTH包发送附加信息,Server直到 认证完成后,才会发送 CONNACK。

Topic Alias

类似HTTP2的头部压缩效果,当然,没有同HPACK那么复杂的东西。

我们知道,PUBLISH消息的时候,需要携带 topic和message,其中topic往往是固定的,那么我们只需要第一次发送完整的 topic,并且通过Property中携带Topic Alias告知对端下次这个PUBLISH的topic会使用Topic Alias中的值代替,Topic Alias的值是一个整数类型的值。

client 通过 CONNECT 中 Topic Alias Maximum 告知 Server自己能处理的最多的 Topic Alias 个数。
Server 通过 CONNACK中 Topic Alias Maximum 告知 Client自己能处理的最多的 Topic Alias 个数。

如果当前PUBLISH消息的topic长度不为0,那么接受方需要解析 Topic Alias 中的值,并且 将topic和该值进行映射。
如果当前PUBLISH消息的topic为0,那么接受方需要解析 Topic Alias 中的值,用该值去查找对应的topic。

User Property

自定义属性,可以添加两端约定的数据。例如可以加入类似HTTP的 “Header:value”信息。MQTT本身没有类似HTTP的HOST信息,我们可以使用User Property特性让MQTT支持

Session Expiry Interval

之前的MQTT版本,当cleansession为0时,server和client会尝试保存session信息(sub信息、PUBLISH状态等),但是有个问题,server 不知道需要保存这个session多久。MQTT 5.0 就 在 Property字段中增加了Session Expiry Interval属性来告知server这个session希望被保存多久。

如果MQTT 5.0 不携带 Session Expiry Interval或者 Session Expiry Interval设置为0,server和client则不会保存session信息。
如果Session Expiry Interval设置为0xffffffff,则表示session永远不会老化。

当然,这个字段是需要配合Clean Start使用的,如果Clean Start为1,那么 Session Expiry Interval设置多大都无意义。

CONNECT、CONNACK、DISCONNECT都会发送 Session Expiry Interval字段。DISCONNECT中携带该字段可以告知Server更新老化时间。
CONNACK中的Session Expiry Interval只有当CONNECT不携带该字段时才有用,当client携带该字段,server发送该字段只是表明自己最大的老化时间,不会强制client必须按照这个值。

Maximum QoS

Server 可以发送 Maximum QoS属性告知Client自己支持最大的Qos是多少,Client发送的PUBLISH的Qos必然不能大于该值

Receive Maximum

告知对方自己希望处理未决的最大的 Qos1 或者 Qos2 PUBLISH消息个数,如果不存在,则默认是65535。
作用:流控。
因为当处理 Qos > 0 的PUBLISH的时候,需要回复对端PUBACK、PUBREC PUBCOMP等。Receive Maximum属性提供了告诉对端发送Qos>0的PUBLISH的速率,对端发现未决PUBLISH个数等于Receive Maximum时,不能再发送Qos > 0 的PUBLISH消息了。

Maximum Packet Size

顾名思义,单个 MQTT控制报文 的大小,如果不携带,表示不限制。
这个大小指整个 MQTT控制报文 的大小。对端如果发现将发送的包大于该大小,就默默丢弃,不关闭连接。如果自己收到超过自己通告的Maximum Packet Size需要关闭连接。

Topic Alias Maximum

作用见上文Topic Alias。

Reason Code

MQTT 3.1.1 只有CONNACK有是否成功还是失败的标志位,现在MQTT 5.0所有的ACK都有该标志位。具体各个ACK中code值得含义在规范中有定义,这里不再列举。
需要注意的是,SUBACK中,MQTT 3.1.1 的 Granted Qos被取代为Reason Code,Reason Code中有状态码表示了具体的Granted Qos。
如果PUBLISH是成功的,其ACK的的Reason Code可以不添加。

Reason String

所有的ACK以及DISCONNECT 都可以携带 Reason String属性告知对方一些特殊的信息,一般来说是ACK失败的情况下会使用该属性告知对端为什么失败,可用来弥补Reason Code信息不够。

Clean Start

Clean Start取代了 MQTT3.1.1 中 CleanSession,在协议格式上,直接占用了CleanSession原本的field,这也表示Clean Start语义上和 CleanSession是一样的。

Payload Format Indicator

指定了PUBLISH 消息的message部分是utf8格式的还是二进制的,接收方必须验证payload是否是该属性定义的格式。

  • Payload Format Indicator 为 0,表示 是二进制,和不携带该属性的语义是一样的。
  • Payload Format Indicator 为 1,表示 是utf8编码数据。

Message Expiry Interval

指定了PUBLISH数据在Server的最长等待时间。超过这个时间,这个数据不能被publish到匹配topic的subscriber

推荐一款千万级别MQTT接入网关

演示地址 用户名:smqtt 密码:smqtt

结束

识别下方二维码!回复: 入群 ,扫码加入我们交流群!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/335833.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

无线通信中的轨道角动量

目录 一. 前言 二. 如何传输 三. 如何产生 3.1 螺旋结构器件 (1)螺旋相位板 (2)螺旋抛物面天线 3.2 超表面 3.3 天线阵列 3.3.1 相控阵 3.3.2 时控阵 四. 如何识别 一. 前言 轨道角动量:Orbital Angular M…

Wine零知识学习1 —— 介绍

一、什么是Wine Wine是“Wine Is Not an Emulator” 的首字母缩写,是一个能够在多种POSIX-compliant操作系统(诸如Linux、macOS及BSD等)上运行 Windows 应用的兼容层。Wine不像虚拟机或者模拟器那样模仿内部的Windows逻辑,而是將…

电压放大器在非共线混频方法检测混凝土中的应用

实验名称:电压放大器在非共线混频方法检测混凝土中的应用研究方向:无损检测测试目的:无损检测是在不损伤或不干扰待测物体的结构材料的情况下,对其内部损伤进行探测的方法。传统无损检测法在仪器携带,操作程序&#xf…

牛客网 HJ31 单词倒排(详解)

前言:内容包括四大模块:题目,代码实现,大致思路,代码解读 题目: 描述 对字符串中的所有单词进行倒排。 说明: 1、构成单词的字符只有26个大写或小写英文字母; 2、非构成单词的字…

PyTorch学习笔记:nn.L1Loss——L1损失

PyTorch学习笔记:nn.L1Loss——L1损失 torch.nn.L1Loss(size_averageNone, reduceNone, reductionmean)功能:创建一个绝对值误差损失函数,即L1损失: l(x,y)L{l1,…,lN}T,ln∣xn−yn∣l(x,y)L\{l_1,\dots,l_N\}^T,l_n|x_n-y_n| l(…

苹果手机怎么传输照片到电脑?教你4种实用方法

苹果手机怎么传输照片到电脑?除了更换新手机需要迁移数据,iPhone用久了常常会遇到储存空间不足的问题,因此把一些数据上传到电脑上也是必要的。今天咱们就来说说从iPhone传输照片到电脑的迁移方法吧。 方法1.使用苹果数据线 苹果手机怎么传输…

【论文速递】ICCV2021 - 基于超相关压缩实现实时高精度的小样本语义分割

【论文速递】ICCV2021 - 基于超相关压缩的小样本语义分割 【论文原文】:Hypercorrelation Squeeze for Few-Shot Segmentation 【作者信息】:Juhong Min Dahyun Kang Minsu Cho 获取地址:https://openaccess.thecvf.com/content/ICCV2021/…

【DGL】图分类

目录概述数据集定义Data LoaderDGL中的batched graph定义模型训练参考概述 除了节点级别的问题——节点分类、边级别的问题——链接预测之外,还有整个图级别的问题——图分类。经过聚合、传递消息得到节点和边的新的表征后,映射得到整个图的表征。 数据…

pycharm无法通过外网访问阿里云服务器中的Flask解决方案

一、修改/添加安全组端口这是第一种方案,也是能解决大部分问题的一个方案。由于我的服务器是阿里云的,所以在阿里云的ECS云服务器控制台中,管理安全组,添加5000和8000端口以便测试。经过测试,外网依旧无法访问。二、修…

Shell脚本之——Hadoop3单机版安装

目录 1.解压 2.文件重命名 3.配置环境变量 4.hadoop-env.sh 5.core-site.xml 6. hdfs-site.xml 7. mapred-site.xml 8.yarn-site.xml 9.完整脚本代码(注意修改主机名) 10.重启环境变量 11.初始化 12.启动服务 13.jps查询节点 1.解压 tar -zxf /opt/install/hadoo…

【速通版】吴恩达机器学习笔记Part3

目录 1.多元线性回归 a.特征缩放 可行的缩放方式: 1.除以最大值: 2.mean normalization: 3.Z-score normalization b.learning curve: c.learning rate: 2.多项式回归 3.classification logistics regression 1.多元线性回归 其意义很…

UML术语标准和分类

一、UML术语标准 1.中文UML术语标准 中国软件行业协会(CSIA)与日本UML建模推进协会(UMTP)共同在中国推动的UML专家认证,两个协会共同颁发认证证书、两国互认,CSIA与UMTP共同推出了UML中文术语…

(record)QEMU安装最小linux系统——TinyCore(命令行版)

文章目录QEMU安装最小linux系统——TinyCore参考QEMU使用qemu创建tinycore虚拟机再次启动文件保存QEMU安装最小linux系统——TinyCore 简单记录安装过程和记录点 参考 [原创] qemu 与 Tiny Core tinycore的探索 QEMU qemu不多介绍,这里是在WSL2上安装的linux版…

最近很火的一部电视(狂飙)像安欣和高启强这样类型的人,谁更合适做软件测试工程师

狂飙》央视收视率狂飙。央视发布《狂飙》收视成绩,全剧平均收视1.54%,平均收视份额6.99%,单集最高收视率2.20%,单集最高收视份额10.69%;晚间电视剧类节目第一。可以说还部剧为今年开了个好头,一开年就引爆收…

财报解读:四季度营收超预期,优步却越来越“不务正业”了

“公司第四季度的业绩表现将是强劲的”。 公布2022年第三季度财报时,优步的高管给出了这样的预告,给资本市场打了一针“强心剂”。然而有人对此表示质疑,后疫情时代,带着新模式、新车型的全新网约车公司层出不穷,车企…

Java面试数据库

目录 一、关系型数据库 数据库权限 表设计及创建 表数据相关 数据库架构优化 二、非关系型数据库 redis 今天给大家稍微整理了一下,内容有数据表设计的三大范式原则、sql查询如何优化、redis数据的击穿、穿透、雪崩等...,以及相关的面试题&#xff0…

Intel中断体系(1)中断与异常处理

文章目录概述中断与异常中断可屏蔽中断与不可屏蔽中断(NMI)异常异常分类中断与异常向量中断描述符表中断描述符中断与异常处理中断与异常处理过程堆栈切换错误码64位模式下的中断异常处理64位中断描述符64位处理器下的堆栈切换相关参考概述 中断是现代计…

不用创建项目,直接在 VS 里快速测试 C/C++ 代码

概述 Visual Studio 强大、方便,但是每次写代码都要先创建新项目,这对于一些简单的代码测试来说有点不方便。 本文介绍一种使用 VS 快速测试代码的方法。 该方法适用任何版本的 VS。“不用创建项目”,是指不用“手工”创建项目&#xff0c…

Python Scrapy 爬虫简单教程

1. Scrapy install 准备知识 pip 包管理Python 安装XpathCssWindows安装 Scrapy $>- pip install scrapy Linux安装 Scrapy $>- apt-get install python-scrapy 2. Scrapy 项目创建 在开始爬取之前,必须创建一个新的Scrapy项目。进入自定义的项目目录中&am…

爆火出圈的ChatGPT,真的那么好用吗?

近期,ChatGPT在互联网行业爆火! 这个由人工智能研究和部署公司OpenAI开发的“交互机器人”,在今年1月其全球月活跃用户已达1亿,成为史上用户增长速度最快的消费级应用。 爆火的ChatGPT到底是什么? ChatGPT是一个原型人…