
技术
|
08 Jan 2022
在 A 与 B 之间来回传输数据的方法有上百万种,但是实现可靠传输并非总是小菜一碟。物联网设备和应用(也称为“Things”)需要使用可靠、稳健且安全的消息传输协议。这就是消息传输协议 MQTT 的来历。
本文将为您提供您需要了解的专业知识,以便您能够在 IoT(物联网)环境中开始使用 MQTT 和 MQTT-SN。
本文涉及的主题:
用最简单的术语来说,MQTT 是一种消息传输协议,旨在为机器对机器 (m2m) 通信设立可靠的标准。该协议由 IBM 的 Andy Stanford Clark 和 Eurotech 的 Arlen Nipper 于 1999 年创建。
MQTT 是一种发布和订阅协议,这意味着无需与服务器进行通信,而由客户端设备和应用发布和订阅主题,该主题由代理进行处理。
MQTT 通常使用 IP(互联网协议)作为其传输协议,但也可以使用其他双向传输协议。
MQTT-SN(用于传感器网络的 MQTT)是 MQTT 的一种变体,顾名思义,该协议已针对在传感器网络等低功耗环境中使用进行了优化。
在标准功能集的基础上,SN 为需要低功耗的用例添加了额外的功能。此类额外功能包括:
归根结底,物联网 (IoT) 仅有一项作用:在网络中的设备之间来回传输数据。问题在于此类网络可能位于世界上的任何地方,并且每个网络都面临着许多可能并且将会导致其发生故障的状况。MQTT 及其扩展而来的 MQTT-SN 具有许多内置功能,可帮助缓解其中的某些问题。下面列出了一些主要功能:
MQTT 的入门和使用既快速又简便。有数百万个现成的客户端应用可用,同时还有几乎一样多的代理。利用 u-blox Thingstream 平台内置的代理,您可以立即开始使用 MQTT。
许多物联网设备都依靠无线电连接来传输和收集数据,这意味着连接并非总是可靠的。MQTT 允许将消息存储在代理中,直到设备准备好接收该消息为止。借助 QoS(服务质量),MQTT 能够对消息进行排队,确保其能够到达目的地,如果需要,则确保该消息仅到达一次。
说 MQTT 是全向的,也许更准确。任何设备、“Thing”或应用都可以发布或订阅由代理处理的任何主题。这意味着在网络上可以发布或订阅的内容没有限制。
借助 MQTT,将消息广播到一百万个设备就像发送到一百个设备一样容易。要想被网络上的其他“Thing”听到,某个“Thing”只需要发布到其他设备都已订阅的主题即可。
请勿将 MQTT 理解为由“客户端和服务器”构成,因为 MQTT 由“客户端和代理”构成。在传统的客户端/服务器关系中,客户端与服务器相连,并且服务器作为数据的存储和分发库。对于 MQTT,该过程有所不同。代理更为被动,其行为更像是路标,为数据指示目的地。
实际上,运行 MQTT 库并通过网络连接到代理的任何“Thing”(从微控制器到大型服务器)都可以成为 MQTT 客户端。
客户端彼此之间不会直接发送消息,而是与代理管理的主题进行沟通。此类主题的工作原理 类似于电子邮件收件箱。某个“Thing”将消息发布到某个主题;如果其他“Thing”订阅了该主题,则就会拾取该消息。
代理处理网络上的“Thing”的身份验证,并且管理连接、会话和订阅。其主要职责是接收各类已发布的消息,然后将消息发送给订阅的客户端。代理还为订阅的客户端对消息进行排队,并根据约定的 QoS 级别传输消息。
MQTT 消息不会在“Thing”之间直接传输。相反,各个“Thing”将消息发布至“主题”。然后,代理会将相关消息发送至任何订阅的客户端。
MQTT-SN 添加了一些特殊的主题功能来帮助带宽受限的环境:
主题是组织流经网络的数据的一种好方法,并且随着规模的增长,这一点会变得更加明显。举例来说,如果您的设备在多个站点上部署了多个传感器,则可以将各类数据放在一个有效负载中,并在数据到达目的地时对其进行解析,或者可以使用 MQTT 方式并使用主题来划分数据,如下所示:
当按主题划分传输的数据时,“Things”可以订阅其感兴趣的主题。如果某个设备对多个主题感兴趣,则可以分别订阅或使用通配符订阅。举例来说,若要获得站点 1 的全部数据,您需要使用通配符,即“site1/#(站点 1/#)”。您也可以使用通配符(即“+/temp(+/温度)”)来获得全部站点的各类“temp(温度)”。
连接始终建立在客户端和代理之间。客户端无法直接相互连接。
建立连接的方式如下:客户端发送一条 CONNECT 消息,然后代理发送一条 CONNACK(连接已确认)消息进行响应。客户端需要建立连接才能发布具有服务质量 (QoS) 级别 0、1 或 2 的主题或订阅任何主题。客户端通常使用客户端 ID (ClientID)、用户名和密码连接到代理。在任何给定时间,客户端仅能与同一代理建立一个连接。
利用“clean session(清理会话)”设置,您可以开始新的会话,同时清除队列中的消息。
“keep alive(保持激活)”设置定义了在代理或客户端不发送消息的情况下,连接可以保持不变的最长时间。此设置允许由电池供电的设备进入休眠状态,在此状态下,发给该设备的全部消息都会缓存在服务器/网关处,并在其醒来后再传递给该设备。
为了让连接保持不变,客户端会在“keep alive(保持激活)”窗口到期之前发送 PINGREQ 消息,代理会以 PINGRESP 消息作为响应。如果在“keep alive(保持激活)”窗口中看不到该设备,则代理可以选择断开会话的连接,然后停止向该设备发送消息,直到下一个会话为止。
通过发送 DURATION 值大于 0 的 DISCONNECT 消息,MQTT-SN 客户端可以告诉代理自己要休眠一段时间。在指定时间段内,代理将保持该状态。在休眠状态下,代理将会对订阅的全部消息进行排队(Qos 0、QoS 1 或 QoS 2)。该设置与“clean session(清理会话)”设为“false(假)”时的断开连接不同,后者仅保留 QoS 1 和 QoS 2 消息。
在休眠时,客户端可以通过发出 PINGREQ 消息来刷新队列而无需醒来。然后,如果有消息要传输,则代理将以 PUBLISH 消息进行响应。完成刷新后,代理将以 PINGRESP 消息进行响应,从而让设备重新进入休眠状态。
MQTT 客户端彼此之间并不直接连接,而是订阅主题以接收消息。
要订阅主题,客户端必须首先将 SUBSCRIBE 请求发送给代理。SUBSCRIBE 请求可以包含多个主题。代理将使用 SUBACK(已确认订阅)消息响应 SUBSCRIBE 请求。订阅还具有用于降低已发布消息的 QoS 级别的 QoS 设置。在此情况下,该消息将始终以较低的 QoS 设置发布。
订阅可以使用以下所示的两种通配符之一。
单级通配符用于替换一个主题级别。如下图所示。
该通配符将涵盖以下主题:
多级通配符用于替换多个主题级别:
该通配符将涵盖以下主题:
在涉及 MQTT 协议时,传输的保证由 QoS(服务质量)定义。
在此处,您将了解到,应该如何以及在何时何地使用 MQTT 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 之中的较低者。
确保物联网设备的安全与确保其正常工作且网络上的每个链接或节点都是潜在的利用媒介一样重要。虽然 MQTT 本身确实包含一些安全机制,但重要的是要考虑与传输本身无关的因素。
首先要考虑网络本身的安全。确保使用 VPN 隧道保护网络连接,从而防止其暴露于网络流量。
与 HTTP 通信一样,可以使用 TLS/SSL 在传输层保护 MQTT 通信。
该协议本身提供了唯一的客户端标识和用户名/密码凭据,应将其视为最低安全要求。
通过在应用层加密有效负载本身可进一步提高安全性。
u-blox Thingstream 服务交付平台通过不公开设备的 IP 地址,在上述功能之上增加了一层额外的安全保护。由于没有与互联网的物理连接,因此设备 更难被黑客利用。