mqtt v5.0请求响应式 Request/Response

2023-05-16

MQTT v5 (MQTT 5.0) 新特性介绍

项目中逐步完成了 MQTT 5.0的开发,这里介绍下MQTT 5.0 的一些新特性
MQTT 5.0 规范见:http://docs.oasis-open.org/mqtt/mqtt/v5.0/cos01/mqtt-v5.0-cos01.html#_Toc514847900

格式

首先,协议上,增加了一个 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

还有其他的细枝末节不再展开了,上述众多属性也有一些细节的地方,可以在原文中搜索就直到了。

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

mqtt v5.0请求响应式 Request/Response 的相关文章

  • Soap 响应,XML 格式不正确,未找到 XOP 部分,使用 WSE

    我正在使用一个 Web 服务 在该服务中我发送带有附件的请求 然后我们收到来自服务器的包含各种信息的响应 我已经在另一个问题中记录了将请求放在一起的一些问题向 SOAP 请求添加附件 https stackoverflow com ques
  • 如何使用 QtMqtt 和 SSL 执行安全 MQTT?

    我正在尝试使用 QtMQtt 示例项目 simpleclient 但我想执行安全的 MQTT 我该如何处理这个问题 我读过这篇博客 https www qt io blog 2017 08 14 introducing qtmqtt pro
  • 如何从 MQTT 生产并在 ActiveMQ 中作为 MQTT 和 JMS 消费

    我有一个设置 其中消息作为 MQTT 生成到 ActiveMQ 我有两个消费者 一个作为 JMS 另一个作为 MQTT 当我将消息作为 JMS 消息发布到主题 foo 时 我在 JMS 和 MQTT 消费者处都收到消息 但是当我在同一主题上
  • Spring中有没有静态的方法来获取当前的HttpServletRequest

    我正在使用Spring注释 我可以通过HttpRequestContext从控制器到服务 我正在寻找一种静态方式或任何比通过更好的解决方案RequestContext around 如果您使用 spring 您可以执行以下操作 public
  • Python urllib2 响应头

    我正在尝试提取 URL 请求的响应标头 当我使用firebug分析URL请求的响应输出时 它返回 Content Type text html 但是当我使用 python 代码时 urllib2 urlopen URL info 结果输出返
  • 使用 jQuery 的 MediaWiki API 没有响应

    我尝试从 Wikipedia 获取一些 JSON 内容 getJSON http en wikipedia org w api php action query prop revisions rvprop content titles ti
  • 在 Rails 中,如何对 Javascript 响应格式进行功能测试?

    如果您的控制器操作如下所示 respond to do format format html raise Unsupported format js index js erb end 你的功能测试如下所示 test javascript r
  • 无法在 Istio 代理后面的 k8s 中建立与 VerneMQ 集群的 mqtt 连接

    我正在设置 k8s 本地 k8s 集群 对于测试 我在使用 kubeadm 设置的虚拟机上使用单节点集群 我的要求包括在 k8s 中运行 MQTT 集群 vernemq 并通过 Ingress istio 进行外部访问 无需部署 ingre
  • React Native 上的 MQTT?

    将 MQTT 添加到我的反应原生项目时 我很难找到正确的方法 该项目需要在 iOS 和 Android 上运行 因此理想情况下 MQTT 可以在 javascript 端处理 我意识到移动节点和经典节点的网络巢穴是不同的 所以我开始沿着分叉
  • 如何在 Android 的这个特定用例中实现 MQTT?

    我的用例 登录到我的应用程序的用户应该能够向在另一台 Android 设备上登录到该应用程序的自己发送消息 如果用户拥有多个设备 那么一旦他打开该消息 其他设备上的通知必然会消失 Doubts 如何跨设备向特定用户发送数据 我了解如何使用
  • Django:从 QueryDict 读取 JSON 对象数组

    如何通过 JS 的 AJAX 调用传递复合 JSON 结构 并在服务器端将其读取为 python 中的 非常相似 的数据结构 我知道可以使用 json 格式 simplejson 等 但我不知何故觉得 QueryDict 本身在我的情况下格
  • RSpec 请求 - 如何为所有请求设置 http 授权标头

    我正在使用 rspec 请求来测试 JSON API 该 API 需要在每个请求的标头中包含 api key 我知道我可以这样做 get v1 users janedoe json HTTP AUTHORIZATION gt Token t
  • jQuery JSON 请求得到“200 OK”答案,但没有内容

    我正在使用 jQuery 通过访问者的 IP 地址获取其位置 有一项很棒的服务叫做免费地理IP http freegeoip appspot com 我需要做的就是在 URL 末尾添加 json 或 xml 然后添加 IP 地址 它将返回所
  • Python请求响应以utf-8编码但无法解码

    我正在尝试使用 python 抓取我的messenger com facebook Messenger 聊天记录 并且我使用谷歌浏览器开发工具来查看聊天历史记录的 POST 请求 并且我已将整个标头和正文复制为请求可以使用的格式 我得到 H
  • 如何完全禁用 VS Code 的网络请求(遥测、更新等)

    由最新来源构建 我试图阻止 vs code 发出任何网络请求 检查更新 遥测等 我试过这个 config telemetry enableCrashReporter false telemetry enableTelemetry false
  • OPC-UA 的替代方案 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 作为访问由各种 PLC 组成的系统的过程数据的解决方案 是否有 OPC UA 的合适替代方案 独立于平
  • 加特林负载测试期间编译错误

    我正在尝试编写一个模拟 并且希望能够运行该模拟 我在尝试 mvn gatling execute 时遇到错误 我的 pom 有以下依赖项
  • 如何使用 node.js 请求模块使用我自己的证书进行 SSL 调用?

    我正在使用 node js 和此请求模块对另一台服务器进行 HTTP 调用 https github com mikeal request https github com mikeal request 效果很好 我现在需要修改此代码以使用
  • 进入后台时 Alamofire 请求卡住?

    我正在使用 Alamofire 调用 Web 服务 该服务需要相当长的时间才能加载 如果应用程序进入后台 当我返回应用程序时 我会被加载程序卡住 我想这是因为调用永远不会向我的完成处理程序返回任何内容 我该如何解决这个问题 您可以使用后台抓
  • 最适合“正在进行的作业”的 HTTP 状态代码

    向客户端提供的最合适的 HTTP 状态代码是什么 表示 您的请求很好 但仍在进行中 请稍后在完全相同的位置回来查看 例如 假设客户端提交初始请求以启动繁重的查询 服务器立即返回一个 URL 客户端可以定期轮询该 URL 以获取结果 如果客户

随机推荐

  • beego打包linux运行包命令

    span class hljs attribute bee pack be GOOS span 61 span class hljs string linux span
  • Web安全原理剖析(十六)——DOM型XSS攻击

    目录 4 7 DOM型XSS攻击4 8 DOM型XSS代码分析 4 7 DOM型XSS攻击 DOM型XSS攻击页面实现的功能是在 输入 框中输入信息 xff0c 单击 替换 按钮时 xff0c 页面会将 这里会显示输入的内容 替换为输入的信
  • QScrollArea 无法通过样式改变背景色,无法去除边框

    QScrollArea 无法通过样式改变背景色 xff0c 无法去除边框 QScrollArea 是无法通过样式表来改变背景色的 xff0c 只能设置加入到QScrollArea里面的QWidget的样式 xff0c 这样才能改变背景色 当
  • 将驱动编译成.ko文件添加到嵌入式Linux系统下

    为减少内核所占的空间 xff0c 很多时候我们在编译内核时都会选择裁去一些暂时不用的驱动 xff0c 当我们在使用时找不到对应的驱动 xff0c 除了重新编译内核外 xff0c 一个比较方便的做法是将对应的驱动编译成 ko文件 xff08
  • 嵌入式Linux上没有wlan0

    有时候我们的嵌入式板子上有无线网卡 xff0c 可是无法连接到wifi上 xff0c 使用 sudo ifconfig 也看不到 wlan0 的相关信息 这时我们可以使用 sudo ifconfig a 看一下具体信息 xff0c 我们可以
  • Linux远程界面中Tab键不能补全

    我们在使用嵌入式Linux板子的时候 xff0c 时常需要使用到远程界面 xff0c 可以通过本地电脑对板子进行操作 xff0c 显得相对便捷 在远程界面的使用中 xff0c 不可避免地要在终端进行命令输入 xff0c 这时可能出现Tab键
  • Linux下使用游戏手柄

    大多数情况下 xff0c Linux系统都带有手柄驱动模块joydev xff0c 当我们插上设备的时候可以通过以下指令查看是否检测到该设备 ls dev 或者 ls dev input 如果有出现 js0 的设备 xff0c 则证明设备能
  • shell脚本修改mysql密码

    不知道你们有没有过这种经历 xff0c 刚安装的mysql xff0c 立马就忘记了密码 xff0c 或者过了一段时间就忘记了 xff0c 找回太难了 xff0c 得翻各种配置 下面 教大家一个脚本 xff0c 专治mysql密码忘记的功能
  • ARM_Linux下基于 dump 和 restore 的文件系统制作

    很多时候我们在使用Linux时需要拷贝当前的文件系统 xff0c 或者是将当前文件系统放到别的机子上运行 xff0c 下面介绍在ARM Linux中基于 dump 和 restore 的文件系统的制作 首先查看当前磁盘的使用情况 df h
  • Qt/Qt Creator下载网址

    1 所有Qt版本下载地址 xff1a http download qt io archive qt 2 所有Qt Creator下载地址 xff1a http download qt io archive qtcreator 3 所有Qt
  • ROS编译C++程序显示大量错误

    我们在使用ROS的编译机制的时候 xff0c 有时会遇到使用g 43 43 编译无误的程序放到ROS里编译会显示大量的错误 xff0c 这是由于ROS本身使用的g 43 43 编译器版本较低 xff0c 所以会出现有些语句无法识别并显示错误
  • Codeblocks注释快捷键

    语句块 xff1a 加上注释 ctrl 43 shift 43 C 去掉注释 ctrl 43 shift 43 X
  • 导入import cv2时出现ImportError:DLL load fail:找不到指定模块的解决办法

    一 Python上安装opencv 遇到的问题 xff1a 前几天在导入import cv2的时候 xff0c 出现 ImportError DLL load fail 找不到指定模块 xff0c 我是按照pip install openc
  • C语言中数组长度的计算详解

    一 C语言中计算数组长度大小 C语言字符串长度的计算可以使用strlen str 但是对于数组长度的大小却没有相关函数可以使用 xff1b C语言数组长度的大小可以使用 xff1a span class token keyword int
  • VS对文件编码格式的转换方法

    前言 最近 xff0c 在Jupyterlab上遇到了这样的情景 xff1a 就是说呢 xff0c 这个文件不是UTF 8编码格式的文件 xff0c 它识别不了内容 xff0c 打不开 所以 xff0c 咱们需要对这些文件进行编码格式的转换
  • python 正则 .+?与.*?的区别 (正则表达式)

    匹配除 r n 之外的任何单个字符 要匹配包括 r n 在内的任何字符 xff0c 请使用像 s S 的模式 xff1f 匹配前面的子表达式0到1次 匹配前面的子表达式人任意次 匹配前面的子表达式一次或多次 gt 61 1 xff09 xf
  • 程序员编程中遇到的那些灵异事件,胆小误入!

    某公司有个码农工作压力太大 xff0c 天天晚上加班到半夜 xff0c 最后受不了跳楼死了 xff0c 他的机位从此就一直空着 但令大家都感到非常奇怪的是 xff0c 有几次早上来上班时却发现这台机子竟然开着 xff01 大概是因为电源有问
  • MQTT是什么

    MQTT是什么 xff1f MQTT xff08 Message Queuing Telemetry Transport xff0c 消息队列遥测传输协议 xff09 xff0c 是一种基于发布 订阅 xff08 Publish Subsc
  • 进程唤醒

    xff08 进程的操作 xff0c 都是有原语 xff08 函数 xff0c 具有原子性 xff09 去执行的 xff09 圈起来 xff0c 以后会考 进程创建参数 xff1a 进程标识 xff0c 优先级 xff0c 进程起始地址 xf
  • mqtt v5.0请求响应式 Request/Response

    MQTT v5 MQTT 5 0 新特性介绍 项目中逐步完成了 MQTT 5 0的开发 xff0c 这里介绍下MQTT 5 0 的一些新特性 MQTT 5 0 规范见 xff1a http docs oasis open org mqtt