Qt MQTT 概览

Qt MQTT 允许你创建能在 MQ 约束传输 (MQTT) 协议上通信的应用程序和设备。它与 MQTT 协议规范完全兼容。

发布和订阅

MQTT 是一种机器对机器的连接协议,它 operates on the publish-and-subscribe 模型。MQTT 客户端是一个程序或设备,该程序或设备使用 MQTT 创建与 MQTT 服务器(也称为 代理)的网络连接。一旦建立了连接,客户端就可以向代理发送消息。其他客户端可以订阅客户端发送的特定主题的通告。

例如,如果 Client 2 订阅了 Topic A 上的消息,则当 Client 1 在该主题上发送消息时,它接收通知。如果 Client 3 订阅了 Topic ATopic B,它将接收到这两个主题的消息通知。

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

主题

主题存储在分层树状结构中。标准没有指定树应该如何设计,也不会提供预定义的层次集。你可以根据项目需求自由设计层次结构。以下是一个主题层次结构的示例,其中 active 表示所有活动传感器,而 housegarage 是单个传感器。

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)表示保证消息恰好到达一次。此级别可以用于例如计费系统,其中重复或丢失的消息可能导致不当计费。

保留消息

保留消息,也称为遗嘱,是客户端发送并存储在代理位置的消息。如果客户端与代理之间的连接以意外方式中断,保留消息将被转发到保留主题的任何订阅者。

遗嘱消息必须在连接阶段指定。因此,在调用QMqttClient::connectToHost() 或 QMqttClient::connectToHostEncrypted()之前必须设置它们。遗嘱消息具有常规消息的所有属性,包括遗嘱主题、QoS 级别、保留标志和消息载荷。

如果客户端通过调用QMqttClient::disconnectFromHost() 以常规方式从代理断开连接,代理将丢弃遗嘱消息。如果需要,客户端负责在断开连接前发送所有必要的消息。

保留消息

保留消息存储在代理端。随着未来客户端的连接,它们将接收此类消息。一个典型的用例是将发布者的当前健康状况存储在保留消息中。订阅者将立即收到有关状态的消息。

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

© 2024 The Qt Company Ltd. 本文档中包含的文档贡献是其各自所有者的版权。本文档按自由软件基金会发布的GNU 自由文档许可协议版本 1.3的条款许可。Qt和相关标志是芬兰的 The Qt Company Ltd. 和/或其他国家的商标。所有其他商标均为各自所有者的财产。