MQTT 5协议中的基础更改(二)

news/2024/11/15 1:32:32/

上期文章中给大家介绍了MQTT规范版本5中基础更改的信息和CONNACK返回码,本篇文章我们继续介绍MQTT5协议中的基础更改中其他新功能的细节描述。

01 干净启动

MQTT 3.1.1的其中一个主流功能是MQTT客户端使用清除会话(cleanSession),即这些客户端可以通过临时连接的方式订阅消息或根本不订阅消息。当连接到MQTT代理时,客户端必须选择发送一个标注启用或禁用清除会话的CONNECT数据包。

在MQTT客户端使用清除会话后,一旦出现底层TCP连接断开、或客户端决定断开与代理的连接的情况,代理将会丢弃MQTT客户端的所有数据。此外,如果在代理上存在与客户端标识符关联的先前会话,清除会话CONNECT数据包将强制MQTT代理删除历史数据。

在MQTT v5中,客户端可以选择使用干净启动(Clean Start)(由 CONNECT 消息中的“干净启动”标志指示)。使用这个标志时,代理会丢弃任何以前的会话数据,客户端则会开启新的会话。关闭客户端和服务器之间的 TCP 连接后,会话不会被自动清理。要在客户端断开连接后触发会话删除,必须将“会话到期间隔”的新头字段设置为值 0。

新的Clean Start功能简化了 MQTT 的会话处理,因为它提供了更大的灵活性,并且比 cleanSession/持久会话概念更易于实现。使用 MQTT 5,除非“会话到期间隔”为 0,否则所有会话都是持久的。在超时后或客户端使用干净启动重新连接时,将删除会话。

02 额外的MQTT数据包

MQTT 5引入了一个新的MQTT数据包:AUTH数据包。这个新的数据包对于实现非简单的认证机制非常有用。

AUTH数据包可以在建立连接后由MQTT代理和客户端发送,以使用复杂的质询/响应认证方法(如SASL框架中定义的SCRAM或Kerberos)。也可以用于物联网的最先进的认证方法,如OAuth。这个数据包还允许在不关闭连接的情况下对MQTT客户端进行重新认证。

03 新的数据类型: UTF-8字符串对

自定义报头的出现也需要引入一种新的数据类型:UTF-8字符串对。这种字符串对本质上是一个键-值结构,键和值都是字符串数据类型,这种数据类型目前只用于自定义报头。

有了这种新的数据类型,MQTT在网络上共有7种不同的数据类型可以使用:

  • Bit
  • Two Byte Integer
  • Four Byte Integer
  • UTF-8 Encoded String
  • Variable Byte Integer
  • Binary Data
  • UTF-8 String Pair

大多数用户通常在其 MQTT 库的 API 中使用二进制数据和 UTF-8 编码字符串。在 MQTT 5 中,UTF-8 字符串对也经常被使用。所有其他数据类型对用户是隐藏的,但会被MQTT客户端和代理制作成网络上有效的MQTT数据包。

04 双向的DISCONNECT数据包

在MQTT 3.1.1中,客户端可以通过在关闭底层TCP连接之前,发送一个DISCONNECT数据包来表明它想断开连接。MQTT代理没有办法通知MQTT客户端发生了什么,并且代理将关闭TCP连接。

这一点在新的MQTT5中有所改变,现在允许代理在关闭套接字之前发送一个“MQTT DISCONNECT”包。客户端现在能够解释它被断开连接的原因并采取相应的行动,代理不需要指出确切的原因(例如出于安全原因)。但至少对于开发中的应用来说,这有助于找出代理关闭连接的原因。

当然,DISCONNECT数据包可以携带Reason Codes,所以很容易指出断开连接的原因(例如在无效权限的情况下)。

05 对QoS 1和2的消息不进行重试

MQTT客户端使用常设的TCP(或具有相同保证的类似协议)连接作为基础传输。TCP连接正常时提供双向连接,并且能保证消息符合恰好一次和按顺序传输,因此所有客户端或代理发送的MQTT数据包都会到达另一端。如果TCP连接中断,而消息正在进行时,QoS 1和2会通过多个TCP 连接提供消息传递保证。

MQTT 3.1.1允许在TCP连接正常时重新交付MQTT消息。实际上,这可能会导致过载的MQTT客户端得到更多的过载。试想一下,一个MQTT客户端从MQTT代理处收到一个消息,需要11秒来处理这个消息(并且在处理后会确认数据包)。现在假设,代理会在10秒的超时后重新发送消息。这种方法没有任何优势,它只是占用了带宽,并加重了MQTT客户端的负荷。

06 使用没有用户名的密码

MQTT 3.1.1要求MQTT客户端在CONNECT数据包中使用密码时要发送一个用户名。对于某些用例来说,如果没有用户名是非常不方便的。使用 OAuth就是一个很好的例子,它使用 JSON Web 令牌作为唯一的身份验证和授权信息。在 MQTT 3.1.1 中使用此类令牌时,经常使用静态用户名,因为唯一的相关信息在密码字段中。

虽然MQTT 5 中有更简便的方式来携带令牌(例如通过 AUTH 数据包),但仍然可以使用 CONNECT 数据包的密码字段。现在,用户只需使用密码字段,不再需要填写用户名。

07 虹科HiveMQ MQTT解决方案

虹科HiveMQ 是一个基于 MQTT 数据传输的通信平台,旨在将数据快速、高效、可靠地传递给连接的物联网设备,HiveMQ 使用 MQTT 协议在设备和企业平台之间进行实时、双向的数据推送。

虹科HiveMQ 的建立是为了解决企业在构建新的物联网应用时面临的一些关键技术挑战,包括:

  • 构建可靠、可扩展的关键业务物联网应用
  • 快速的数据交付,以满足终端用户对响应式物联网产品的期望
  • 通过有效利用硬件、网络和云资源降低运营成本
  • 将物联网数据整合到现有的企业系统中

虹科HiveMQ 提供免费版、专业版、企业版 MQTT Broker 产品,并提供 Kafka、企业安全及 MQTT Broker 桥接三种企业级扩展套件,HiveMQ 还提供高效的 MQTT 客户端及云平台,多方位满足用户需求。


更多精彩内容 欢迎关注博主 

 

 


http://www.ppmy.cn/news/71038.html

相关文章

提前熟知领英被限制被封因素,避免踩坑

领英在什么情况下容易被封 01.同一个人注册使用多个领英帐号。 02.多个人共同使用同一个领英帐号。 03.虚假资料注册领英账号,常见于注册领英账号的时候初始姓名随便填写或胡编乱造,注册时使用了网络虚拟的手机号码或邮箱等。 04.领英帐号的个人档案资料…

Jetpack Compose 中的debug调试

之前在 Jetpack Compose 中的重组作用域和性能优化 一文中主要介绍了如何从代码层面进行一些优化以及提到了一些值得注意的优化事项,本文主要来了解一下官方提供了哪些工具层面的手段可以帮助我们进行Compose的debug性能调试。 常规debug方式 这个跟以前的方式一样…

Wijmo 2023 v1 Crack

改进了 FlexGrid,支持 React 18 严格模式和可访问性。 5月 15, 2023 - 10:51 新版本 特征 改进了对 React 18 的支持 - 添加了对 React 18 严格模式的支持,可帮助开发人员在开发过程中查找常见错误。辅助功能改进 - 以下是此版本中…

面试字节,简历做了点手脚,第三方背调公司查出来了,被撤销offer!

简历做了手脚被查出来,怎么办? 一位面试字节的程序员哀叹: 运气差,在简历上做了点手脚,被第三方背调查出来了,只能等着被通知撤销offer! 有人说,现在背调查的可严格了,字…

Spring请求与响应——请求

Spring请求与响应——请求 请求映射路径RequestMapping() 请求参数GetGet发请求参数接收Get请求参数 POSTPOST发送参数 参数种类POJO类型参数数组类型类型参数集合类型参数时间参数演示 JSON数据传输参数发送请求接收请求集合参数与pojo参数演示 RequestBody与RequestParam区别…

软考初级程序员上午单选题(11)

1、无法完成窗口最大化的方法是______。 A.双击窗口中的程序或文件名 B.单击“口”按钮 C.在任务栏上右击,在弹出的快捷菜单上选择“最大化”命令 D.双击标题条 2、在Windows操作系统中,“______”是内存的…

渗透测试--6.1.aircrack-ng破解wifi密码

目录 1.Aircrack-ng简介 1.1 airdump-ng 1.2 aireplay-ng 1.3 aircrack-ng 2.Deauth攻击 3.aircrack-ng工具破解无线网络密码 步骤一:虚拟机连接实验需要用到的网卡 步骤二:设置网卡为监听模式 步骤三:使用wlan0mon网卡扫描附近wif…

postcss详解以及常用方法

postcss postcss 一种对css编译的工具,类似babel对js的处理,常见的功能如: 1 . 使用下一代css语法 2 . 自动补全浏览器前缀 3 . 自动把px代为转换成rem 4 . css 代码压缩等等 postcss 只是一个工具,本身不会对css一顿操作&am…