技术

|

04 Jan 2023

MQTT 入门指南

MQTT 详解。在物联网(IoT)环境中开始使用 MQTT 和 MQTT-SN。

Beginner's guide to MQTT

掌握在物联网(IoT)环境中理解并开始使用 MQTT 协议和 MQTT-SN 所需的知识。

将数据从 A 点传输到 B 点并返回的方法不胜枚举,但要确保传输的可靠性却并非易事。物联网设备和应用程序(也称为“物”)需要一种可靠、健壮且安全的消息传递协议。这就是 MQTT 发挥作用的地方。

本文涵盖的内容:

借助 MQTT,让您的物联网设备“飞”起来

什么是 MQTT?MQTT 详解

  • MQTT(消息队列遥测传输)是一种消息协议,旨在为机器间(M2M)通信建立一个可靠的标准。
  • MQTT 是一种发布-订阅协议,这意味着客户端设备和应用程序无需直接与服务器通信,而是向由代理(broker)管理的主题进行发布和订阅。
  • MQTT通常使用TCP/IP(传输控制协议/互联网协议)作为传输层,但也可以使用其他双向传输协议。
  • 凭借其高效性和灵活性,MQTT 已成为物联网通信的事实标准。u-blox 利用该协议覆盖各种无线网络(2G-4G 蜂窝网络和 LoRa)及协议(USSD、UDP),为开发者提供熟悉且简单的体验。
  • MQTT 允许设备和系统(客户端)通过发送消息进行通信。消息并非直接在客户端之间发送,而是由客户端发布到存储在 MQTT 代理中的主题*中。
  • 客户端通过订阅一个或多个主题来接收消息,并从该时刻起开始接收相关消息。
  • 主题就像街道地址——它们形成了一棵树,越往下走,具体程度就越高。
  • 发布消息时可设置不同的服务质量(QoS)级别,这些级别定义了消息的可靠性,以及是否生成投递回执。
  • MQTT 由 Andy Stanford Clark 和 Arlen Nipper 于 1999 年创建。

实用链接:

MQTT 规范

MQTT 是一项 OASIS 标准。该规范由 OASIS MQTT 技术委员会负责管理。有关该标准和规范的更多信息,请参阅以下链接:

 

What is MQTT? MQTT explained

什么是 MQTT-SN?

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

在标准功能集的基础上,SN 针对需要更低功耗的应用场景增加了额外功能。这些额外功能包括:

  • QoS 模式 -1:支持“发送即忘”式消息传输
  • 主题别名:可简化发布流程并减少数据开销
  • 休眠模式(断开连接的会话):当远程设备或终端断电时,允许消息在代理上排队

为何 MQTT 非常适合物联网

归根结底,物联网(IoT)只有一项任务:在网络上实现设备间的数据传输。 问题在于,这些网络可能遍布世界各地,且每张网络都面临着诸多可能导致其故障的状况。MQTT(以及其扩展版本 MQTT-SN)内置了众多功能,有助于缓解其中一些问题。以下列出部分主要功能:

1. 简单易用

MQTT 的部署和运行既快速又简单。市面上有数百万个现成的客户端应用程序,可用的消息代理数量也几乎同样庞大。您现在就可以使用 u-blox Thingstream 平台内置的消息代理,立即开始使用 MQTT。

2. 可靠性高

许多物联网设备依赖无线连接来传输和收集数据,这意味着连接性并不总是可靠的。MQTT 允许将消息存储在消息代理中,直到设备准备好接收为止。 得益于 QoS(服务质量)功能,MQTT 能够将消息放入队列,确保消息送达目的地,并在必要时确保每条消息仅被接收一次。

3. 双向消息传递

或许更准确地说,MQTT 属于全向通信。任何设备、物联网设备或应用程序均可发布或订阅由代理处理的任何主题。这意味着网络中可以进行通信或监听的对象没有限制。

4. 大规模消息传输

向一百万台设备广播一条消息,与向仅一百台设备发送同样简单。要让网络上的所有设备都能接收到消息,物联网设备只需向所有设备都订阅的主题发布消息即可。

请阅读我们的白皮书,了解基于 u-blox MQTT 的服务如何帮助您解决物联网设备与企业之间通信的复杂问题

MQTT 有哪些优势?

  • 简化通信
    通信是一个复杂的问题。MQTT 降低了复杂性,允许通过单个连接访问消息主题。数据具有逻辑结构,且可灵活处理。
  • 消除轮询
    即时、基于推送的传输方式,使消息消费者无需定期检查或“轮询”新信息。这极大地减少了网络流量。
  • 动态目标定位
    MQTT 使服务发现更轻松且更少出错。发布者无需维护应用程序可发送消息的对等节点列表,只需将消息发布到主题即可。
  • 解耦与扩展
    MQTT 还使解决方案更加灵活,并支持扩展。它允许更改通信模式,在添加或修改功能时,不会在整个系统中产生连锁反应。
Advantages of MQTT messaging protocol

MQTT 客户端与代理

不要再用“客户端和服务器”的思维模式,而应改用“客户端和代理”的思维模式。 在传统的客户端/服务器关系中,客户端与服务器建立连接,而服务器被视为数据的存储和分发中心。在 MQTT 中,这一过程有所不同。消息代理(broker)扮演着更为被动的角色,更像是一个指示数据应流向何处的路标。

MQTT 客户端

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

客户端之间不会直接发送消息,而是通过消息代理管理的主题进行通信。这些主题的工作原理有点像电子邮件收件箱:设备将消息发布到主题上;当设备订阅这些主题时,便会接收这些消息。

MQTT 消息代理

代理负责处理网络中设备的身份验证,并管理连接、会话和订阅。其主要职责是接收所有发布的消息,然后将其发送给已订阅的客户端。代理还会为已订阅的客户端将消息放入队列,并根据约定的服务质量(QoS)级别进行投递。

 

u-blox carrier-grade MQTT broker

MQTT 设备和应用程序

在 MQTT 网络中,设备和应用程序通常被称为“设备”。这是因为从代理的角度来看,二者并无区别。因此,设备和应用程序均可发布和订阅由代理管理的主题。

设备

目前,现场存在多种类型的支持 MQTT 的设备,从基于 Arduino 的简单设备,到用于关键任务型商业、工业和医疗应用的设备,不一而足。许多智能家庭和企业系统也是围绕相互连接的 MQTT 设备构建的。

Instant IoT

XPLR-IOT-1-Digikey

针对希望启动数字化转型或物联网试点的企业,u-blox 开发了XPLR-IOT-1。

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

MQTT Anywhere

 

MQTT 主题

消息并非直接在设备之间传递,而是发布到“主题”中。随后,消息代理会将这些消息分发给任何已订阅的客户端。

MQTT 主题的结构

  • 主题由一个或多个主题层级组成,各层级之间以正斜杠分隔:

 

MQTT topic architecture
  • 主题名称区分大小写
  • 主题无需在消息代理处预先注册。

MQTT-SN 主题功能

MQTT-SN 添加了一些特殊主题功能,以适应带宽受限的环境:

  • 如果使用预定义主题,您可以在代理服务器上创建主题别名,客户端随后即可直接使用该别名,无需事先注册。这可以减少计费消息的数量。
  • 无论在哪个方向,都不必通过无线网络传输长主题名称。这既节省了带宽,也无需在内存中存储长主题名称。
  • 如果不使用预定义主题,设备将使用 REGISTER 命令向服务器注册主题名称。服务器将返回包含一个由 2 个字符组成的主题 ID 的 REGACK 响应。请注意,客户端每次连接时都需要注册该主题。

为什么要使用主题?

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

  • site1/position
  • site1/temp
  • site1/振动
  • site2/position
  • site2/temp
  • 站点2/振动

当传输的数据按主题划分时,Things 即可订阅其感兴趣的主题。如果某个设备对多个主题感兴趣,可以分别订阅这些主题,也可以使用通配符。例如,要获取来自 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 设置进行发布。

订阅通配符

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

单级通配符 (+)

单级通配符可替换一个主题级别。如下图所示。

 

MQTT subscription wildcards topic

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

  • sensors/soil/out
  • sensors/water/out
  • 传感器/光照/输出

多级 (#)

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

 

Wildcard MQTT subscription topic

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

  • sensors/soil/out
  • 传感器/土壤/输入
  • sensors/temperature/out

MQTT 服务质量(QoS)详解

传输保障由 QoS(服务质量)定义。

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

QoS 级别

MQTT 和 MQTT-SN 支持多种 QoS 级别,以保证消息的投递。

QoS -1 – 发送即忘

QoS -1(负一)非常适合低功耗、非关键型应用,此类应用中并不要求每条消息都必须送达目的地。由于不与消息代理建立硬连接且不接收确认,因此完成交易所需的功耗大大降低。

 

MQTT-SN QoS level -1

QoS -1 的主要特点:

  • 仅适用于使用 MQTT-SN 的设备
  • 无需建立 MQTT 连接
  • 接收方不发送确认
  • 发送方不会进行重试
  • 在到达消息代理时,其行为与 QoS 0 类似

何时使用 QoS -1:

  • 非常适合功耗受限的物联网设备,以最大限度地减少空中传输时间
  • 最大限度降低消息传输成本
  • 若消息投递不关键(例如频繁发送的数据),则可采用

QoS 0 – 至多一次

QoS 0(零)用于确保一条消息最多只到达目的地一次。与 QoS -1 不同,此方法需要建立 MQTT 连接,因此在功耗方面效率较低。

 

MQTT QoS level 0

QoS 0 的主要特点:

  • 尽力而为的消息投递
  • 接收方不发送确认
  • 发送方不进行重试
  • 对于对该主题拥有有效订阅但已断开连接的客户端,消息代理不会将其放入队列

何时使用 QoS 0:

  • 适用于功耗受限的物联网设备,以最大限度地减少空中传输时间
  • 最大限度降低消息传输成本
  • 若消息投递不关键(例如频繁发送的数据),则适用
  • 由于需要执行 CONNECT 操作,其效率不如 MQTT-SN QoS -1

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 是否安全?

确保物联网设备的安全性与确保其正常运行同样重要,且网络上的每个链路或节点都可能成为潜在的攻击载体。虽然协议本身包含一些安全机制,但考虑传输层之外的因素也至关重要。

网络层安全

首先需要考虑安全性的就是网络本身。通过使用 VPN 隧道确保网络连接的安全,可以防止网络流量暴露。

传输层安全

与 HTTP 流量类似,MQTT 流量也可通过 TLS/SSL 在传输层进行加密保护。

应用层安全

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

有效载荷加密

通过在应用层对有效载荷本身进行加密,可以进一步增强安全性。

u-blox Thingstream MQTT 安全性

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

MQTT v5.0 及未来发展

2019 年,标准组织 OASIS 发布了官方的 MQTT 5.0 标准。

5.0 版本标准新增功能:

  • 原因代码:确认消息现支持返回代码,可提供失败原因。
  • 共享订阅:允许在客户端之间平衡负载,从而降低负载问题的风险
  • 消息过期:消息可包含过期日期,若在此时间段内未送达,则会被删除。
  • 主题别名:主题名称可替换为单个数字

u-blox MQTT IoT 服务

  • MQTT Anywhere- 基于SIM卡的LPWA物联网通信即服务
  • MQTT Flex——支持自带SIM卡的MQTT-SN通信,提供LTE和NB-IoT连接
  • MQTT Now——面向 IP 设备的基于云的 MQTT 集成

立即开始使用 u-blox Thingstream

您可能还对以下内容感兴趣