主要内容

MQTT 简介

消息队列遥测传输 (MQTT) 是一种简单、开放、轻量级的发布-订阅消息传输协议。MQTT 旨在支持与远程设备之间的消息传递,涉及小占用空间、低功耗、低带宽和协商的交付保证。它非常适合在资源受限的环境中使用,例如机器对机器 (M2M) 和物联网 (IOT),其中网络带宽和功率非常宝贵。它是一个简单的轻量级协议,在 TCP/IP 套接字、WebSocket 和(安全套接字层)SSL 上运行。

MQTT 有两个组件:

  • MQTT 代理:MQTT 代理是通信的中心点。代理负责接收所有消息、过滤消息、确定订阅每条消息的客户端,并将消息调度给订阅的客户端。

  • MQTT 客户端:MQTT 客户端是通过网络连接到 MQTT 代理并与之通信的任何设备(例如计算机或手机)。发送消息的客户端是发布者。接收消息的客户端是订阅者。要接收消息,客户端必须订阅该消息的主题。

您可以使用 MQTT PublishMQTT Subscribe 模块发布和订阅 MQTT 消息。这些模块仅通过 TCP/IP 套接字支持 MQTT 协议。

MQTT publish/subscribe architecture

MQTT 中的主题

主题是 MQTT 代理使用的标识符 (ID),用于标识传递消息的合法客户端。每个要发送消息的客户端都会将消息发布到特定的主题上,每个要接收消息的客户端都会订阅某个主题。

主题是字符串,可以由一个或多个主题级别组成。每个级别由正斜杠 (/) 分隔。例如,home/livingroom/temperature8040ed-7865-459f-b98c-7d78/status

主题:

  • 必须包含至少一个字符。

  • 区分大小写。例如,home/room/temperaturehome/Room/temperature 是两个不同的主题。

MQTT 主题中的通配符

通配符是主题中的特殊字符,由客户端用于订阅多个主题。MQTT 支持单级和多级通配符。

  • 单级通配符:单级通配符使用加号 (+) 表示。对于接收消息的客户端,除了具有 + 号的级别之外,订阅主题的所有级别都必须与传入消息的主题匹配。一个主题字符串中可以包含多个单级通配符。

  • 多级通配符:多级通配符使用数字符号 (#) 表示。客户端从订阅主题的所有子级别接收消息。您只能包含一个多级通配符,并且它必须位于主题字符串的末尾。

    注意

    $ 符号开头的主题保留给 MQTT 代理的内部统计量。使用 # 订阅多级主题时,这些主题不属于订阅的一部分。客户端无法发布到这些主题。

主题中的通配符客户端订阅的主题匹配不匹配
单级通配符home/floor1/+/temperature
  • home/floor1/livingroom/temperature

  • home/floor1/kitchen/temperature

在此示例中,通配符 + 被替换为 livingroomkitchen。所有其他级别都与客户端订阅的主题匹配。客户端接收来自这些主题的消息。

  • home/floor1/study/brightness

  • home/floor1/livingroom/temperature/sensor2

在此示例中,通配符 + 被替换为 studylivingroom。其他级别与客户端订阅的主题不匹配。客户端不接收来自这些主题的消息。

多级通配符(所有子级)home/floor1/#
  • home/floor1/livingroom/humidity

  • home/floor1/livingroom/temperature

  • home/floor1/kitchen/temperature

在此示例中,通配符 # 被替换为 livingroom/humiditylivingroom/temperaturekitchen/temperature。所有其他级别都与客户端订阅的主题匹配。客户端接收来自这些主题的消息。

  • home/floor2/livingroom/humidity

  • Home/floor1/kitchen/humidity

在此示例中,通配符 # 被替换为 livingroom/humiditykitchen/humidity。其他级别与客户端订阅的主题不匹配。客户端不接收来自这些主题的消息。

MQTT 中 QoS 的级别

服务质量 (QoS) 定义 MQTT 中消息传递过程的可靠性。MQTT 为消息传递提供三个 QoS 级别:QoS 0、QoS 1 和 QoS 2。发布和订阅消息可以使用不同的 QoS 级别。您使用的 MQTT 代理可能并非所有三个 QoS 级别都支持。例如,ThingSpeak™ MQTT 仅支持 QoS 0。

QoS 0 - 最多一次

QoS 0 级通常称为“即发即弃”,是一种“尽力而为”的传递方式。无法保证传递。接收方不会确认收到消息。发送方不会重试,并会在本地删除消息。

MQTT QoS level 0

QoS 1 - 至少一次

QoS 1 级保证消息至少传递一次。发送方会存储消息,直到收到来自接收方的发布确认 (PUBACK) 数据包。如果 10 秒钟后未收到确认,发送方将重新发送消息。在此级别中,同一消息可能会发送或传递多次。

MQTT QoS level 1

QoS 2 - 仅一次

QoS 2 是 MQTT 中最高级别的服务,它保证每条消息预期的接收者只接收一次。QoS 级别会带来额外开销(四步握手),是所有服务级别中最慢的。

当接收方从发送方获得 QoS 2 数据包时,它会处理该消息并用发布确认 (PUBREC) 数据包进行回复。如果发送方未收到 PUBREC 数据包,它将重新发送该 PUBLISH 数据包,直到收到确认。收到 PUBREC 确认后,发送方便会丢弃初始 PUBLISH 数据包。然后,发送方会存储 PUBREC 数据包,并使用发布丢弃 (PUBREL) 数据包进行响应。

一旦接收方收到 PUBREL 数据包,它就可以丢弃所有存储的状态,并用发布完成 (PUBCOMP) 数据包进行响应。发送方现在可以删除存储的 PUBREC 数据包,数据包标识符可供重用。

MQTT QoS level 2

另请参阅

模块