发布 MQTT 消息并订阅消息主题
消息队列遥测传输 (MQTT) 是一种发布-订阅架构,主要用于通过无线网络连接带宽和功率受限的设备。它是一个简单的轻量级协议,在 TCP/IP 套接字、WebSocket 和 SSL(安全套接字层)上运行。
MQTT 有两个组件:
MQTT 代理 - MQTT 代理是通信的中心点。代理负责在客户端之间调度所有消息。
MQTT 客户端 - MQTT 客户端是连接到代理的任何设备(例如计算机或手机)。发送消息的客户端是发布者。接收消息的客户端是订阅者。要接收消息,客户端必须订阅该消息的主题。
MQTT 中的主题
主题是 MQTT 代理使用的标识符 (ID),用于标识传递消息的合法客户端。每个要发送消息的客户端都会将消息发布到特定的主题上,每个要接收消息的客户端都会订阅某个主题。
主题是字符串,可以由一个或多个主题级别组成。每个级别由正斜杠 (/) 分隔,例如 home/livingroom/temperature
。
主题:
必须包含至少一个字符。
区分大小写。例如,
home/room/temperature
和home/Room/temperature
是两个不同的主题。
MQTT 主题中的通配符
通配符是主题中的特殊字符,由客户端用于订阅多个主题。MQTT 支持单级和多级通配符。
单级通配符:单级通配符使用加号 (
+
) 表示。对于接收消息的客户端,除了具有+
号的级别之外,订阅主题的所有级别都必须与传入消息的主题匹配。一个主题字符串中可以包含多个单级通配符。多级通配符:多级通配符使用数字符号 (
#
) 表示。客户端从订阅主题的所有子级别接收消息。您只能包含一个多级通配符,并且它必须位于主题字符串的末尾。主题中的通配符 客户端订阅的主题 匹配 不匹配 单级通配符 home/floor1/+/temperature
home/floor1/livingroom/temperature
home/floor1/kitchen/temperature
在此示例中,通配符
+
被替换为livingroom
和kitchen
。所有其他级别都与客户端订阅的主题匹配。客户端接收来自这些主题的消息。home/floor1/study/brightness
home/floor1/livingroom/temperature/sensor2
在此示例中,通配符
+
被替换为study
和livingroom
。其他级别与客户端订阅的主题不匹配。客户端不接收来自这些主题的消息。多级通配符(所有子级) home/floor1/#
home/floor1/livingroom/humidity
home/floor1/livingroom/temperature
home/floor1/kitchen/temperature
在此示例中,通配符
#
被替换为livingroom/humidity
、livingroom/temperature
和kitchen/temperature
。所有其他级别都与客户端订阅的主题匹配。客户端接收来自这些主题的消息。home/floor2/livingroom/humidity
Home/floor2/kitchen/humidity
在此示例中,通配符
#
被替换为livingroom/humidity
和kitchen/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 1 - 至少一次
QoS 1 级保证消息至少传递一次。MQTT 代理至少向客户端计算机发送一次消息。MQTT 代理会存储消息,直到收到来自客户端的发布确认 (PUBACK) 数据包。如果 10 秒钟后未收到确认,代理将重新发送消息。在此级别中,同一消息可能会发送或传递多次。
QoS 2 - 仅一次
QoS 2 是 MQTT 中最高级别的服务,它保证每条消息预期的接收者只接收一次。QoS 级别会带来额外开销(四步握手),是所有服务级别中最慢的。
当客户端从代理获得 QoS 2 数据包时,它会处理该消息并用发布确认 (PUBREC) 数据包进行回复。如果代理未收到 PUBREC 数据包,它将重新发送该 PUBLISH 数据包,直到收到确认。收到 PUBREC 确认后,代理便会丢弃初始 PUBLISH 数据包。然后,代理会存储 PUBREC 数据包,并使用发布丢弃 (PUBREL) 数据包进行响应。
一旦客户端收到 PUBREL 数据包,它就可以丢弃所有存储的状态,并用发布完成 (PUBCOMP) 数据包进行响应。代理现在可以删除存储的 PUBREC 数据包,数据包标识符可供重用。