​MQTT 解释道。开始在 IoT(物联网)环境中使用 MQTT 和 MQTT-SN。获取了解并开始在 IoT(物联网)环境中使用 MQTT 协议和 MQTT-SN 所需的专业知识。

有一百万种方法可以从 A 获取数据到 B,然后再返回,但可靠地做到这一点并不总是轻而易举。物联网设备和应用程序(也称为“事物”)需要可靠、强大且安全的消息传递协议。这就是 MQTT 的用武之地。MQTT 初学者指南

什么是 MQTT?MQTT 解释

  • MQTT(消息队列遥测传输)是一种消息传递协议,旨在为机器对机器 (m2m) 通信创建可靠的标准。

  • MQTT 是一种发布和订阅协议,这意味着客户端设备和应用程序不是与服务器通信,而是发布和订阅由代理处理的主题。

  • MQTT 通常使用 TCP/IP(传输控制协议/互联网协议)作为其传输,但也可以使用其他双向传输。

  • MQTT 因其高效和灵活性而成为物联网通信事实上的标准。u-blox 使用它来覆盖各种无线电网络(2G-4G 蜂窝和 LoRa)和协议(USSD、UDP),为开发人员提供熟悉且简单的体验。

  • MQTT 允许设备和系统(客户端)通过发送消息进行通信。消息不是直接从客户端发送到客户端,而是由客户端发布到存储在 MQTT 代理中的主题。

  • 客户端通过订阅一个或多个主题来接收消息,并将从该点开始接收消息。

  • 主题就像街道地址 – 它们形成一棵树,您走得越远,树就越具体。

  • 消息可以以不同的服务质量级别发布,这些级别定义可靠性以及是否生成收据以进行传递。

  • MQTT 由安迪·斯坦福·克拉克和阿伦·尼珀于 1999 年创建。

MQTT规范

MQTT 是 OASIS 标准。该规范由 OASIS MQTT 技术委员会管理。

什么是 MQTT-SN?

顾名思义,MQTT-SN(用于传感器网络的 MQTT)是其变体,已针对传感器网络等低功耗环境进行了优化。

除了标准功能集之外,SN 还为需要较低功耗的用例添加了额外的功能。这些额外功能包括:

  • QoS 模式 -1:允许即发即弃消息传递

  • 主题别名:允许简化发布并减少数据开销

  • 睡眠模式(断开连接的会话):允许在远程事物或设备关闭时消息在代理上排队

为什么 MQTT 非常适合物联网

归根结底,物联网 (IoT) 只有一项工作:从网络上的设备获取数据或从网络上的设备获取数据。问题在于,这些网络可能位于世界任何地方,并且每个网络都面临许多可能导致它们失败的条件。MQTT 以及扩展的 MQTT-SN 具有多种内置功能,可帮助缓解其中一些问题。下面列出了一些主要功能:

1. 很简单

MQTT 的设置和运行既快速又简单。有数百万个现成的客户端应用程序和几乎同样多的可用经纪人。您现在可以通过使用 u-blox Thingstream 平台集成的代理来开始使用 MQTT 。

2. 可靠

许多物联网设备依赖无线电连接来传输和收集数据,这意味着连接并不总是可靠的。MQTT 可以允许将消息存储在代理中,直到设备准备好接收消息。得益于 QoS(服务质量),MQTT 能够对消息进行排队,确保它们到达目的地,并且如果需要,确保它们只到达那里一次。

3. 双向消息传递

或许说 MQTT 是全方位的更准确。任何设备、事物或应用程序都可以发布或订阅代理处理的任何主题。这意味着网络上的通话或收听内容没有限制。

4. 大规模消息传递

向一百万台设备广播消息与向一百台设备发送消息一样容易。要被网络上的所有设备听到,事物只需发布到所有设备都订阅的主题即可。

MQTT 的优点是什么?

  • 简化沟通
    沟通是一个复杂的问题。MQTT 降低了复杂性,允许与消息主题的单个连接。数据具有逻辑结构,可以灵活处理。

  • 消除轮询
    基于推送的即时传递,使消息使用者无需定期检查或“轮询”新信息。这大大减少了网络流量。

  • 动态定位
    MQTT 使服务发现变得更容易且不易出错。发布者只需将消息发布到某个主题,而不是维护应用程序可以向其发送消息的对等点名册。

  • 解耦和扩展
    MQTT 还使解决方案更加灵活并实现扩展。它允许改变通信模式、添加或更改功能,而不会在整个系统中产生连锁反应。

MQTT 客户端和代理

不要考虑“客户端和服务器”,而要考虑“客户端和代理”。在传统的客户端/服务器关系中,客户端和服务器连接,服务器被视为数据的存储和分发库。对于 MQTT,过程有所不同。经纪人更加被动,更像是数据应该去向的路标。

MQTT客户端

任何运行 MQTT 库并通过网络连接到代理的设备(从微控制器到大型服务器)都可以有效地成为客户端。

客户端不会直接相互发送消息,而是与代理管理的主题进行通信。这些主题的工作方式有点像电子邮件收件箱。消息由事物发布到主题;当事物订阅这些主题时,就会收到消息。

MQTT 代理

代理处理网络上事物的身份验证以及管理连接、会话和订阅。它的主要职责是接收所有发布的消息,然后发送给订阅的客户端。代理还对订阅客户端的消息进行排队,根据商定的 QoS 级别传递它们。

MQTT 设备和应用程序

在 MQTT 网络中,设备和应用程序通常被称为“事物”。原因是对于经纪商而言,两者之间没有区别。为此,设备和应用程序都可以发布和订阅由代理管理的主题。

设备

如今,该领域有各种类型的支持 MQTT 的设备,从简单的基于 Arduino 的设备到用于任务关键型商业、工业和医疗应用的设备。许多智能家居和企业也是围绕互连的 MQTT 设备构建的。

即时物联网

IoT(物联网)环境中使用 MQTT 和 MQTT-SN

对于希望开展数字化转型或物联网试验的企业,u-blox 开发了XPLR-IOT-1。

XPLR-IOT-1 内置了MQTT Anywhere连接,这意味着它开箱即可在 190 多个国家/地区运行。

除了访问 u-blox物联网通信即服务套件外,XPLR-IOT-1 还包含 u-blox GNSS 和短程设备、一系列传感器,并可轻松访问 u-blox 物联网位置 -即服务服务。

MQTT 主题

消息不会直接从事物传送到事物。相反,它们被发布到“主题”。然后,代理将这些消息传递给任何订阅的客户端。

MQTT 主题剖析

  • 主题由一个或多个主题级别组成,以正斜杠分隔:

  • 主题区分大小写

  • 主题不必在经纪人处预先注册。

MQTT-SN主题特性

MQTT-SN 添加了一些特殊主题功能来帮助带宽受限的环境:

  • 如果使用预定义主题,您可以在代理上创建一个主题别名,然后客户端无需先注册即可使用该别名。这可以减少计费消息的数量。

  • 长主题名称不必在任一方向通过无线方式发送。这样可以节省带宽,并且不需要在内存中存储长主题名称。

  • 如果不使用预定义主题,Things 会使用 REGISTER 命令向服务器注册主题名称。服务器将使用 REGACK 进行响应,其中包含由 2 个字符组成的主题 ID。请注意,您需要在每次客户端连接时注册主题。

为什么要使用主题?

主题是组织网络中数据流动的好方法,随着规模的扩大,这一点变得更加明显。例如,如果您的设备在多个站点部署了多个传感器,您可以将所有数据放入一个有效负载中,并在到达目的地时解析它,或者您可以采用 MQTT 方式并使用主题来划分数据, 如下所示:

  • 站点1/位置

  • 站点1/温度

  • 站点1/振动

  • 站点2/位置

  • 站点2/温度

  • 站点2/振动

当传输的数据按主题划分时,物体就可以订阅它们感兴趣的主题。如果一个设备对多个主题感兴趣,可以单独订阅它们,也可以使用通配符。例如,要从 site1 获取所有数据,您可以使用通配符“site1/#”。您还可以使用通配符“+/temp”从所有站点获取所有“temp”数据。

连接

连接始终在客户端和代理之间建立。客户端无法直接相互连接。

连接是通过客户端发送 CONNECT 消息建立的,代理以 CONNACK(连接已确认)响应该消息。需要连接才能以服务质量 (QoS) 级别 0、1 或 2 进行发布或订阅任何主题。客户端通常使用客户端 ID (ClientID)、用户名和密码连接到经纪商。客户端在任何给定时间只能与同一个代理建立一个连接。

清洁会议

“干净会话”设置使您能够在队列中没有消息的情况下重新开始。

  • false:代理存储客户端的所有订阅,并将对该订阅以 QoS 级别 1 或 2 发布的所有消息进行排队

  • true:当客户端连接时,代理清除所有排队的消息。

活着

“保持活动”设置定义了在代理或客户端不发送消息的情况下连接可以保持原状的最长时间。

请注意,当客户端处于连接状态时,代理将立即传递发布到客户端订阅的主题的任何消息。因此,特别是在连接不稳定的情况下,例如在移动通信中,应将保持活动保持在最低限度,以防止可能的数据丢失。

睡眠(仅限 SN)

MQTT-SN 客户端可以通过发送 DURATION 大于 0 的 DISCONNECT 消息来告知代理它将休眠一段时间。

当客户端处于睡眠状态时,代理会将发布到客户端订阅的主题的所有消息排队,无论发布所使用的 QoS 如何。

从睡眠状态,客户端可以通过发出 PINGREQ 来刷新队列。如果有消息要传递,代理将响应 PUBLISH,并在刷新完成时响应 PINGRESP,使设备重新进入睡眠状态。

订阅

客户端并不直接相互连接,而是订阅主题来接收消息。

要订阅主题,客户端必须首先向代理发送 SUBSCRIBE 请求。SUBSCRIBE 请求可以包含多个主题。代理使用 SUBACK(订阅已确认)响应来响应 SUBSCRIBE 请求。订阅还具有 QoS 设置,可用于降低已发布消息的 QoS。在这种情况下,消息始终以较低的 QoS 设置发布。

订阅通配符

订阅可以使用如下所示的两种类型的通配符之一。

单级 (+)

单级通配符替换一个主题级别。

该通配符将涵盖以下主题:

  • 传感器/土壤/输出

  • 传感器/水/出

  • 传感器/灯/输出

多级 (#)

多级通配符替换多个主题级别:

该通配符将涵盖以下主题:

  • 传感器/土壤/输出

  • 传感器/土壤/in

  • 传感器/温度/输出

MQTT QoS 解释

交付保证由 QoS(服务质量)定义。

在这里,您将了解如何、在何处以及何时使用 QoS,以及哪些级别适合您自己的 IoT 应用程序。

服务质量级别

MQTT 和 MQTT-SN 支持多级 QoS,以保证消息传递。

QoS -1 – 即发即忘

QoS -1(负一)非常适合低功耗非关键应用程序,在这些应用程序中,每条消息是否到达目的地并不重要。通过不与代理建立硬连接并且不接收确认,完成交易所需的电量要少得多。

QoS -1 主要特点:

  • 仅适用于使用 MQTT-SN 的设备

  • 不需要建立 MQTT 连接

  • 没有收到收件人的确认

  • 发件人未重试

  • 类似于到达代理时的 QoS 0

何时使用 QoS -1:

  • 非常适合功率受限的设备,以最大限度地减少播出时间

  • 最小化消息传递成本

  • 如果消息传递不重要(例如频繁发送的数据),则可以

QoS 0 – 最多一次

QoS 0(零)用于确保消息到达目的地的次数不超过一次。与 QoS -1 不同,此方法需要 MQTT 连接,这意味着它的功耗效率较低。

QoS 0 主要特点:

  • 尽力而为的消息传递

  • 没有收到收件人的确认

  • 发件人未重试

  • 代理不会对具有有效主题订阅的断开连接的客户端进行排队

何时使用 QoS 0:

  • 适合功率受限的事物,以最大限度地减少播出时间

  • 最小化消息传递成本

  • 如果消息传递不重要(例如频繁发送的数据),则可以

  • 由于 CONNECT 的要求,效率不如 MQTT-SN QoS -1

QoS 1 – 至少一次

当消息传递至关重要时,使用 QoS 1。这是通过对消息进行排队直到订阅者能够接收它来实现的。

QoS 1 主要特点:

  • 保证消息至少传送给收件人一次。

  • 发送方存储消息,直到收到接收方的 PUBACK

  • 消息可以被发送或传递多次。

何时使用 QoS 1:

  • 当您必须接收每条消息但确保处理重复消息时使用

  • 如果您希望消息在代理上排队以便传递给离线客户端,请使用

  • 当QoS 2的开销过高时使用

QoS 2 – 恰好一次

当消息需要到达一次且仅一次时,使用 QoS 2。当必须交付时使用此级别。

  • QoS 2 是最安全且最慢的服务质量级别

  • 通过在发送者和接收者之间使用至少两个请求/响应流(四部分握手),保证每条消息仅被预期接收者接收一次。

何时使用 QoS 2:

  • 如果消息传递至关重要且重复数据对订阅者有害,则使用

服务质量降级

如果网络上有许多设备,则可能需要不同级别的 QoS。为了实现这一点,MQTT 允许降低订阅者节点的 QoS 级别。其结果是,发布的消息的 QoS 不必与接收的消息的 QoS 相同。

QoS 由原始发布者定义,但当代理将消息传递给订阅者时,将使用 PUBLISH QoS 和 SUBSCRIBE 期间定义的 QoS 中较低者。

安全性——MQTT 安全吗?

确保物联网设备安全与确保它们正常工作同样重要,网络上的每个链路或节点都是潜在的漏洞利用向量。虽然协议本身确实包含一些安全机制,但考虑与传输本身无关的因素也很重要。

网络级安全

首先要考虑安全性的是网络本身。使用 VPN 隧道确保网络连接的安全将防止暴露于网络流量。

传输级安全

与 HTTP 流量一样,可以使用 TLS/SSL 在传输层保护 MQTT 流量的安全。

应用程序级安全性

唯一的客户端标识和用户名/密码凭据由协议本身提供,应被视为最低限度的安全要求。

有效负载加密

通过在应用程序级别加密有效负载本身可以增加进一步的安全性。

U-blox Thingstream MQTT 安全

u-blox Thingstream 服务交付平台通过不暴露设备的 IP 地址,在上述安全之上添加了额外的安全层。由于没有与互联网的物理连接,这使得设备更难被利用。

MQTT v5.0及未来演进

2019年,标准机构OASIS发布了官方MQTT 5.0标准。

5.0 版标准添加的新功能:

  • 原因代码:确认现在支持返回代码,它提供失败的原因。

  • 共享订阅:允许跨客户端平衡负载,从而降低负载问题的风险

  • 消息到期:消息可以包含到期日期,如果在此时间段内未送达,消息将被删除。

  • 主题别名:主题名称可以用单个数字替换

u-blox MQTT 物联网服务

  • MQTT Anywhere – 基于 SIM 的 LPWA 物联网通信即服务

  • MQTT Flex – 具有自带 SIM LTE 和 NB-IoT 连接的 MQTT-SN 通信

  • MQTT Here – LoRaWAN 物联网连接解决方案

  • MQTT Now – 用于 IP 设备的基于云的 MQTT 集成