Qt MQTT 概述

Qt MQTT MQTT 可让您创建可通过 MQ 遥测传输(MQTT)协议进行通信的应用程序和设备。它完全符合 MQTT 协议规范。

发布和订阅

MQTT是一种以发布和订阅模式运行的机器对机器连接协议。MQTT 客户端是使用 MQTT 与 MQTT 服务器(也称为代理)建立网络连接的程序或设备。创建连接后,客户端就可以向代理发送信息。其他客户端可以订阅客户端发送的特定主题通知。

例如,如果客户机 2订阅了主题 A 的消息,那么当客户机 1就该主题发送消息时,它就会收到通知。如果客户机 3订阅了主题 A主题 B,它就会收到关于这两个主题的消息的通知。

Qt MQTT 是一种不包括代理的客户端解决方案。它特别适用于开发嵌入式设备的遥测应用程序。不过, 没有外部依赖性,因此实现的客户端可在所有支持的 Qt XML 平台上运行。Qt MQTT

主题

主题以分层树形结构存储。该标准没有规定如何设计树形结构,也没有提供预定义的层次结构集。您可以根据项目需要自由设计层次结构。下面是一个主题层次结构示例,其中active表示所有活动传感器,而housegarage则表示单个传感器:

sensors/active
sensors/house/temperature
sensors/house/bedroom/light
sensors/house/livingroom/light
sensors/garage/temperature
sensors/garage/light

使用通配符订阅主题

客户端订阅主题时,可以使用散列标记 (#) 和加号 (+) 作为通配符。哈希标记表示客户端希望接收主题及其子主题的所有消息通知。例如,如果客户端订阅了sensors/house/#,则会收到有关房屋传感器的所有消息。

加号表示在寻找匹配的子主题时,可以跳过树上的某个分支。例如,如果客户端订阅了sensors/+/temperature(传感器/+/温度),那么无论哪个传感器发送了有关温度的信息,客户端都会收到。您可以使用多个加号跳过多个分支。例如,house/+/+/temperature可用于接收一栋房子中所有公寓所有房间的温度信息。

共享订阅

共享订阅描述的是一个主题过滤器的订阅者池。不是所有订阅者都接收消息,而是只有一个订阅者接收消息。这样就能在多个客户端上实现负载平衡。共享订阅的格式为

$share/{sharename}/{topicfilter}

例如,如果客户机 1客户机 2应共享对主题传感器/房屋/温度的订阅,则应订阅的主题过滤器为:

$share/poolAB/sensors/house/temperature

服务器没有规定消息分发的顺序。这是一个服务器特定选项。

要确定服务器是否支持共享订阅,另请参阅QMqttServerConnectionProperties::sharedSubscriptionSupported() 。

主题别名

以树形结构组织主题有助于分离数据通道并提供信息的逻辑顺序。不过,这可能会导致在发布信息时使用很长的主题名称,从而增加每条信息的大小。

MQTT 5.0 协议版本引入了主题别名来避免这种情况。发送的不是主题字符串,而是一个整数值。要在客户端和服务器之间创建初始映射,主题字符串和别名都需要成为消息的一部分。此后,只使用空主题的 ID。

这种映射可随时通过使用带有另一个主题字符串的主题别名进行更改。请注意,此映射不一定适用于其他连接,如服务器到其他客户端的连接。每个连接都需要手动创建此映射。

Qt MQTT 在此基础上,web 服务器提供了一种自动机制来帮助降低数据传输速率。 创建连接后,会存储服务器支持的主题别名信息。随后,主题别名将按照消息发布的顺序使用,直到所有可用的别名都被使用为止。在发布过程中,用户始终可以使用 () 修改该映射。QMqttClient QMqttPublishProperties::setTopicAlias

QMqttClient 订阅主题时,服务器也可以使用主题别名,这取决于客户端设置的QMqttConnectionProperties::maximumTopicAlias() 值。客户端会自动映射主题别名,并以透明方式向用户转发包含完整主题字符串的信息。

安全性

客户端与代理之间的连接通过使用用户名和密码的内置验证系统来确保安全。信息在传输层使用 SSL/TLS 进行加密。加密 MQTT 信息的标准端口号是 8883。

服务质量

为报文定义了以下服务质量(QoS)级别:

  • 最多一次 (0)表示根据运行环境的最大努力传送报文,因此可能会发生报文丢失。这一级别可用于环境传感器数据等,在这种情况下,单个读数丢失并不重要,因为下一个读数很快就会发布。
  • 至少一次 (1)表示信息一定会到达,但可能会出现重复。
  • 精确一次 (2)表示确保信息精确到达一次。这一级别可用于计费系统等,因为重复或丢失的信息可能导致错误收费。

遗嘱信息

遗愿 信息也称遗嘱,是由客户发送并存储在代理位置的信息。如果客户和代理之间的连接意外中断,遗嘱信息将转发给遗嘱主题的任何用户。

意志消息必须在连接阶段指定。因此,必须在调用QMqttClient::connectToHost() 或QMqttClient::connectToHostEncrypted() 之前设置它们。意愿消息具有普通消息的所有属性,以及意愿主题、QoS 级别、保留标志和消息有效载荷。

如果客户机通过调用QMqttClient::disconnectFromHost() 以常规方式断开与代理的连接,代理就会丢弃意愿消息。如果需要,客户机有责任在断开连接前发送所有必要的消息。

保留消息

保留消息存储在代理端。当以后的客户机连接时,它们将收到这些消息。一个典型的用例是在保留消息中存储发布者的当前健康状况。订阅者将立即收到有关该状态的消息。

代理只能存储为指定主题发送的最后一条保留消息。如果客户端发布的保留信息的 QoS 级别为零,则必须丢弃该主题在代理处的任何先前保留的信息。中介存储最后一条信息,但也可能丢弃它。这取决于中介的实现。

© 2025 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.