Introducción a MQTT (y uso en Sofia2)

Aprovechando el DZone Refcardz de Dominik Obermaier sobre MQTT:

Vamos a contar los conceptos fundamentales de MQTT, un protocolo de mensajería Publish-Subscribe muy usado en el ámbito IoT, y que Sofia2 soporta desde sus primeras versiones.

Mientras que HTTP es el protocolo estándar para la web, en IoT MQTT es un protocolo muy interesante por su modelo Publish/Subscribe y por ser muy ligero (hasta en Arduino corre :)) y multilenguaje.

¿Qué es MQTT?

MQTT es un protocolo de mensajería de tipo publicación/suscripción, estandarizado por OASIS.

  • Es ligero, abierto, simple, y fácil de implementar.
  • Está diseñado para tener una mínima sobrecarga lo que hace que sea una buena opción para aplicaciones M2M y de Internet de las cosas, sobre todo cuando aparecen sistemas embebidos o limitados.
  • MQTT utiliza características del transporte TCP, por lo que el requisito mínimo para el uso de MQTT es el uso de TCP.
  • La versión más reciente de MQTT es 3.1.1, que tiene muchas mejoras con respecto a la primera versión MQTT pública, MQTT 3.1.

Casos de Uso

MQTT es especialmente interesante en escenarios en los que la entrega de mensajes confiable es crucial para una aplicación, pero no se dipone de una conexión de red fiable (por ejemplo una red móvil).

En ese sentido tiene aplicación a:

• Telemetría

• Automotriz

• Casa inteligente

• Monitorización de Energía

• Aplicaciones de Chat

• Notification Services

Comunicación Publish/Subscribe

Este patrón desacopla el cliente que envía un mensaje (Publicador) de otros clientes que puedan consumirla (Suscriptores):

De esta forma los publicadores y suscriptores no tienen que conocerse y sólo tienen que conocer el Message Broker (por otro lado Sofia2 es un Broker que aisla del protocolo subyacente, permitiendo que un Publicador publique por ejemplo en MQTT y haya suscriptores WebSocket).

Tipos de mensajes MQTT

Sofia2 tiene 14 tipos de mensajes, normalmente un usuario sólo usa los mensajes de CONNECT, PUBLISH, SUBSCRIBE Y UNSUBSCRIBE.

Sofia2 permite usar directamente el protocolo MQTT aunque lo más cómodo es usar una de las APIs de Sofia2 que aíslan de las complejidades del protocolo, permitiendo comunicar con Sofia2 sin necesidad de conocer el protocolo de más bajo nivel.

Tópicos MQTT

Un tópico es una cadena UTF-8 que usa el Broker para filtrar mensajes para cada cliente conectado.

MQTT soporta Wildcards (+ y #):

Calidad del Servicio:

MQTT soporta 3 Calidades del Servicio (QoS).

Cada mensaje publicado se envía con uno de estos niveles de Quality of Service (QoS).

Estos niveles representan las diferentes garantías en la entrega del mensaje.

Otros conceptos:

  • Un mensaje Last Will and Testament (LWT) puede especificarse por un cliente cuando conecta con el Broker MQTT. En ese caso si el cliente no desconecta correctamente el Broker envía el mensaje LWT.
  • Cada mensaje MQTT message puede ser enviado com o un mensaje retained, en este caso cada Nuevo cliente que conecta a un tópico recibirá el último retained message en ese tópico.
  • Cuando un cliente conecta con el Broker puede solicitar una sesión persistente, en ese caso el Broker almacena todas las suscripciones del cliente, todos los mensajes QoS 1 y 2 no procesados o perdidos por el cliente
  • Un mensaje MQTT CONNECT contiene un valor keepAlive en segundos donde el cliente establece el máximo timeout entre intercambio de mensajes

Implementaciones MQTT:

Escalado MQTT

En una Arquitectura basada en Broker es fundamental evitar el SPOF (punto único de fallo). En el contexto MQTT hay 2 estrategias principales:

  • Bridging: hace forward de mensajes a otro bróker MQTT. Es la solución de HiveMQ, Mosquitto, IBM MQ
  • Clustering: soportando añadido dinámico de nodos al cluster. Lo usa ActiveMQ, HiveMQ o RabbitMQ.

Sofia2 de nuevo aisla de esta complejidad permitiendo un escalado dinámico y transparente en función de los nodos que se vayan añadiendo.

MQTT y la Seguridad

Ya sabemos lo importante que es la seguridad, y más en escenarios IoT en el que comunican objetos entre sí.

MQTT confía en tecnologías estándares para esto:

  • Autenticación usuario/Password
  • Seguridad TLS

Nuevas características de MQTT 3.1.1

MQTT 3.1.1 es la release más reciente de MQTT (octubre de 2014).

Esta versión es retrocompatible con la 3.1 aunque añade alguna característica interesante como clientes MQTT anónimos.

Introducción a MQTT (y uso en Sofia2)