MQTT
MQTT (originalmente una sigla de MQ Telemetry Transport) es un protocolo de red ligero, de publicación y suscripción, de máquina a máquina. Está diseñado para conexiones con ubicaciones remotas que tienen dispositivos con restricciones de recursos o ancho de banda de red limitado. Debe ejecutarse sobre un protocolo de transporte que proporcione conexiones bidireccionales ordenadas y sin pérdidas, por lo general, TCP/IP. Es un estándar OASIS abierto y una recomendación ISO (ISO/IEC 20922).
Historia
Andy Stanford-Clark (IBM) y Arlen Nipper (que entonces trabajaba para Eurotech, Inc.) crearon la primera versión del protocolo en 1999. Se utilizó para monitorear oleoductos dentro del sistema de control industrial SCADA. El objetivo era tener un protocolo que fuera eficiente en ancho de banda, liviano y que usara poca batería, porque los dispositivos se conectaban a través de un enlace satelital que, en ese momento, era extremadamente costoso.
Históricamente, el "MQ" en "MQTT" provino de la línea de productos IBM MQ (entonces 'MQSeries'), donde significa "Message Queue". Sin embargo, el protocolo proporciona mensajes de publicación y suscripción (sin colas, a pesar del nombre). En la especificación abierta por IBM como versión 3.1, el protocolo se denominó "MQ Telemetry Transport". Las versiones posteriores publicadas por OASIS se refieren estrictamente al protocolo simplemente como "MQTT", aunque el comité técnico en sí se denomina "Comité técnico de transporte de telemetría de cola de mensajes de OASIS". Desde 2013, "MQTT" no significa nada.
En 2013, IBM presentó MQTT v3.1 al cuerpo de especificaciones de OASIS con un estatuto que garantizaba que solo se aceptarían cambios menores en la especificación. Después de hacerse cargo del mantenimiento del estándar de IBM, OASIS lanzó la versión 3.1.1 el 29 de octubre de 2014. El 7 de marzo de 2019 se lanzó una actualización más sustancial a la versión 5 de MQTT, que agregó varias características nuevas.
MQTT-SN (MQTT para redes de sensores) es una variación del protocolo principal destinado a dispositivos integrados alimentados por batería en redes que no son TCP/IP, como Zigbee.
Visión general
El protocolo MQTT define dos tipos de entidades de red: un intermediario de mensajes y varios clientes. Un intermediario MQTT es un servidor que recibe todos los mensajes de los clientes y luego los enruta a los clientes de destino apropiados. Un cliente MQTT es cualquier dispositivo (desde un microcontrolador hasta un servidor completo) que ejecuta una biblioteca MQTT y se conecta a un agente MQTT a través de una red.
La información se organiza en una jerarquía de temas. Cuando un editor tiene un nuevo elemento de datos para distribuir, envía un mensaje de control con los datos al intermediario conectado. Luego, el corredor distribuye la información a cualquier cliente que se haya suscrito a ese tema. El editor no necesita tener ningún dato sobre el número o las ubicaciones de los suscriptores y los suscriptores, a su vez, no tienen que estar configurados con ningún dato sobre los editores.
Si un intermediario recibe un mensaje sobre un tema para el que no hay suscriptores actuales, el intermediario descarta el mensaje a menos que el editor del mensaje lo haya designado como mensaje retenido. Un mensaje retenido es un mensaje MQTT normal con el indicador retenido establecido en verdadero. El intermediario almacena el último mensaje retenido y la calidad del servicio correspondiente para el tema seleccionado. Cada cliente que se suscribe a un patrón de tema que coincide con el tema del mensaje retenido recibe el mensaje retenido inmediatamente después de suscribirse. El intermediario almacena solo un mensaje retenido por tema. Esto permite que los nuevos suscriptores de un tema reciban el valor más actual en lugar de esperar la próxima actualización de un editor.
Cuando un cliente de publicación se conecta por primera vez al intermediario, puede configurar un mensaje predeterminado para que se envíe a los suscriptores si el intermediario detecta que el cliente de publicación se ha desconectado inesperadamente del intermediario.
Los clientes solo interactúan con un corredor, pero un sistema puede contener varios servidores de corredores que intercambian datos en función de los temas de sus suscriptores actuales.
Un mensaje de control MQTT mínimo puede tener tan solo dos bytes de datos. Un mensaje de control puede transportar casi 256 megabytes de datos si es necesario. Hay catorce tipos de mensajes definidos que se utilizan para conectar y desconectar un cliente de un intermediario, publicar datos, acusar recibo de datos y supervisar la conexión entre el cliente y el servidor.
MQTT se basa en el protocolo TCP para la transmisión de datos. Se utiliza una variante, MQTT-SN, sobre otros transportes como UDP o Bluetooth.
MQTT envía credenciales de conexión en formato de texto sin formato y no incluye ninguna medida de seguridad o autenticación. Esto se puede proporcionar mediante el uso de TLS para cifrar y proteger la información transferida contra la intercepción, modificación o falsificación.
El puerto MQTT sin cifrar predeterminado es 1883. El puerto cifrado es 8883.
Intermediario MQTT
El corredor MQTT es una pieza de software que se ejecuta en una computadora (que se ejecuta en las instalaciones o en la nube) y puede ser autoconstruido o alojado por un tercero. Está disponible tanto en implementaciones de código abierto como propietarias.
El corredor actúa como una oficina de correos. Los clientes de MQTT no usan una dirección de conexión directa del destinatario deseado, sino que usan la línea de asunto llamada "Tema". Cualquiera que se suscriba recibe una copia de todos los mensajes de ese tema. Múltiples clientes pueden suscribirse a un tema desde un solo intermediario (capacidad de uno a muchos), y un solo cliente puede registrar suscripciones a temas con múltiples intermediarios (muchos a uno).
Cada cliente puede producir y recibir datos publicando y suscribiéndose, es decir, los dispositivos pueden publicar datos de sensores y seguir recibiendo información de configuración o comandos de control (MQTT es un protocolo de comunicación bidireccional). Esto ayuda tanto a compartir datos como a administrar y controlar dispositivos. Un cliente no puede transmitir los mismos datos a una variedad de temas y debe publicar varios mensajes para el corredor, cada uno con un solo tema dado.
Con la arquitectura del intermediario MQTT, los dispositivos cliente y la aplicación del servidor se desacoplan. De esta manera, los clientes no conocen la información de los demás. MQTT utiliza el cifrado TLS con conexiones protegidas con nombre de usuario y contraseña. Opcionalmente, la conexión puede requerir certificación, en forma de un archivo de certificado que proporciona un cliente y debe coincidir con la copia del servidor.
En caso de falla, el software del intermediario y los clientes pueden transferirse automáticamente al intermediario de respaldo automático/redundante. Los corredores de respaldo también se pueden configurar para compartir la carga de clientes en varios servidores en el sitio, en la nube o una combinación de estos.
El bróker puede admitir tanto MQTT estándar como MQTT para especificaciones compatibles, como Sparkplug. Esto se puede hacer con el mismo servidor, al mismo tiempo y con los mismos niveles de seguridad.
El corredor realiza un seguimiento de toda la información de la sesión a medida que el dispositivo se enciende y se apaga, en una función llamada "sesiones persistentes". En este estado, un intermediario almacenará la información de conexión de cada cliente, los temas a los que se haya suscrito cada cliente y los mensajes de un tema con una QoS de 1 o 2.
Las principales ventajas del corredor MQTT son:
- Elimina las conexiones de clientes vulnerables e inseguras
- Puede escalar fácilmente de un solo dispositivo a miles
- Administra y realiza un seguimiento de todos los estados de conexión de los clientes, incluidos los certificados y las credenciales de seguridad.
- Reducción de la tensión de la red sin comprometer la seguridad (red celular o satelital)
Tipos de mensajes
Conectar
Espera a que se establezca una conexión con el servidor y crea un enlace entre los nodos.
Desconectar
Espera a que el cliente MQTT finalice el trabajo que debe realizar y a que se desconecte la sesión TCP/IP.
Publicar
Vuelve inmediatamente al subproceso de la aplicación después de pasar la solicitud al cliente MQTT.
Versión 5.0
En 2019, OASIS lanzó el estándar oficial MQTT 5.0. La versión 5.0 incluye las siguientes características nuevas importantes:
- Códigos de motivo: los acuses de recibo ahora admiten códigos de retorno, que proporcionan un motivo para un error.
- Suscripciones compartidas: permita que la carga se equilibre entre los clientes y, por lo tanto, reduzca el riesgo de problemas de carga
- Caducidad del mensaje: los mensajes pueden incluir una fecha de caducidad y se eliminan si no se entregan dentro de este período de tiempo.
- Alias de tema: el nombre de un tema se puede reemplazar con un solo número
Calidad de servicio
Cada conexión con el intermediario puede especificar una medida de calidad de servicio (QoS). Estos se clasifican en orden creciente de sobrecarga:
- A lo sumo una vez: el mensaje se envía solo una vez y el cliente y el corredor no toman medidas adicionales para confirmar la entrega (activar y olvidar).
- Al menos una vez: el remitente vuelve a intentar enviar el mensaje varias veces hasta que se recibe la confirmación (entrega confirmada).
- Exactamente una vez: el remitente y el receptor se involucran en un apretón de manos de dos niveles para garantizar que solo se reciba una copia del mensaje (entrega asegurada).
Este campo no afecta el manejo de las transmisiones de datos TCP subyacentes; solo se usa entre emisores y receptores MQTT.
Aplicaciones
Varios proyectos implementan MQTT, por ejemplo:
- OpenHAB, la plataforma de automatización del hogar de software de código abierto, incorpora un enlace MQTT.
- La especificación estándar de API SensorThings de Open Geospatial Consortium tiene una extensión MQTT en el estándar como un enlace de protocolo de mensaje adicional. Se demostró en un piloto de IoT del Departamento de Seguridad Nacional de EE. UU.
- Node-RED admite MQTT con nodos TLS a partir de la versión 0.14.
- Home Assistant, la plataforma de automatización del hogar de software de código abierto, está habilitada para MQTT y ofrece un complemento de corredor Mosquitto.
- ejabberd es compatible con MQTT a partir de la versión 19.02.
- Eclipse Foundation gestiona una especificación de protocolo Sparkplug compatible con MQTT. Se basa en MQTT y agrega los requisitos necesarios en las aplicaciones industriales en tiempo real.
Seguridad
La seguridad del protocolo MQTT fue comprometida en 2020 por algunas investigaciones italianas, ejecutando ataques DoS lentos en dicho protocolo (ver CVE-2020-13849).
Contenido relacionado
Podcast
Daytime Protocol
Blog