Main Content

发布 MQTT 消息并订阅消息主题

消息队列遥测传输 (MQTT) 是一种发布-订阅架构,主要用于通过无线网络连接带宽和功率受限的设备。它是一个简单的轻量级协议,在 TCP/IP 套接字、WebSocket 和 SSL(安全套接字层)上运行。

MQTT 有两个组件:

  • MQTT 代理 - MQTT 代理是通信的中心点。代理负责在客户端之间调度所有消息。

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

MQTT architecture

MQTT 中的主题

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

主题是字符串,可以由一个或多个主题级别组成。每个级别由正斜杠 (/) 分隔,例如 home/livingroom/temperature

主题:

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

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

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/floor2/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 代理不会重试,并会在本地删除消息。

MQTT QoS Level 0

QoS 1 - 至少一次

QoS 1 级保证消息至少传递一次。MQTT 代理至少向客户端计算机发送一次消息。MQTT 代理会存储消息,直到收到来自客户端的发布确认 (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