MQTT 简介
消息队列遥测传输 (MQTT) 是一种简单、开放、轻量级的发布-订阅消息传输协议。MQTT 旨在支持与远程设备之间的消息传递,涉及小占用空间、低功耗、低带宽和协商的交付保证。它非常适合在资源受限的环境中使用,例如机器对机器 (M2M) 和物联网 (IOT),其中网络带宽和功率非常宝贵。它是一个简单的轻量级协议,在 TCP/IP 套接字、WebSocket 和(安全套接字层)SSL 上运行。
MQTT 有两个组件:
MQTT 代理:MQTT 代理是通信的中心点。代理负责接收所有消息、过滤消息、确定订阅每条消息的客户端,并将消息调度给订阅的客户端。
MQTT 客户端:MQTT 客户端是通过网络连接到 MQTT 代理并与之通信的任何设备(例如计算机或手机)。发送消息的客户端是发布者。接收消息的客户端是订阅者。要接收消息,客户端必须订阅该消息的主题。
您可以使用 MQTT Publish 和 MQTT Subscribe 模块发布和订阅 MQTT 消息。这些模块仅通过 TCP/IP 套接字支持 MQTT 协议。

MQTT 中的主题
主题是 MQTT 代理使用的标识符 (ID),用于标识传递消息的合法客户端。每个要发送消息的客户端都会将消息发布到特定的主题上,每个要接收消息的客户端都会订阅某个主题。
主题是字符串,可以由一个或多个主题级别组成。每个级别由正斜杠 (/) 分隔。例如,home/livingroom/temperature 或 8040ed-7865-459f-b98c-7d78/status。
主题:
必须包含至少一个字符。
区分大小写。例如,
home/room/temperature和home/Room/temperature是两个不同的主题。
MQTT 主题中的通配符
通配符是主题中的特殊字符,由客户端用于订阅多个主题。MQTT 支持单级和多级通配符。
单级通配符:单级通配符使用加号 (
+) 表示。对于接收消息的客户端,除了具有+号的级别之外,订阅主题的所有级别都必须与传入消息的主题匹配。一个主题字符串中可以包含多个单级通配符。多级通配符:多级通配符使用数字符号 (
#) 表示。客户端从订阅主题的所有子级别接收消息。您只能包含一个多级通配符,并且它必须位于主题字符串的末尾。注意
以
$符号开头的主题保留给 MQTT 代理的内部统计量。使用#订阅多级主题时,这些主题不属于订阅的一部分。客户端无法发布到这些主题。
| 主题中的通配符 | 客户端订阅的主题 | 匹配 | 不匹配 |
|---|---|---|---|
| 单级通配符 | home/floor1/+/temperature |
在此示例中,通配符 |
在此示例中,通配符 |
| 多级通配符(所有子级) | home/floor1/# |
在此示例中,通配符 |
在此示例中,通配符 |
MQTT 中 QoS 的级别
服务质量 (QoS) 定义 MQTT 中消息传递过程的可靠性。MQTT 为消息传递提供三个 QoS 级别:QoS 0、QoS 1 和 QoS 2。发布和订阅消息可以使用不同的 QoS 级别。您使用的 MQTT 代理可能并非所有三个 QoS 级别都支持。例如,ThingSpeak™ MQTT 仅支持 QoS 0。
QoS 0 - 最多一次
QoS 0 级通常称为“即发即弃”,是一种“尽力而为”的传递方式。无法保证传递。接收方不会确认收到消息。发送方不会重试,并会在本地删除消息。

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

QoS 2 - 仅一次
QoS 2 是 MQTT 中最高级别的服务,它保证每条消息预期的接收者只接收一次。QoS 级别会带来额外开销(四步握手),是所有服务级别中最慢的。
当接收方从发送方获得 QoS 2 数据包时,它会处理该消息并用发布确认 (PUBREC) 数据包进行回复。如果发送方未收到 PUBREC 数据包,它将重新发送该 PUBLISH 数据包,直到收到确认。收到 PUBREC 确认后,发送方便会丢弃初始 PUBLISH 数据包。然后,发送方会存储 PUBREC 数据包,并使用发布丢弃 (PUBREL) 数据包进行响应。
一旦接收方收到 PUBREL 数据包,它就可以丢弃所有存储的状态,并用发布完成 (PUBCOMP) 数据包进行响应。发送方现在可以删除存储的 PUBREC 数据包,数据包标识符可供重用。
