¿Qué es MQTT? El protocolo más utilizado para IoT

Hoy en día la infraestructura de las organizaciones está cada vez más extendida, más allá del centro de datos. Parte de esta se encuentra en el Internet de las Cosas (Internet of Things, IoT), que permite una mayor integración entre el hardware y los sistemas digitales (Tecnología Operativa y Tecnología de Información, TO/TI), revolucionando la interconexión entre los dispositivos, permitiendo una mayor eficiencia y automatización. También IoT permite obtener y procesar con menor latencia los datos para aumentar la productividad y mejorar las operaciones empresariales. Según estadísticas recientes, al 2023, 57% de las organizaciones norteamericanas y europeas usan actualmente IoT en sus operaciones. En este panorama, el protocolo MQTT (Message Queuing Telemetry Transport) emerge como una piedra angular, facilitando una comunicación ágil y eficaz entre dispositivos en el vasto ecosistema del IoT.

Definición y significado de MQTT (MQ Telemetry Transport)

MQTT (Message Queuing Telemetry Transport) es un protocolo de mensajería eficiente y ligero diseñado para la comunicación desde dispositivos con limitaciones en recursos o ancho de banda como el Internet de las Cosas (IoT). Se apoya en un protocolo de transporte que habilita conexiones ordenadas y bidireccionales, normalmente como TCP/IP, como también en QUIC (más popular en navegador de Chrome de Google), bajo los estándares de OASIS y recomendaciones de ISO (ISO/IEC 20922).

Origen y propósito del protocolo MQTT

Concebido por el Dr. Andy Stanford-Clark y Arlen Nipper en 1999, MQTT ha evolucionado para convertirse en un estándar fundamental para la transmisión de datos entre dispositivos conectados, tales como los sensores de luz, movimiento, temperatura, teléfonos móviles y ordenadores. Su estandarización por OASIS en 2013 consolidó su posición como una herramienta clave en el ámbito del IoT. La simplicidad, la escalabilidad y la capacidad para operar en redes de baja potencia han contribuido al éxito continuo de MQTT en facilitar una comunicación eficiente en entornos IoT diversos.

Historia y Evolución de MQTT

Desarrollo de MQTT hasta la versión actual, como estándar de OASIS e ISO

Originalmente, MQTT se inventó en 1999 para la industria del petróleo y el gas, por la necesidad de un protocolo con el ancho de banda mínimo y que además procurara una pérdida de batería mínima, con el fin de poder supervisar los oleoductos vía satélite. En ese entonces, el protocolo se llamaba Transporte de Telemetría de Message Queue Server por el producto MQ Series de IBM, el cual fue el primero en aceptarlo. Después, en 2010, IBM lanzó MQTT 3.1 como protocolo gratuito y abierto, de manera que cualquiera pudiera implementarlo. En 2013, se envió a OASIS, la Organización para el Avance de Estándares de Información Estructurada (OASIS), para su estandarización.
En 2019, OASIS lanzó la versión 5 de MQTT e incluso convierte el acrónimo en el nombre oficial del protocolo para IoT y se reconoce como estándar ISO (ISO/IEC PRF 20922) del protocolo de mensajería basado en publicación/suscripción.

Funcionamiento de MQTT

Modelo de comunicación de publicación/suscripción

El protocolo MQTT funciona según los principios del modelo de publicación o suscripción. En la comunicación de red tradicional, los clientes y servidores se comunican directamente entre sí, donde los clientes solicitan recursos o datos del servidor y, a continuación, el servidor procesa y envía una respuesta. Sin embargo, MQTT utiliza un patrón de publicación o suscripción para desacoplar el remitente del mensaje (editor), del receptor del mensaje (suscriptor), y un tercer componente, denominado agente de mensajes, controla la comunicación entre editores y suscriptores. El trabajo del agente consiste en filtrar todos los mensajes entrantes de los editores y distribuirlos correctamente a los suscriptores. El agente desacopla los editores y suscriptores de la siguiente manera:

  • Desacoplamiento espacial: el editor y el suscriptor no conocen la ubicación de la red del otro y no intercambian información, tales como direcciones IP o números de puerto.
  • Desacoplamiento de tiempo: editor y suscriptor no ejecutan ni tienen conectividad de red al mismo tiempo.
  • Desacoplamiento de sincronización: editores y suscriptores pueden enviar o recibir mensajes sin interrumpirse entre sí. Es decir, el suscriptor no tiene que esperar a que el editor envíe un mensaje.

Componentes de MQTT: Cliente y agentes

  • Cliente MQTT: Cualquier dispositivo que ejecuta una biblioteca MQTT. Si el cliente envía mensajes es el editor; si recibe mensajes, es el receptor.
  • Agente MQTT: Es el sistema de back-end que coordina los mensajes entre los clientes. Se encarga de recibir y filtrar mensajes, identificar clientes suscritos a cada mensaje y enviarles los mensajes. También se encarga de la autorización y autenticación de clientes MQTT, pase de mensajes a otros sistemas para su análisis y el control de mensajes perdidos y sesiones de clientes.

Proceso de conexión y comunicación entre clientes y agentes

Conexión MQTT: Los clientes inician la conexión en MQRR al enviar un mensaje de CONECTAR al agente. El agente confirma la conexión establecida con un mensaje CONNACK. Tanto el cliente como el agente requieren de TCP o IP para comunicarse- no se conectan entre sí sin el agente.
La arquitectura de MQTT, controlada por eventos, destaca por su capacidad para gestionar mensajes de tamaño reducido y claramente definidos. Además, introduce el concepto de Calidad de Servicio (QoS) con niveles 0, 1 y 2 (que explicaremos más adelante en la sección de beneficios), permitiendo adaptar la entrega de mensajes a las necesidades específicas de cada aplicación. Con estas características, MQTT se erige como un protocolo versátil y eficaz para la comunicación en entornos IoT, ofreciendo una infraestructura robusta y escalable.
Los temas en MQTT son cadenas jerárquicas que se utilizan para categorizar mensajes. Los suscriptores pueden filtrar mensajes suscribiéndose a temas específicos, con lo que se logra una distribución de datos eficiente. Estos temas se organizan jerárquicamente mediante el uso del carácter “/” como delimitador, facilitando una estructura ordenada y comprensible. Una característica destacada es la retención de mensajes, asegurando que los nuevos suscriptores reciban la información más reciente. Además, MQTT incorpora el concepto de “última voluntad y testamento”, proporcionando una estrategia para manejar desconexiones inesperadas al establecer un mensaje predeterminado que se enviará en tales situaciones. Estos elementos enriquecen la flexibilidad y confiabilidad de MQTT, consolidándolo como un protocolo versátil y robusto en el contexto del Internet de las Cosas (IoT).
Otro aspecto importante es que MQTT se distingue por cuatro acciones principales que constituyen su funcionalidad central:

  • Publicar: Permite a los clientes enviar mensajes a un tema específico, compartiendo información relevante.
  • Suscribirse: Posibilita a los clientes recibir mensajes de un tema determinado, permitiendo una comunicación bidireccional.
  • Ping: Mantiene la conexión entre clientes y brókeres, asegurando la vigencia y eficiencia del intercambio de información.
  • Desconectar: Permite a los clientes finalizar su conexión de manera ordenada.

Cada una de estas acciones desempeña un papel crucial en el protocolo MQTT, facilitando una comunicación ágil y confiable en el entorno dinámico del Internet de las Cosas (IoT).

Beneficios y Aplicaciones de MQTT

Ventajas de utilizar MQTT en entornos de IoT y IoT Industrial (IioT)

  • Ligero, con un encabezado fijo de 2 a 5 bytes, por lo que su “peso” en la red es ligero. No solo se optimiza el ancho de banda al momento de tener muchos dispositivos conectados y enviando mensajes simultáneamente, sino que también permite ser usado en zonas donde la conexión de internet es inestable o muy limitada.
  • Altamente compatible, al ser un estándar soportado por múltiples dispositivos IoT que usan este protocolo. Para implementarlo, se requiere un código mínimo, lo cual es una clara ventaja para dispositivos de distintos fabricantes o de memoria limitada.
  • Confiable, con tres niveles de calidad en el servicio (QoS, Quality of Service):
    • Nivel 0 (lanzar y olvidar). En este nivel, cada mensaje se envía una vez a cada suscriptor, sin esperar confirmación, lo que reduce al máximo el ancho de banda. El mensaje no se almacena. En caso de que los clientes estén desconectados en ese momento, éstos no recibirán el mensaje, por lo que se recomienda para casos en que la pérdida del mensaje no sea un problema.
    • Nivel 1 (entregado al menos una vez). Como dice su nombre, en este nivel, el cliente debe confirmar el mensaje recibido. La ventaja es que se asegura que los mensajes se entregan todos al menos una vez. La desventaja es que se usa más ancho de banda y el cliente puede recibir mensajes duplicados si tarda en confirmar su recepción.
    • Nivel 2 (entregar sólo una vez). Este es el nivel que demanda más ancho de banda, aunque la ventaja es que es más confiable porque se espera a que el cliente confirme el mensaje recibido y, antes de volver a enviar un mensaje, hace la pregunta si se ha recibido el mensaje. Este nivel se asegura de que los clientes han recibido el mensaje sólo una vez. Además de no consumir ancho de banda, se da la certeza de mensajes recibidos sin ser duplicados.
  • Proporciona seguridad, ya que soporta métodos de autenticación como OAuth o TLS 1.3, lo que le permite ser usado en redes que no sean del todo seguras.
  • Información para el análisis en tiempo real, ya que brinda datos en tiempo real, que es de suma utilidad en mantenimiento preventivo y monitorización en ambientes ya sea en un hogar inteligente, como en logística, distribución y manufactura.
  • Abierto, soportado por los principales fabricantes de nube como AWS, Google Cloud, IBM Cloud, Oracle y Microsoft Azure.

Aplicaciones prácticas de MQTT en diversas industrias, como la industria automotriz, energética y de telecomunicaciones

Mediante MQTT, IoT permite obtener y procesar datos para gestionar datos que conduzcan a tomar decisiones y acciones encaminadas a la productividad y optimización de operaciones en diversos sectores de la economía. Por ejemplo:

  • Transporte
    Soporte a aplicaciones móviles, dando recomendación de los vehículos disponibles más cercanos.
  • Manufactura
    En interacción con la robótica en ciclos de fabricación o mantenimiento preventivo.
  • Automotriz
    Junto con los datos de inteligencia artificial, puede reconocer y resolver las deficiencias de forma autónoma de la información humana.
  • Energía
    Control remoto y automatización de la distribución de energía.
  • Telecomunicaciones
    Para proporcionar servicios excepcionales de conectividad móvil y de red que soporten aplicaciones móviles inteligentes en el hogar o sistemas de monitorización en tiempo real.
  • Salud
    Monitorización del estado de bienestar mediante un reloj inteligente que emite datos, permitiendo identificar información crítica del paciente.

Desventajas y Retos de MQTT

Limitaciones y desafíos de seguridad, interoperabilidad y autenticación

Una de las desventajas de MQTT se asocia con problemas potenciales de seguridad, ya que el protocolo no tiene ningún mecanismo de seguridad como el cifrado o la autenticación, lo que hace que los mensajes corran el riesgo de ser interceptados, alterados o falsificados por hackers.
Otra desventaja nace del hecho de que el protocolo puede ser un único punto de fallo, lo que puede exponer al sistema IoT a ataques o interrupciones.
Lo anterior nos hace recomendar que se implementen medidas de seguridad adicionales, tales como el cifrado SSL/TLS, la autenticación del usuario, las contraseñas o listas de control de acceso. Es de suma importancia proteger los datos y los dispositivos, que son los objetivos preferidos por los cibercriminales.

Comparación con otros protocolos de transferencia, como CoAP y AMQP

Existen otros protocolos para conectar dispositivos como CoaP (Constrained Application Protocol, protocolo de la capa de aplicación de internet para dispositivos con recursos restringidos) y AMQP (Advanced Message Queuing Protocol, es el protocolo de la capa de aplicación estándar abierto para middleware orientado a mensajes). Frente a éstos, MQTT tiene algunas desventajas:

MQTT vs CoAP:

  • Ciclos de transmisión: MQTT tiene un ciclo de transmisión más lento que CoAP.
  • Soporte a RESTful (interfaz para intercambiar información de manera segura a través de Internet): MQTT no es RESTful (una API RESTful es una interfaz que dos sistemas de computación utilizan para intercambiar información de manera segura a través de Internet), mientras que CoAP sí es RESTful.
  • Descubrimiento de recursos: MQTT funciona en suscripciones de temas flexibles. CoAP tiene un mecanismo estable de descubrimiento de recursos.
  • Cifrado: MQTT no está cifrado, aunque puede usar TLS/SSL para implementar la seguridad y el cifrado. CoAP funciona con DTLS (Seguridad en la capa de transporte de datos).

MQTT vs AMQP:

  • Patrones de mensaje: El protocolo AMQP admite un mecanismo de enrutamiento más sofisticado. Los mensajes primero van a un intercambio que luego los enruta a la cola correcta, utilizando algunas reglas predefinidas.
  • Ruteo de mensajes: AMQP admite múltiples tipos de intercambio con estrategias de enrutamiento únicas, esto permite que este protocolo admita diferentes patrones de comunicación, en tanto que MQTT es un mecanismo de ruteo de mensajes simple.
  • Versatilidad: AMQP ofrece varias funciones en persistencia de mensajes y transaccionalidad. Esto lo hace muy versátil para varios casos de uso que demanda más funcionalidades.

Diferencias entre MQTT y REST en cuanto a arquitectura y modelo de comunicación

Para entender la diferencia entre MQTT y REST, repasemos lo siguiente:

La figura anterior muestra la arquitectura MQTT, que consta de un intermediario centralizado donde todas las comunicaciones entre dispositivos (endpoints) pasan a través del intermediario, y el broker se puede instalar en cualquier servidor público. Recordemos que MQTT se basa en una arquitectura de publicación/suscripción, donde en cada extremo los dispositivos pueden publicar temas y suscribirse a cualquier tema. En el protocolo MQTT, se necesita nombre de usuario y contraseña para establecer la conexión.
Ahora REST (Representational State Transfer o transferencia de representación de estado) es una interfaz para conectar varios sistemas basados en el protocolo HTTP y que sirve para obtener y generar datos y operaciones, devolviendo datos en formatos muy específicos (por ejemplo XML y JSON).

En esta figura se representan los protocolos REST. Ver que REST está construido sobre capas HTTP/TCP. El protocolo REST utiliza una arquitectura basada en bus, donde no se necesita ningún componente intermediario (broker) y los dispositivos (endpoints) pueden comunicarse directamente. En este caso, se utilizan mensajes de solicitud y respuesta entre dispositivos finales para intercambiar la información. Con esto, a diferencia de MQTT, en REST:

  • Los mensajes son GET, PUT, POST y DELETE (obtener, colocar, postear y eliminar).
  • La arquitectura es de SOLICITUD/RESPUESTA.
  • No se requiere de broker, pues la comunicación es directa.
  • El protocolo de seguridad es HTTPS.
  • La interoperabilidad es semántica.
  • Tolerancia a fallos es de Servidor en SPoF (single point of failure). Si una parte falla en el Sistema, se detiene el funcionamiento del resto del sistema.

Exploración de cómo la versión 5 de MQTT introduce funcionalidades similares a REST

La razón por la cual hemos explicado lo anterior es que la versión 5.0 de MQTT ahora tiene funcionalidades similares a REST, haciéndolo más robusto:

  • Razones de desconexión: Ahora puede proporcionar un código de motivo o razón para cada paquete de reconocimiento, lo que nos brinda una mejor comprensión de por qué ocurrió una desconexión o fallo.
  • Con MQTT 5.0, se puede definir un período de tiempo específico durante el cual la sesión debe mantenerse activa después de la desconexión. Esto proporciona una mayor flexibilidad en la gestión de la duración de las sesiones y conserva los recursos en el servidor.
  • MQTT 5.0 introduce alias de temas para reducir la sobrecarga en los encabezados de los mensajes. En versiones anteriores, el nombre del tema debía incluirse en cada mensaje, lo que generaba paquetes de mayor tamaño.
  • Metadatos personalizados, que permite a los usuarios incluir metadatos personalizados en los encabezados de los paquetes MQTT. Esto puede ser particularmente útil para aplicaciones que necesiten enviar información adicional con sus mensajes MQTT, como la marca de tiempo del mensaje, la ubicación del dispositivo u otra aplicación.
  • Opciones de suscripción, para especificar cómo se desea recibir mensajes para cada tema suscrito. Por ejemplo, los clientes ahora pueden especificar si desean recibir mensajes retenidos para una suscripción en particular, o si desean recibir mensajes si tienen el mismo nivel de QoS (calidad de servicio) que la suscripción.
  • La función de solicitud/respuesta permite a un cliente especificar un tema que el servidor puede usar para enviar una respuesta directa. Esto hace más eficiente y directa la comunicación.
  • Suscripción compartida; es decir, cuando se publica un mensaje en un tema compartido, el servidor distribuye el mensaje a uno de los clientes de la suscripción compartida, equilibrando así la carga de los mensajes.

También, en esta versión, los clientes pueden conectar los dispositivos mediante de MQTT5 o aprovechar una combinación de dispositivos conectados a las versiones 3 y 5 de MQTT, interactuando entre sí para admitir despliegues heterogéneos.

Seguridad en MQTT

Implementación de protocolos de seguridad como SSL/TLS para proteger la comunicación en MQTT

La seguridad en MQTT se aborda mediante diversas capas para garantizar la integridad y confidencialidad de la comunicación en el Internet de las Cosas (IoT). La primera capa se centra en la seguridad de red, implementando medidas para proteger la infraestructura subyacente. Aunque MQTT ofrece la opción de utilizar nombres de usuario y contraseñas, es crucial destacar que esta información se transmite en texto sin cifrar, lo que presenta un aspecto a considerar en términos de privacidad. Además, se brinda la posibilidad de fortalecer la seguridad mediante el uso de SSL/TLS, aunque esta opción conlleva una sobrecarga adicional. En conjunto, estas estrategias buscan establecer un equilibrio entre la accesibilidad y la protección, adaptándose a los requisitos específicos de cada implementación de MQTT en entornos IoT.

Actualizaciones en MQTT v5.0

La evolución de MQTT a la versión 5.0 marcó un hito en su desarrollo. Oficialmente publicado en 2019, este estándar introdujo innovaciones significativas que ampliaron su versatilidad. Entre las novedades más destacadas se encuentran los códigos de motivo, que ofrecen una mayor claridad en la interpretación de eventos. Las suscripciones compartidas proporcionan una forma eficiente de distribuir mensajes a múltiples suscriptores, mejorando la escalabilidad. La caducidad del mensaje ofrece un control más preciso sobre la persistencia de la información, adaptándose a diversos escenarios de aplicación. Además, la incorporación de alias de tema simplifica la gestión y optimiza el intercambio de datos. Estas actualizaciones refuerzan el estatus de MQTT como un protocolo dinámico y a la vanguardia, capaz de satisfacer las demandas cambiantes del Internet de las Cosas (IoT) con eficacia y eficiencia.

Aspectos de autenticación, autorización y cifrado en MQTT

Como habíamos mencionado antes, utilizar SSL/TLS nos ayuda a brindar autenticación, encriptación e integridad cuando se usa el protocolo MQTT. Es decir;

  • Autenticación: Quien envía el mensaje es quien dice ser.
  • Encriptación: Nadie en el camino puede leer el mensaje.
  • Integridad: El mensaje no puede ser modificado.

Esto se hace a través de una firma digital (certificado) y claves públicas y privadas para encriptar y desencriptar el mensaje. Para agregar esto en MQTT, los pasos a seguir son:

  • Crear una contraseña pública y una privada para autorizar la certificación (CA).
  • Crear un certificado para la CA y firmar con la contraseña privada antes generada.
  • Generar una contraseña pública y una privada para el broker MQTT.
  • Crear un requerimiento de firma de certificado para las contraseñas del paso anterior.
  • Utilizar el certificado del paso 2 para firmar el requerimiento del paso anterior.
  • Copiar todos los certificados en un directorio del broker MQTT.
  • Copiar el certificado de la CA en el cliente.
  • Editar la configuración del cliente para que utilice TLS y el certificado de la CA.

MQTT y WSS (MQTT sobre WebSockets)

Descripción de MQTT sobre WebSockets y su implementación para recibir datos en navegadores web

Cada navegador puede ser un dispositivo MQTT con MQTT sobre Websockets, los cuales son protocolos que hacen posible abrir una sesión de comunicación interactiva entre el navegador del usuario y un servidor. Este protocolo se ejecuta sobre Transport Layer Security (TLS) o Secure Sockets Layer (SSL), proporcionando un medio seguro para intercambiar datos. Al usar WebSockets, directamente en un navegador, se puede lograr eficiencia en la comunicación, enviando mensajes a un servidor y recibiendo respuestas controladas por eventos sin tener que consultar al servidor para una respuesta. Esto es porque el cliente y el servidor se conectan a través de la URL de WebSocket (existen varios paquetes de control MQTT en una única trama de datos WebSocket).

Comparación con la comunicación estándar de MQTT

Originalmente, WebSocket fue diseñado para aplicaciones web. Una característica de WebSocket es que mantiene una conexión continua con el servidor, lo que permite una comunicación de baja latencia en comparación con otras arquitecturas tradicionales basadas en HTTP. También, WebSocket revoluciona la comunicación al permitir la transmisión de datos en tiempo real, en lugar de crear múltiples conexiones de corta duración para cada interacción. Ante el acelerado crecimiento del uso de dispositivos de IoT, la latencia y la escalabilidad se han vuelto más críticas para el intercambio de datos en tiempo real.

Conclusiones y consideraciones

Ante la extensión de las infraestructuras más allá de los datacenters en dispositivos e Internet de las Cosas, MQTT ofrece las ventajas de ser ligero, confiable, compatible, abierto y seguro. Ahora con la versión 5.0 disponible, se recomienda hacer una actualización. Para hacer este proceso de migración, se recomienda lo siguiente:

1. Actualizar los brokers de MQTT, con sumo cuidado para no afectar a todos los clientes MQTT, preferiblemente en un entorno que no sea de producción, antes de implementarlo.

2. Actualizar las librerías de los clientes, también primero en un entorno que no sea de producción. Asegúrate de que el código de tu aplicación esté actualizado para manejar las nuevas funciones de MQTT 5.0.

3. Abordar nuevas consideraciones de seguridad. Por ejemplo, con la nueva función de propiedad del usuario, los clientes ahora pueden enviar datos personalizados al corredor. Si bien ésta es una característica poderosa, puede explotarse si no se usa correctamente. Por lo tanto, es importante evaluar todas las nuevas características desde una perspectiva de seguridad.

4. Monitorizar después de realizar la migración. La monitorización no debe limitarse sólo a aspectos técnicos, como la entrega de mensajes o las conexiones de los clientes, sino que también debe monitorizarse el uso de las nuevas funciones MQTT 5.0 en tus aplicaciones.

Y la recomendación que siempre hacemos es combinarlo con un experto en tecnología y, preferiblemente, que entienda las necesidades particulares donde se desarrolla la industria a la que pertenece tu organización.

¿Puede una sola herramienta tener una visibilidad global?