技术
|
04 Jan 2023
MQTT 详解。在物联网(IoT)环境中开始使用 MQTT 和 MQTT-SN。

掌握在物联网(IoT)环境中理解并开始使用 MQTT 协议和 MQTT-SN 所需的知识。
将数据从 A 点传输到 B 点并返回的方法不胜枚举,但要确保传输的可靠性却并非易事。物联网设备和应用程序(也称为“物”)需要一种可靠、健壮且安全的消息传递协议。这就是 MQTT 发挥作用的地方。
本文涵盖的内容:
实用链接:
MQTT 是一项 OASIS 标准。该规范由 OASIS MQTT 技术委员会负责管理。有关该标准和规范的更多信息,请参阅以下链接:
MQTT-SN(传感器网络版 MQTT)是一种针对传感器网络等低功耗环境进行优化的 MQTT 变体,顾名思义。
在标准功能集的基础上,SN 针对需要更低功耗的应用场景增加了额外功能。这些额外功能包括:
归根结底,物联网(IoT)只有一项任务:在网络上实现设备间的数据传输。 问题在于,这些网络可能遍布世界各地,且每张网络都面临着诸多可能导致其故障的状况。MQTT(以及其扩展版本 MQTT-SN)内置了众多功能,有助于缓解其中一些问题。以下列出部分主要功能:
MQTT 的部署和运行既快速又简单。市面上有数百万个现成的客户端应用程序,可用的消息代理数量也几乎同样庞大。您现在就可以使用 u-blox Thingstream 平台内置的消息代理,立即开始使用 MQTT。
许多物联网设备依赖无线连接来传输和收集数据,这意味着连接性并不总是可靠的。MQTT 允许将消息存储在消息代理中,直到设备准备好接收为止。 得益于 QoS(服务质量)功能,MQTT 能够将消息放入队列,确保消息送达目的地,并在必要时确保每条消息仅被接收一次。
或许更准确地说,MQTT 属于全向通信。任何设备、物联网设备或应用程序均可发布或订阅由代理处理的任何主题。这意味着网络中可以进行通信或监听的对象没有限制。
向一百万台设备广播一条消息,与向仅一百台设备发送同样简单。要让网络上的所有设备都能接收到消息,物联网设备只需向所有设备都订阅的主题发布消息即可。
不要再用“客户端和服务器”的思维模式,而应改用“客户端和代理”的思维模式。 在传统的客户端/服务器关系中,客户端与服务器建立连接,而服务器被视为数据的存储和分发中心。在 MQTT 中,这一过程有所不同。消息代理(broker)扮演着更为被动的角色,更像是一个指示数据应流向何处的路标。
任何运行 MQTT 库并通过网络连接到代理的设备(从微控制器到大型服务器)都可以有效地成为客户端。
客户端之间不会直接发送消息,而是通过消息代理管理的主题进行通信。这些主题的工作原理有点像电子邮件收件箱:设备将消息发布到主题上;当设备订阅这些主题时,便会接收这些消息。
代理负责处理网络中设备的身份验证,并管理连接、会话和订阅。其主要职责是接收所有发布的消息,然后将其发送给已订阅的客户端。代理还会为已订阅的客户端将消息放入队列,并根据约定的服务质量(QoS)级别进行投递。
在 MQTT 网络中,设备和应用程序通常被称为“设备”。这是因为从代理的角度来看,二者并无区别。因此,设备和应用程序均可发布和订阅由代理管理的主题。
目前,现场存在多种 类型的支持 MQTT 的设备,从基于 Arduino 的简单设备,到用于关键任务型商业、工业和医疗应用的设备,不一而足。许多智能家庭和企业系统也是围绕相互连接的 MQTT 设备构建的。
针对希望启动数字化转型或物联网试点的企业,u-blox 开发了XPLR-IOT-1。
XPLR-IOT-1 内置了MQTT Anywhere连接功能,这意味着它开箱即用,可在 190 多个国家/地区运行。

消息并非直接在设备之间传递,而是发布到“主题”中。随后,消息代理会将这些消息分发给任何已订阅的客户端。
MQTT-SN 添加了一些特殊主题功能,以适应带宽受限的环境:
主题是组织网络数据流的绝佳方式,随着规模的扩大,这一点会变得更加明显。 例如,如果您在多个站点部署了配备多个传感器的设备,您可以将所有数据放入一个有效载荷中,并在数据到达目的地时进行解析;或者,您可以采用 MQTT 的方式,利用主题将数据进行划分,如下所示:
当传输的数据按主题划分时,Things 即可订阅其感兴趣的主题。如果某个设备对多个主题感兴趣,可以分别订阅这些主题,也可以使用通配符。例如,要获取来自 site1 的所有数据,应使用通配符“site1/#”。 您还可以使用通配符“+/temp”获取所有站点中的所有“temp”数据。
连接始终在客户端与消息代理之间建立。客户端无法直接相互连接。
连接的建立由客户端发送 CONNECT 消息发起,消息代理随后以 CONNACK(连 接确认)进行响应。若要以服务质量(QoS)级别 0、1 或 2 发布消息,或订阅任何主题,都必须建立连接。 客户端通常使用客户端 ID(ClientID)、用户名和密码连接到消息代理。在任何给定时间,一个客户端与同一消息代理之间只能建立一条连接。
“干净会话”设置允许您从零开始,队列中不包含任何消息。
“保持活动”设置定义了在代理或客户端未发送消息的情况下,连接可以维持的最长时间。
请注意,当客户端处于连接状态时,消息代理会立即投递发布到客户端已订阅主题上的任何消息。因此,特别是在连接不稳定的情况下(例如移动通信),应将保持活动时间保持在最低限度,以防止可能的数据丢失。
MQTT-SN 客户端可以通过发送一个 DURATION 值大于 0 的 DISCONNECT 消息,告知代理它将进入一段时间的休眠状态。
当客户端处于休眠状态时,无论发布时使用的 QoS 级别如何,代理都会将发布到客户端已订阅主题的所有消息放入队列中。
从睡眠状态中,客户端可以通过发出 PINGREQ 来清空队列。如果存在待发送的消息,代理将返回 PUBLISH 响应;当清空完成后,代理将返回 PINGRESP,使设备恢复睡眠状态。
客户端之间不会直接连接,而是通过订阅主题来接收消息。
要订阅某个主题,客户端必须首先向消息代理发送 SUBSCRIBE 请求。SUBSCRIBE 请求中可以包含多个主题。消息代理会通过 SUBACK(订阅确认)响应来回应 SUBSCRIBE 请求。 订阅还具有 QoS 设置,可用于降低发布消息的 QoS 级别。在此情况下,消息将始终以较低的 QoS 设置进行发布。
订阅可以使用以下两种类型的通配符之一。
单级通配符可替换一个主题级别。如下图所示。
此通配符将涵盖以下主题:
多级通配符可替换多个主题级别:
此通配符将涵盖以下主题:
传输保障由 QoS(服务质量)定义。
在此,您将了解如何、何时以及在何处使用 QoS,以及哪些级别适合您的物联网应用。
MQTT 和 MQTT-SN 支持多种 QoS 级别,以保证消息的投递。
QoS -1(负一)非常适合低功耗、非关键型应用,此类应用中并不要求每条消息都必须送达目的 地。由于不与消息代理建立硬连接且不接收确认,因此完成交易所需的功耗大大降低。
QoS -1 的主要特点:
何时使用 QoS -1:
QoS 0(零)用于确保一条消息最多只到达目的地一次。与 QoS -1 不同,此方法需要建立 MQTT 连接,因此在功耗方面效率较低。
QoS 0 的主要特点:
何时使用 QoS 0:
当消息投递至关重要时,应使用 QoS 1。这通过将消息放入队列中,直至订阅者能够接收为止来实现。
QoS 1 的主要特点:
何时使用 QoS 1:
当消息需要仅被接收一次时,应使用 QoS 2。当消息的送达至关重要时,应采用此级别。
何时使用 QoS 2:
当网络中存在大量设备时,可能需要不同的 QoS 级别。 为实现这一点,MQTT 允许在订阅者节点上降低 QoS 级别。其结果是,发布的消息的 QoS 不一定与接收到的消息的 QoS 相同。
QoS 由原始发布者定义,但当代理将消息转发给订阅者时,将采用“发布(PUBLISH)”时的 QoS 与“订阅(SUBSCRIBE)”时定义的 QoS 中的较低者。
确保物联网设备的安全性与确保其正常运行同样重要,且网络上的每个链路或节点都可能成为潜在的攻击载体。虽然协议本身包含一些安全机制,但考虑传输层之外的因素也至关重要。
首先需要考虑安全性的就是网络本身。通过使用 VPN 隧道确保网络连接的安全,可以防止网络流量暴露。
与 HTTP 流量类似,MQTT 流量也可通过 TLS/SSL 在传输层进行加密保护。
协议本身提供了唯一的客户端标识以及用户名/密码凭据,这应被视为最低安全要求。
通过在应用层对有效载荷本身进行加密,可以进一步增强安全性。
u-blox Thingstream 服务交付平台通过不暴露设备的 IP 地址,在上述安全措施之上增加了额外的安全层。由于设备与互联网之间不存在物理连接,这使得设备更难遭到利用。
2019 年,标准组织 OASIS 发布了官方的 MQTT 5.0 标准。
5.0 版本标准新增功能: