简介
MQTT是什么?
MQTT(Message Queuing Telemetry Transport)是一种基于发布-订阅(Publish-Subscribe)模式的轻量级通讯协议,采用客户端-代理(Client-Broker)模型进行通信,基于TCP协议,属于应用层协议。
它最初由 IBM 在 1999 年开发,目前已成为物联网(IoT)领域中最流行的通讯协议之一。
MQTT 的发布-订阅机制可以很轻易地满足我们一对一、一对多、多对一的通信需要。
发布-订阅模式是什么?
在 MQTT 中,发布-订阅模式是指消息的发布者/发送者(Publisher)和订阅者/接收者(Subscriber)之间的通讯方式。
发布-订阅模式与客户端-服务器模式的不同之处在于:发布者和订阅者之间无需建立直接连接,而是通过 MQTT 代理(Broker) 来负责消息的路由和分发。
下图展示了 MQTT 发布-订阅过程。温度传感器作为客户端连接到 MQTT Broker,并通过发布操作将温度数据发布到一个特定主题(例如 Temperature
)。MQTT Broker 接收到该消息后会负责将其转发给订阅了相应主题(Temperature
)的订阅者客户端。
客户端-代理模型是什么?
客户端-代理模型指的是 MQTT 客户端(包括发布者和订阅者)与 MQTT 代理(Broker)之间的通讯模式。具体来说:
- 客户端可以是发布者,也可以是订阅者,也可以同时具备这两个身份
- 代理类似于服务器,负责接收发布者发布到特定主题的消息并转发给相应的订阅者
主题是什么?
主题(Topic)是消息的分类或者话题,用唯一标识字符串来标识消息的内容或者类型。MQTT 协议根据主题来转发消息。
主题可以是层次结构的,使用正斜杠(/
)进行分隔,类似于 URL 路径。例如weather/temperature
是一个层次结构的主题,表示天气的温度信息。
MQTT 主题支持以下两种通配符:+
和 #
。
+
:表示单层通配符,例如a/+
匹配a/x
或a/y
。#
:表示多层通配符,例如a/#
匹配a/x
、a/b/c/d
。
注意:通配符主题只能用于订阅,不能用于发布。
一个主题可以有多个订阅者,代理会将该主题下的消息转发给所有订阅者;一个主题也可以有多个发布者,代理将按照消息到达的顺序转发。
例如客户端A发布了一条消息 XXX 到特定的主题(Topic),而客户端B和客户端C订阅了这个主题。当客户端A发布消息到该主题时,客户端B和客户端C都会接收到这条消息。这样,客户端A作为发布者,而客户端B和客户端C作为订阅者,他们通过订阅相同的主题来实现消息的传递和接收。
以$SYS/
开头的主题为系统主题,系统主题主要用于获取 MQTT 服务器自身运行状态、消息统计、客户端上下线事件等数据。目前,MQTT 协议暂未明确规定$SYS/
主题标准,但大多数 MQTT 服务器都遵循该标准建议。
例如,EMQX 服务器支持通过以下主题获取集群状态。
更多内容请参考:通过案例理解 MQTT 主题与通配符
QoS是什么?
MQTT定义了服务质量QoS(Quality of Service,)用于控制消息在不同网络环境下保证消息的可靠性。QoS 级别有三种:
- 0:最低级别的 QoS,表示“最多传递一次”。消息发布者发布消息后,不会收到任何确认,也不保证消息会被准确地传递给订阅者。消息可能会丢失或者重复传递。消息最多传送一次。如果当前客户端不可用,它将丢失这条消息。
- 1:中等级别的 QoS,表示“至少传递一次”。消息发布者发布消息后,会收到一个确认(PUBACK),但不保证消息只传递一次。消息可能会重复传递,但不会丢失。
- 2:最高级别的 QoS,表示“只传递一次”。消息发布者发布消息后,会进行消息传递的完全确认,确保消息只传递一次给订阅者。这种级别的 QoS 保证了消息的完整性和精确性,但需要更多的网络带宽和资源。
MQTT协议的优缺点
优点 | 缺点 |
---|---|
轻量级:协议简单、开销小,适合在资源受限的设备上使用。 | 消息传递不可靠:QoS 0 级别的消息可能会丢失,不适用于要求严格的消息传递可靠性的场景。 |
易于实现:提供了多种编程语言的客户端库,方便开发者进行应用程序开发。 | 不适用于大规模消息传输:在大量消息传输的场景下,可能会导致代理性能问题。 |
异步通讯:支持发布者和订阅者之间的异步通讯,提高了系统的灵活性和响应速度。 | 安全性限制:默认情况下,MQTT 不提供消息加密和身份验证,需要额外的安全措施来保护通讯安全。 |
与HTTP相比
- HTTP 报文相较与 MQTT 需要占用更多的网络开销
- HTTP 是一种无状态协议,服务器在处理请求时不会记录客户端的状态,也无法实现从连接异常断开中恢复
- 请求-响应模式需要通过轮询才能获取数据更新,而 MQTT 通过订阅即可获取实时数据更新
- MQTT 5.0 增加了请求-响应特性,以实现订阅者收到消息后向某个主题发送应答,发布者收到应答后再进行后续操作
与消息队列相比
- MQTT 主题不需要提前创建。MQTT 客户端在订阅或发布时即自动的创建了主题,开发者无需再关心主题的创建,并且也不需要手动删除主题
使用场景
- 物联网(IoT)应用程序中的设备通讯和数据传输。如手机控