Qt MQTT 概述
Qt MQTT 可帮助您创建能够通过 MQ 遥测传输(MQTT)协议进行通信的应用程序和设备。它完全符合 MQTT 协议规范。
发布与订阅
MQTT是一种基于发布与订阅模型运行的机器间连接协议。 MQTT 客户端是指使用 MQTT 与 MQTT 服务器(也称为代理)建立网络连接的程序或设备。建立连接后,客户端即可向代理发送消息。其他客户端可以订阅该客户端发送的特定主题的通知。

例如,如果客户端 2订阅了主题 A 的消息,当客户端 1在该主题上发送消息时,它将收到通知。如果客户端 3同时订阅了主题 A和主题 B,它将收到关于这两个主题的消息通知。
Qt MQTT 是一种不包含代理的客户端解决方案。它特别适用于开发嵌入式设备的遥测应用程序。此外,Qt MQTT 没有外部依赖项,因此实现的客户端可在所有受支持的 Qt 平台上运行。
主题
主题以分层树结构存储。该标准未指定树结构的设计方式,也未提供预定义的层次集。您可以根据项目需求自由设计层次结构。以下是一个主题层次结构的示例,其中“active”表示所有活动传感器,而“house”和“garage”则是单个传感器:
sensors/active
sensors/house/temperature
sensors/house/bedroom/light
sensors/house/livingroom/light
sensors/garage/temperature
sensors/garage/light使用通配符订阅主题
客户端订阅主题时,可以使用井号(#)和加号(+)作为通配符。井号表示客户端希望接收该主题及其子主题上的所有消息通知。例如,如果客户端订阅sensors/house/#,它将接收有关house传感器的一切消息。
加号表示在查找匹配的子主题时,可以跳过树上的某个分支。例如,如果客户端订阅sensors/+/temperature,它将接收所有与温度相关的消息,无论这些消息是由哪个传感器发送的。 您可以使用多个加号来跳过多个分支。例如,订阅house/+/+/temperature即可接收某栋房屋中所有公寓内所有房间的温度相关消息。
共享订阅
共享订阅描述了一组订阅同一主题过滤器的订阅者。并非所有订阅者都会收到消息,而是仅有一位订阅者收到该消息。这使得在多个客户端之间实现负载均衡成为可能。共享订阅的格式如下:
$share/{sharename}/{topicfilter}例如,如果客户端 1和客户端 2需要共享对主题sensors/house/temperature 的订阅,则应订阅的主题过滤器为:
$share/poolAB/sensors/house/temperature服务器分发消息的顺序未作规定。这取决于具体服务器的实现。
要确定服务器是否支持共享订阅,请参阅QMqttServerConnectionProperties::sharedSubscriptionSupported()。
主题别名
将主题组织成树状结构有助于分离数据通道并提供信息的逻辑顺序。然而,这可能会导致在发布消息时使用非常长的主题名称,从而增加每条消息的大小。
MQTT 5.0 协议版本引入了主题别名来规避这一问题。发送的不再是主题字符串,而是一个整数值。为了在客户端和服务器之间建立初始映射,消息中必须同时包含主题字符串和别名。此后,仅使用该 ID 并配合空主题进行通信。
该映射关系可随时通过将主题别名与另一个主题字符串关联来更改。请注意,此映射关系并不一定适用于其他连接,例如从服务器到其他客户端的连接。每个连接都需要手动建立此映射关系。
Qt MQTT 提供了一种自动机制,有助于降低数据传输速率。QMqttClient 建立连接后,会存储服务器支持的主题别名信息。随后,主题别名将按照消息发布的顺序依次使用,直到所有可用别名均被占用。用户始终可以通过在发布时调用QMqttPublishProperties::setTopicAlias()来修改此映射。
当QMqttClient 订阅某个主题时,服务器也可根据客户端设置的QMqttConnectionProperties::maximumTopicAlias() 值使用主题别名。客户端会自动映射主题别名,并透明地将包含完整主题字符串的消息转发给用户。
安全性
客户端与消息代理之间的连接通过内置的身份验证系统进行保护,该系统使用用户名和密码。消息在传输层通过 SSL/TLS 进行加密。加密 MQTT 消息的标准端口号为 8883。
服务质量
定义了以下消息服务质量(QoS)级别:
- 至多一次(0)表示消息将根据运行环境的尽最大努力原则进行投递,因此可能会发生消息丢失。例如,该级别可用于环境传感器数据,因为单个读数丢失并不重要,因为下一个读数很快就会发布。
- 至少一次(1)意味着消息保证送达,但可能会出现重复。
- “恰好一次”(2)表示消息保证仅到达一次。例如,计费系统可采用此级别,因为消息重复或丢失可能导致计费错误。
遗嘱消息
遗嘱消息(Will Message),也称为遗嘱(testament),是由客户端发送并存储在消息代理位置的消息。如果客户端与消息代理之间的连接以意外方式中断,遗嘱消息将被转发给“遗嘱主题”(Will Topic)的任何订阅者。
遗嘱消息必须在连接阶段指定。因此,在调用QMqttClient::connectToHost()或QMqttClient::connectToHostEncrypted()之前,必须设置遗嘱消息。遗嘱消息具有常规消息的所有属性,以及遗嘱主题、QoS级别、保留标志和消息负载。
如果客户端通过调用QMqttClient::disconnectFromHost() 以常规方式与消息代理断开连接,消息代理将丢弃该 Will 消息。如有需要,客户端有责任在断开连接前发送所有必需的消息。
保留消息
保留消息存储在消息代理端。当后续客户端连接时,将收到此类消息。一个典型的用例是将发布者的当前健康状态存储在保留消息中。订阅者将立即收到有关该状态的消息。
消息代理仅能存储指定主题的最后一条保留消息。如果客户端发布了一条 QoS 级别为零的保留消息,则消息代理中该主题的任何先前保留消息都必须被丢弃。消息代理应存储最后一条消息,但也可能将其丢弃。这取决于消息代理的实现方式。
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.