Skip to main content

Please note that u‑blox no longer supports Internet Explorer.

We recommend using the latest version of Google Chrome or Firefox.

Ok

MQTT – 2020 年版初学者指南

Beginner's guide to MQTT

在 A 与 B 之间来回传输数据的方法有上百万种,但是实现可靠传输并非总是小菜一碟。物联网设备和应用(也称为“Things”)需要使用可靠、稳健且安全的消息传输协议。这就是消息传输协议 MQTT 的来历。

本文将为您提供您需要了解的专业知识,以便您能够在 IoT(物联网)环境中开始使用 MQTT 和 MQTT-SN。

本文涉及的主题:

MQTT 是什么?

用最简单的术语来说,MQTT 是一种消息传输协议,旨在为机器对机器 (m2m) 通信设立可靠的标准。该协议由 IBM 的 Andy Stanford Clark 和 Eurotech 的 Arlen Nipper 于 1999 年创建。

MQTT 是一种发布和订阅协议,这意味着无需与服务器进行通信,而由客户端设备和应用发布和订阅主题,该主题由代理进行处理。

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

若要了解 MQTT 的历史,请访问 mqtt.org

What is MQTT? MQTT explained

MQTT-SN 是什么?

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

在标准功能集的基础上,SN 为需要低功耗的用例添加了额外的功能。此类额外功能包括:

  • QoS 模式 -1:实现即发即弃的消息传输
  • 主题别名:简化发布并减少数据开销
  • 休眠模式(断开连接的会话):当远程 Thing 或设备关闭电源时,允许消息在代理上排队

立即开始使用 u‑blox Thingstream

为什么 MQTT 非常适合物联网

归根结底,物联网 (IoT) 仅有一项作用:在网络中的设备之间来回传输数据。问题在于此类网络可能位于世界上的任何地方,并且每个网络都面临着许多可能并且将会导致其发生故障的状况。MQTT 及其扩展而来的 MQTT-SN 具有许多内置功能,可帮助缓解其中的某些问题。下面列出了一些主要功能:

1.MQTT 简单易用

MQTT 的入门和使用既快速又简便。有数百万个现成的客户端应用可用,同时还有几乎一样多的代理。利用 u‑blox Thingstream 平台内置的代理,您可以立即开始使用 MQTT

2.MQTT 的可靠性

许多物联网设备都依靠无线电连接来传输和收集数据,这意味着连接并非总是可靠的。MQTT 允许将消息存储在代理中,直到设备准备好接收该消息为止。借助 QoS(服务质量),MQTT 能够对消息进行排队,确保其能够到达目的地,如果需要,则确保该消息仅到达一次。

3.双向消息传输

说 MQTT 是全向的,也许更准确。任何设备、“Thing”或应用都可以发布或订阅由代理处理的任何主题。这意味着在网络上可以发布或订阅的内容没有限制。

4.大规模消息传输

借助 MQTT,将消息广播到一百万个设备就像发送到一百个设备一样容易。要想被网络上的其他“Thing”听到,某个“Thing”只需要发布到其他设备都已订阅的主题即可。

MQTT 的优点是什么?

Advantages of MQTT messaging protocol

MQTT 客户端和代理

请勿将 MQTT 理解为由“客户端和服务器”构成,因为 MQTT 由“客户端和代理”构成。在传统的客户端/服务器关系中,客户端与服务器相连,并且服务器作为数据的存储和分发库。对于 MQTT,该过程有所不同。代理更为被动,其行为更像是路标,为数据指示目的地。

MQTT 客户端

实际上,运行 MQTT 库并通过网络连接到代理的任何“Thing”(从微控制器到大型服务器)都可以成为 MQTT 客户端。

客户端彼此之间不会直接发送消息,而是与代理管理的主题进行沟通。此类主题的工作原理类似于电子邮件收件箱。某个“Thing”将消息发布到某个主题;如果其他“Thing”订阅了该主题,则就会拾取该消息。

MQTT 代理

代理处理网络上的“Thing”的身份验证,并且管理连接、会话和订阅。其主要职责是接收各类已发布的消息,然后将消息发送给订阅的客户端。代理还为订阅的客户端对消息进行排队,并根据约定的 QoS 级别传输消息。

u‑blox carrier-grade MQTT broker

MQTT 主题

MQTT 消息不会在“Thing”之间直接传输。相反,各个“Thing”将消息发布至“主题”。然后,代理会将相关消息发送至任何订阅的客户端。

MQTT 主题剖析

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

MQTT topic architecture

  • 主题是按案例区分的
  • 主题不必在代理处预先注册。

MQTT-SN 主题功能

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

  • 如果使用预定义的主题,您可以在代理上创建主题别名,然后客户端就可以使用该别名,而无需提前注册。此功能可以减少计费消息的数量。
  • 长主题名称不会在任何方向上无线发送。此功能可以节省带宽,并且不需要将长主题名称存储在内存中。
  • 如果未使用预定义的主题,则“Thing”将使用 REGISTER 命令利用服务器注册主题名称。服务器将使用包含由 2 个字符组成的主题 ID 的 REGACK 进行响应。请注意,每次客户端连接时,您都需要注册主题。

为何要使用 MQTT 主题?

主题是组织流经网络的数据的一种好方法,并且随着规模的增长,这一点会变得更加明显。举例来说,如果您的设备在多个站点上部署了多个传感器,则可以将各类数据放在一个有效负载中,并在数据到达目的地时对其进行解析,或者可以使用 MQTT 方式并使用主题来划分数据,如下所示:

  • site1/position(站点 1/位置)
  • site1/temp(站点 1/温度)
  • site1/vibration(站点 1/振动)
  • site2/position(站点 2/位置)
  • site2/temp(站点 2/温度)
  • site2/vibration(站点 2/振动)

当按主题划分传输的数据时,“Things”可以订阅其感兴趣的主题。如果某个设备对多个主题感兴趣,则可以分别订阅或使用通配符订阅。举例来说,若要获得站点 1 的全部数据,您需要使用通配符,即“site1/#(站点 1/#)”。您也可以使用通配符(即“+/temp(+/温度)”)来获得全部站点的各类“temp(温度)”。

连接

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

建立连接的方式如下:客户端发送一条 CONNECT 消息,然后代理发送一条 CONNACK(连接已确认)消息进行响应。客户端需要建立连接才能发布具有服务质量 (QoS) 级别 0、1 或 2 的主题或订阅任何主题。客户端通常使用客户端 ID (ClientID)、用户名和密码连接到代理。在任何给定时间,客户端仅能与同一代理建立一个连接。

清理会话

利用“clean session(清理会话)”设置,您可以开始新的会话,同时清除队列中的消息。

  • false(假):代理为客户端存储全部订阅,当 QoS 级别为 1 或 2 时,代理将会对已发布的某个订阅的全部消息进行排队
  • true(真):当客户端连接时,代理会清除队列中的全部消息。

保持激活

“keep alive(保持激活)”设置定义了在代理或客户端不发送消息的情况下,连接可以保持不变的最长时间。此设置允许由电池供电的设备进入休眠状态,在此状态下,发给该设备的全部消息都会缓存在服务器/网关处,并在其醒来后再传递给该设备。

为了让连接保持不变,客户端会在“keep alive(保持激活)”窗口到期之前发送 PINGREQ 消息,代理会以 PINGRESP 消息作为响应。如果在“keep alive(保持激活)”窗口中看不到该设备,则代理可以选择断开会话的连接,然后停止向该设备发送消息,直到下一个会话为止。

休眠(仅限 MQTT-SN)

通过发送 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 subscription wildcards topic

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

  • sensors/soil/out(传感器/土壤/输出)
  • sensors/water/out(传感器/水/输出)
  • sensors/light/out(传感器/光/输出)

多级 (#)

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

Wildcard MQTT subscription topic

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

  • sensors/soil/out(传感器/土壤/输出)
  • sensors/soil/in(传感器/土壤/输入)
  • sensors/temperature/out(传感器/温度/输出)

MQTT QoS 说明

在涉及 MQTT 协议时,传输的保证由 QoS(服务质量)定义。

在此处,您将了解到,应该如何以及在何时何地使用 MQTT QoS,以及哪些级别适合您自己的物联网应用。

MQTT QoS 级别

MQTT 和 MQTT-SN 支持多个级别的 QoS,以确保消息传输。

QoS -1 – 即发即弃

QoS -1(负一)是低功耗非关键应用的理想之选,在此类应用中,每条消息是否到达目的地都无关紧要。通过不与代理建立硬连接并且不接收任何确认,此级别将大幅减少完成处理所用的电量。

MQTT-SN QoS level -1

QoS -1 主要特性:

  • 仅适用于使用 MQTT-SN 的设备
  • 无需建立 MQTT 连接
  • 无接收者的确认
  • 发送者无法重试
  • 到达代理的用时类似于 QoS 0

何时使用 QoS -1:

  • 功率受限“Things”的理想之选,旨在最大程度缩短无线传输时间
  • 最大程度降低消息传输成本
  • 适用于频繁发送的数据等非关键消息的传输

QoS 0 – 至多一次

QoS 0(零)用于确保消息到达其目的地的次数不超过一次。与 QoS -1 不同,此级别需要建立 MQTT 连接,也就意味其在功耗方面的效率较低。

MQTT QoS level 0

QoS 0 主要特性:

  • 尽力实现消息传输
  • 无接收者的确认
  • 发送者无法重试
  • 对于订阅了某个主题且已断开连接的客户端,代理不会对消息进行排队

何时使用 QoS 0:

  • 适用于功率受限“Things”,旨在最大程度缩短无线传输时间
  • 最大程度降低消息传输成本
  • 适用于频繁发送的数据等非关键消息的传输
  • 效率不如 MQTT-SN QoS -1,因为需要建立 MQTT 连接

QoS 1 – 至少一次

QoS 1 适用于消息传输非常重要的场景。若要实现此服务级别,需要对消息进行排队,直到订阅者可以接收到为止。

MQTT QoS level 1

QoS 1 主要特性:

  • 确保至少将消息传输给接收者一次。
  • 发送者存储消息,直到收到接收者的 PUBACK 消息
  • 消息可能会收发多次。

何时使用 QoS 1:

  • 在必须接收每条消息时使用,但要确保处理重复项
  • 希望消息在代理处排队以传输到离线客户端时使用
  • 当 QoS 2 的开销过高时使用

QoS 2 – 只有一次

QoS 2 适用于消息需要到达一次且仅一次的场景。此级别适用于必须传输消息的场景。

MQTT QoS level 2

  • QoS 2 是最安全、最慢的服务质量级别
  • 对于每个消息,通过在发送者与接收者之间使用至少两个请求/响应流(四次握手),确保目标接收者仅接收一次。

何时使用 QoS 2:

  • 适用于消息传输至关重要并且重复数据对订阅者有害的场景

QoS 降级

如果网络上有许多设备,则可能需要使用不同级别的 QoS。为此,MQTT 允许在订阅者节点处降低 QoS 级别。此操作的结果就是,发布的消息的 QoS 可能与接收的消息的 QoS 不同。

MQTT QoS downgrade

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

安全 – MQTT 安全吗?

确保物联网设备的安全与确保其正常工作且网络上的每个链接或节点都是潜在的利用媒介一样重要。虽然 MQTT 本身确实包含一些安全机制,但重要的是要考虑与传输本身无关的因素。

网络层安全

首先要考虑网络本身的安全。确保使用 VPN 隧道保护网络连接,从而防止其暴露于网络流量。

传输层安全

与 HTTP 通信一样,可以使用 TLS/SSL 在传输层保护 MQTT 通信。

应用层安全

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

有效负载加密

通过在应用层加密有效负载本身可进一步提高安全性。

U-blox Thingstream MQTT 安全

u‑blox Thingstream 服务交付平台通过不公开设备的 IP 地址,在上述功能之上增加了一层额外的安全保护。由于没有与互联网的物理连接,因此设备更难被黑客利用。

立即开始使用 u‑blox Thingstream

额外资源