虹科干货 | MQTT 5协议中的基础更改(二)

上期文章中给大家介绍了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 客户端及云平台,多方位满足用户需求。

欢迎扫描下方二维码,了解更多MQTT通信解决方案信息~