Main Content

Publicar mensajes MQTT y suscribirse a temas de mensajes

Message Queuing Telemetry Transport (MQTT) es una arquitectura de publicación/suscripción desarrollada principalmente para conectar dispositivos con ancho de banda y energía limitada a través de redes inalámbricas. Es un protocolo simple y ligero que se ejecuta sobre sockets TCP/IP, WebSockets y SSL (capa de sockets seguros).

MQTT tiene dos componentes:

  • Broker MQTT: el agente MQTT es el punto central de comunicación. El agente se encarga de distribuir todos los mensajes entre los clientes.

  • Cliente MQTT: el cliente MQTT puede ser cualquier dispositivo (por ejemplo, un ordenador o un teléfono móvil) que se conecta a un agente. Un cliente que envía mensajes es un editor. Un cliente que recibe mensajes es un suscriptor. Para recibir un mensaje, el cliente debe suscribirse al tema de ese mensaje.

MQTT architecture

Temas en MQTT

Un tema es un identificador (ID) utilizado por el agente MQTT para identificar a los clientes legítimos para la entrega de mensajes. Cada cliente que desea enviar mensajes los publica en un tema determinado, y cada cliente que desea recibir mensajes se suscribe a un tema determinado.

Un tema constituye una cadena y puede consistir en uno o más niveles temáticos. Cada nivel está separado por una barra (/), por ejemplo, home/livingroom/temperature.

Los temas:

  • Deben tener al menos un carácter.

  • Distinguen entre mayúsculas y minúsculas. Por ejemplo, home/room/temperature y home/Room/temperature son dos temas diferentes.

Caracteres comodín en temas de MQTT

Los caracteres comodín son los caracteres especiales de un tema que los clientes utilizan para suscribirse a varios temas. MQTT admite caracteres comodín de un nivel y de varios niveles.

  • Carácter comodín de un nivel: Un carácter comodín de un nivel se representa con un signo más (+). Para que un cliente pueda recibir mensajes, todos los niveles del tema al que se ha suscrito, excepto el nivel que contiene el signo +, deben coincidir con el tema del mensaje entrante. Puede incluir más de un carácter comodín de un nivel en una cadena temática.

  • Carácter comodín de varios niveles: Un carácter comodín de varios niveles se representa con una almohadilla (#). El cliente recibe un mensaje de todos los subniveles del tema al que se ha suscrito. Solo puede incluir un carácter comodín de varios niveles, y este se debe colocar al final de una cadena temática.

    Carácter comodín en un temaTema al que se ha suscrito el clienteCoincidenciasNo coincide
    Carácter comodín de un nivelhome/floor1/+/temperature
    • home/floor1/livingroom/temperature

    • home/floor1/kitchen/temperature

    En este ejemplo, el carácter comodín + ha sido reemplazado por livingroom y kitchen. El resto de los niveles coinciden con el tema al que se ha suscrito el cliente. El cliente recibe mensajes de esos temas.

    • home/floor1/study/brightness

    • home/floor1/livingroom/temperature/sensor2

    En este ejemplo, el carácter comodín + ha sido reemplazado por study y livingroom. El resto de los niveles no coinciden con el tema al que se ha suscrito el cliente. El cliente no recibe mensajes de esos temas.

    Carácter comodín de varios niveles (todos los subniveles)home/floor1/#
    • home/floor1/livingroom/humidity

    • home/floor1/livingroom/temperature

    • home/floor1/kitchen/temperature

    En este ejemplo, el carácter comodín # ha sido reemplazado por livingroom/humidity, livingroom/temperature y kitchen/temperature. El resto de los niveles coinciden con el tema al que se ha suscrito el cliente. El cliente recibe mensajes de esos temas.

    • home/floor2/livingroom/humidity

    • Home/floor2/kitchen/humidity

    En este ejemplo, el carácter comodín # ha sido reemplazado por livingroom/humidity y kitchen/humidity. El resto de los niveles no coinciden con el tema al que se ha suscrito el cliente. El cliente no recibe mensajes de esos temas.

Niveles de la calidad del servicio (QoS) en MQTT

La calidad del servicio (QoS) define la fiabilidad del proceso de entrega de mensajes en MQTT. MQTT proporciona tres niveles de QoS para la entrega de mensajes: QoS 0, QoS 1 y QoS 2. Puede disponer de diferentes niveles de QoS para publicar y suscribirse a mensajes. Es posible que el agente MQTT que está utilizando no admita los tres niveles de QoS. Por ejemplo, el MQTT ThingSpeak™ solo admite QoS 0.

QoS 0: como máximo una vez

El nivel 0 de QoS, a menudo denominado "disparar y olvidar", es una entrega sin garantías. No existe garantía de entrega. El cliente no genera acuse de recibo del mensaje. El agente MQTT no reintenta enviar ni elimina el mensaje localmente.

MQTT QoS Level 0

QoS 1: como mínimo una vez

El nivel 1 de QoS garantiza que un mensaje se ha entregado como mínimo una vez. El agente MQTT envía el mensaje al cliente como mínimo una vez. El agente MQTT almacena el mensaje hasta que recibe un paquete de acuse de recibo (PUBACK) del cliente. Si no se recibe un acuse de recibo tras 10 segundos, el agente vuelve a enviar el mensaje. En este nivel, es posible que el mismo mensaje se envíe o se entregue repetidas veces.

MQTT QoS Level 1

QoS 2: exactamente una vez

QoS 2 es el nivel de servicio más alto en MQTT y garantiza que los destinatarios previstos reciban cada mensaje solamente una vez. El nivel de QoS implica una sobrecarga adicional (negociación en cuatro pasos) y es el nivel de servicio más lento de todos.

Cuando un cliente obtiene un paquete de QoS 2 del agente, procesa el mensaje y contesta con un paquete de acuse de recibo (PUBREC). Si el agente no recibe un paquete PUBREC, vuelve a enviar el paquete PUBLISH hasta que recibe un acuse. Con el acuse PUBREC, el agente descarta el paquete PUBLISH inicial. A continuación, el agente almacena el paquete PUBREC y responde con un paquete de publicación descartada (PUBREL).

Una vez que el cliente obtiene el paquete PUBREL, puede descartar todos los estados almacenados y responder con un paquete de publicación completada (PUBCOMP). En ese momento, el agente puede eliminar el paquete PUBREC almacenado y el identificador del paquete estará disponible para su reutilización.

MQTT QoS Level 2