El protocolo MQTT
Contingut
¿Qué es MQTT?
MQTT es una manera de comunicar dispositivos de Internet de las Cosas (IdC / IoT) entre sí. Es un protocolo ligero y muy versátil que se puede usar desde un Arduino, una Rasperry Pi, un PC multinúcleo hasta los servicios de Amazon Web Services.
Cuando se trata de comunicar dispositivos mediante TCP/IP hay un gran abanico de protocolos. La clave está en escoger el más adecuado. La comprensión del protocolo nos permite escoger el que más nos conviene. Probablemente hay más opciones para la mensajería de intermediación (brokering), pero la mayoría de dispositivos de IdC usan MQTT.
Un sistema de mensajería de intermediación (message brokering) es un protocolo de publicación / suscripción basado en el modelo hub and spoke (modelo de transporte aéreo equivalente a los radios de una rueda de bicicleta, todos los movimientos de los radios tienen relación con el centro).
Palabras clave
Palabras clave en los sistemas de mensajería de intermediación:
- Intermediario (broker)
- Cliente (client)
- Tema (topic)
- Publicación (publish)
- Suscripción (subscribe)
- Cancelación de suscripción (unsubscribe)
- Calidad del servicio (QoS)
- Actividad (ping)
- Desconexión (disconnect)
Intermediario (broker)
Acepta mensajes de los clientes y los envía a los clientes interesados. Los mensajes pertenecen a un tema (topic). A veces se los denomina servidores (servers).
Cliente (client)
Dispositivo que publica un mensaje respecto a un tema, se subscribe a un tema o ambas cosas a la vez.
Tema (topic)
Nombre (o lugar) del intermediario para un tipo de mensaje. Los clientes se subscriben y publican a un tema.
Qué son y cómo usar los Topics en MQTT correctamente de Luis Llamas
Filtros de tema (topic wildcards)
Comodines MQTT (MQTT Wildcards): Símbolos predefinidos que pueden ser usados como filtro de temas para suscribirse a múltiples temas de forma simultánea.
- Signo más (+): Un comodín de un solo nivel que coincide con cualquier nombre para un nivel de tema específico.
Cualquier tema coincide con un tema con un comodín de un solo nivel si contiene una cadena arbitraria en lugar del comodín. Por ejemplo, una suscripción a myhome/groundfloor/+/temperature puede producir los siguientes resultados:
- Almohadilla (#): Un comodín de varios niveles que coincide con todos los temas que coinciden con los niveles de tema que se especifican delante del símbolo # en el filtro de temas.
- Dólar ($): Los temas que comienzan con el símbolo $ están reservados para las estadísticas internas del broker MQTT. Los clientes no pueden publicar mensajes con estos temas. Por el momento, no existe una estandarización oficial.
Publicación (publish)
Un cliente envía un mensaje al intermediario usando el nombre de un tema.
Suscripción (subscribe)
Un cliente indica al intermediario cuales son sus temas de interés. Una vez subscrito, el intermediario envía los mensajes publicados sobre el tema de interés. Un cliente se puede subscribir a varios temas.
Cancelación de suscripción (unsubscribe)
Un cliente informa al intermediario que quiere dejar de recibir mensajes sobre un tema determinado.
Calidad del servicio (QoS)
MQTT dispone de un mecanismo de calidad del servicio o QoS, entendido como la forma de gestionar la robustez del envío de mensajes al cliente ante fallos (por ejemplo, de conectividad).
MQTT tiene tres niveles QoS posibles:
- QoS 0 unacknowledged (at most one): El mensaje se envía una única vez. En caso de fallo puede que alguno no se entregue.
- QoS 1 acknowledged (at least one): El mensaje se envía hasta que se garantiza la entrega. En caso de fallo, el suscriptor puede recibir algunos mensajes repetidos.
- QoS 2 assured (exactly one): Se garantiza que cada mensaje se entrega al suscriptor, y únicamente una vez.
Usar un nivel u otro depende de las características y necesidades de fiabilidad de nuestro sistema. Lógicamente, un nivel de QoS superior requiere un mayor intercambio mayor de mensajes de verificación con el cliente y, por tanto, mayor carga al sistema.
Fuente: Páqina web de Luis Llamas
Actividad (ping)
Para asegurar que la conexión está activa, los clientes mandan periódicamente un mensaje PINGREQ que es respondido por el servidor con un PINGRESP.
Desconexión (disconnect)
El cliente se desconecta enviando un mensaje de DISCONNECT.
Analogía con el servicio postal
Una oficina de correos envía y recibe cartas. Los clientes pueden enviar una carta, recibirla o ambas cosas a la vez. Para enviar una carta solo hay que poner un mensaje dentro del sobre, escribir una dirección y enviarla al servicio postal. Cuando el servicio postal recibe la carta, lo encamina al receptor previsto.
Esto significa que un cliente puede enviar o recibir cartas. La clave de todo es que las cartas pasan por la oficina de correos y la oficina de correos tiene que conocer información de sus
clientes. El servicio postal es un ejemplo de sistema de mensajería por intermediación basada en un modelo hub and spoke.
En el MQTT hay un intermediario y hay clientes. En el símil, el intermediario es la oficina de correos, y en términos informáticos el servidor. Los clientes pueden publicar mensajes o
enviar cartas a la oficina de correos. Otros clientes pueden subscribirse a los temas, o recibir las cartas, desde la oficina de correos. Los clientes pueden publicar y subscribirse.
En el MQTT hay un intermediario que comunica con los clientes. Hay temas que pueden tener subtemas. Cuando los dispositivos se conectan pueden publicar información sobre temas o subtemas y también se pueden subscribir para recibir información.
Fuente: Página baldengineer.com
MQTT vs HTTP (o REST)
HTTP tiene un montón de cabeceras. Una implementación de mensajería intermediaria puede ser pequeña. Por ejemplo, un paquete MQTT puede tener tan solo 2 bytes.
HTTP requiere de múltiples acciones POST para distribuir un mensaje a mas de un cliente. El objetivo del sistema de mensajería intermediaria es que el intermediario distribuya el mensaje, tan solo a los clientes interesados. La funcionalidad del MQTT es enviar de uno a muchos.
Ejemplo de arquitectura publicación / subscripción MQTT
Estructura de un mensaje MQTT
Uno de los componentes más importantes del protocolo MQTT es la definición y tipología de los mensajes, ya que son una de las bases de la agilidad en la que radica su fortaleza. Cada mensaje consta de 3 partes:
- Cabecera fija. Ocupa 2 a 5 bytes, obligatorio. Consta de un código de control, que identifica el tipo de mensaje enviado, y de la longitud del mensaje. La longitud se codifica en 1 a 4 bytes, de los cuales se emplean los 7 primeros bits, y el último es un bit de continuidad.
- Cabecera variable. Opcional, contiene información adicional que es necesaria en ciertos mensajes o situaciones.
- Contenido(payload). Es el contenido real del mensaje. Puede tener un máximo de 256 Mb aunque en implementaciones reales el máximo es de 2 a 4 kB.
Los tipos de mensajes y códigos de control que se envían en el protocolo MQTT son los siguientes:
Mensaje | Código |
---|---|
CONNECT | 0x10 |
CONNACK | 0x20 |
PUBLISH | 0x30 |
PUBACK | 0x40 |
PUBREC | 0x50 |
PUBREL | 0x60 |
PUBCOMP | 0x70 |
SUBSCRIBE | 0x80 |
SUBACK | 0x90 |
UNSUBSCRIBE | 0xA0 |
UNSUBACK | 0xB0 |
PINGREQ | 0xC0 |
PINGRESP | 0xD0 |
DISCONNECT | 0xE0 |
Fuente: Páqina web de Luis Llamas
Ejemplos en línea de uso de MQTT
- Snap! y Qt/QML sobre WebAssembly
ESP32 en Snap! v8 interaccionando con un ejemplo Qt/QML con WebAssembly (Código fuente del ejemplo usando Qt/QML sobre WebAssembly)
- Wokwi y Qt/QML sobre WebAssembly
ESP32 programado en MicroPython usando MQTT interaccionando con un ejemplo Qt/QML sobre WebAssembly
Referencias
Protocolos de comunicación para IoT
MQTT: The Standard for IoT Messaging
Introducció a MQTT (en catalán)
MQTT Essentials (de HiveMQ)