En esta página

Qt MQTT Visión general

Qt MQTT le permite crear aplicaciones y dispositivos que pueden comunicarse a través del protocolo de transporte de telemetría MQTT (MQTT). Cumple totalmente con la especificación del protocolo MQTT.

Publicar y suscribirse

MQTT es un protocolo de conectividad de máquina a máquina que funciona según el modelo de publicación y suscripción. Un cliente MQTT es un programa o dispositivo que utiliza MQTT para crear una conexión de red con un servidor MQTT, también llamado broker. Una vez creada la conexión, el cliente puede enviar mensajes al broker. Los demás clientes pueden suscribirse a notificaciones sobre temas concretos enviadas por el cliente.

Broker que distribuye mensajes del Cliente 1 al Cliente 2 (Tema A) y al Cliente 3 (Temas A y B)

Por ejemplo, si el cliente 2 se suscribe a mensajes sobre el tema A, recibirá una notificación cuando el cliente 1 envíe un mensaje sobre ese tema. Si el cliente 3 está suscrito a los temas A y B, recibirá notificaciones sobre los mensajes de ambos temas.

Qt MQTT es una solución cliente que no incluye un broker. Es especialmente adecuada para desarrollar aplicaciones de telemetría para dispositivos integrados. Sin embargo, Qt MQTT no tiene dependencias externas, por lo que los clientes implementados pueden ejecutarse en todas las plataformas Qt compatibles.

Temas

Los temas se almacenan en una estructura de árbol jerárquica. El estándar no especifica cómo debe diseñarse el árbol, ni proporciona conjuntos de jerarquías predefinidas. Puedes diseñar libremente la jerarquía según lo requiera tu proyecto. El siguiente es un ejemplo de una jerarquía de temas, donde activo significa todos los sensores activos, mientras que casa y garaje son sensores individuales:

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

Suscripción a Temas Usando Comodines

Cuando los clientes se suscriben a temas, pueden utilizar el signo de almohadilla (#) y el signo más (+) como comodines. La almohadilla indica que el cliente desea recibir notificaciones sobre todos los mensajes de un tema y sus subtemas. Por ejemplo, si un cliente se suscribe a sensores/casa/#, recibirá todos los mensajes sobre el sensor de la casa.

El signo más indica que una rama del árbol puede omitirse al buscar un subtema coincidente. Por ejemplo, si un cliente se suscribe a sensors/+/temperature, recibe mensajes sobre la temperatura sin importar qué sensor los envió. Puede utilizar varios signos más para omitir varias ramas. Por ejemplo, casa/+/+/temperatura podría utilizarse para recibir mensajes sobre la temperatura de todas las habitaciones de todos los apartamentos de una casa.

Suscripciones compartidas

Las suscripcionescompartidas describen un conjunto de suscriptores a un filtro de temas. En lugar de que todos los suscriptores reciban un mensaje, sólo lo recibe un suscriptor. Esto permite equilibrar la carga en varios clientes. El formato de una suscripción compartida es

$share/{sharename}/{topicfilter}

Por ejemplo, si el Cliente 1 y el Cliente 2 deben compartir una suscripción al tema sensores/casa/temperatura, el filtro de temas al que suscribirse es:

$share/poolAB/sensors/house/temperature

No está definido en qué orden distribuye los mensajes el servidor. Se trata de una opción específica del servidor.

Para identificar si un servidor admite suscripciones compartidas, consulte también QMqttServerConnectionProperties::sharedSubscriptionSupported().

Alias de temas

Estructurar los temas en un árbol ayuda a separar los canales de datos y a proporcionar un orden lógico de la información. Sin embargo, esto puede dar lugar a que se utilicen nombres de temas muy largos durante la publicación de mensajes, aumentando así el tamaño de cada mensaje.

La versión 5.0 del protocolo MQTT introdujo alias de temas para evitarlo. En lugar de la cadena del tema, se envía un valor entero. Para crear una correspondencia inicial entre el cliente y el servidor, tanto la cadena del tema como el alias deben formar parte de un mensaje. A partir de entonces, sólo se utiliza el ID con un tema vacío.

Esta asignación puede modificarse en cualquier momento utilizando un alias de tema con otra cadena de tema. Tenga en cuenta que esta asignación no se aplica necesariamente a otras conexiones, como las conexiones del servidor a otros clientes. Cada conexión debe crear esta asignación manualmente.

Qt MQTT proporciona un mecanismo automatizado para ayudar a reducir la velocidad de transmisión de datos. Después de que QMqttClient cree una conexión, se almacena la información sobre los alias de temas soportados por el servidor. Posteriormente, los alias de temas se utilizan en el orden en que se publican los mensajes, hasta que se utilizan todos los alias disponibles. Un usuario siempre puede modificar esta asignación utilizando QMqttPublishProperties::setTopicAlias() durante la publicación.

Cuando QMqttClient se suscribe a un tema, el servidor también puede utilizar alias de temas, dependiendo del valor de QMqttConnectionProperties::maximumTopicAlias() establecido por el cliente. El cliente asigna automáticamente los alias de tema y reenvía de forma transparente los mensajes al usuario incluyendo la cadena de tema completa.

Seguridad

Las conexiones entre los clientes y el broker están protegidas por un sistema de autenticación integrado que utiliza nombres de usuario y contraseñas. Los mensajes se cifran mediante SSL/TLS en la capa de transporte. El número de puerto estandarizado para los mensajes MQTT cifrados es 8883.

Calidad de servicio

Se definen los siguientes niveles de calidad de servicio (QoS) para los mensajes:

  • Como máximo una vez (0) significa que los mensajes se entregan según los mejores esfuerzos del entorno operativo y, por lo tanto, puede producirse la pérdida de mensajes. Este nivel podría utilizarse, por ejemplo, con datos de sensores ambientales en los que no importa si se pierde una lectura individual, ya que la siguiente se publicará poco después.
  • Al menos una vez (1) significa que la llegada de los mensajes está asegurada, pero pueden producirse duplicados.
  • Exactamente una vez (2) significa que los mensajes llegan exactamente una vez. Este nivel podría utilizarse, por ejemplo, con sistemas de facturación en los que los mensajes duplicados o perdidos podrían dar lugar a la aplicación de cargos incorrectos.

Mensajes de testamento

Un Mensaje Testamento, también llamado testamento, es un mensaje enviado desde un cliente y almacenado en la ubicación del broker. Si la conexión entre el cliente y el intermediario se interrumpe de forma inesperada, el mensaje de testamento se reenviará a cualquier suscriptor del tema de testamento.

Los mensajes de testamento deben especificarse en la fase de conexión. Por lo tanto, es obligatorio establecerlos antes de invocar QMqttClient::connectToHost() o QMqttClient::connectToHostEncrypted(). Un Will Message tiene todas las propiedades de un mensaje normal, así como un Will Topic, un nivel de QoS, una bandera retenida y la carga útil del mensaje.

Si el cliente se desconecta del intermediario de forma normal llamando a QMqttClient::disconnectFromHost(), el intermediario descartará el mensaje de testamento. Si es necesario, el cliente es responsable de enviar todos los mensajes necesarios antes de desconectarse.

Mensajes retenidos

Los mensajes retenidos se almacenan en el broker. Cuando futuros clientes se conecten, recibirán dichos mensajes. Un caso de uso típico es almacenar el estado de salud actual del editor en un mensaje retenido. Los suscriptores recibirán al instante un mensaje sobre el estado.

Un broker sólo puede almacenar el último mensaje retenido enviado para un tema específico. Si un cliente publica un mensaje retenido con el nivel cero de QoS, cualquier mensaje retenido previamente para su tema en el broker debe ser descartado. El broker debe almacenar el último mensaje, pero también puede descartarlo. Esto depende de la implementación del broker.

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