Protocolo MQTT
MQTT son las siglas MQ Telemetry
Transport, aunque en primer lugar fue conocido como Message Queing Telemetry
Transport. Es un protocolo de comunicación M2M (machine-to-machine) de tipo
message queue.
Está basado en la pila TCP/IP
como base para la comunicación. En el caso de MQTT cada conexión se mantiene
abierta y se "reutiliza" en cada comunicación. Es una diferencia, por
ejemplo, a una petición HTTP 1.0 donde cada transmisión se realiza a través de
conexión.
MQTT fue creado por el Dr. Andy
Stanford-Clark de IBM y Arlen Nipper de Arcom (ahora Eurotech) en 1999 como un
mecanismo para conectar dispositivos empleados en la industria petrolera.
Aunque inicialmente era un formato propietario, en 2010 fue liberado y pasó a ser un estándar en 2014 según la OASIS (Organization for the Advancement of Structured Information Standards)
FUNCIONAMIENTO
El
funcionamiento del MQTT es un servicio de mensajerÃa push con patrón publicador/suscriptor
(pub-sub). Como vimos en la entrada
anterior, en este tipo de infraestructuras los clientes se conectan con un
servidor central denominado broker.
Para filtrar los mensajes que son
enviados a cada cliente los mensajes se disponen en topics organizados jerárquicamente. Un cliente puede publicar un mensaje en un determinado
topic. Otros clientes pueden suscribirse a este topic, y el broker le hará
llegar los mensajes suscritos.
Los
clientes inician una conexión TCP/IP con el broker, el cual mantiene un
registro de los clientes conectados. Esta conexión se mantiene abierta hasta
que el cliente la finaliza. Por defecto, MQTT emplea el puerto 1883 y el 8883
cuando funciona sobre TLS.
Para ello el cliente envÃa un mensaje CONNECT que contiene información necesaria (nombre de usuario, contraseña, client-id…). El broker responde con un mensaje CONNACK, que contiene el resultado de la conexión (aceptada, rechazada, etc).
Para enviar los mensajes el cliente emplea mensajes PUBLISH, que contienen el topic y el payload.
Para suscribirse y desuscribirse se emplean mensajes SUBSCRIBE y UNSUSCRIBE, que el servidor responde con SUBACK y UNSUBACK.
Por otro lado, 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. Finalmente, el cliente se desconecta enviando un mensaje de DISCONNECT.
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.
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 por lo que 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 algún mensaje duplicados.
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.
VENTAJAS DEL MQTT
Son varias las
ventajas del protocolo MQTT como sistema de comunicación M2M. Por un
lado, tenemos todas las ventajas
del patrón pub/sub que vimos en la entrada anterior, como son
escalabilidad, asincronismo, desacoplamiento entre clientes.
Además, MQTT aporta
una serie de caracterÃsticas que le han hecho sobre salir sobre otros
competidores. La principal, como hemos mencionado, es su sencillez y ligereza. Esto lo hace adecuado para
aplicaciones IoT, donde frecuentemente se emplean dispositivos de escasa potencia.
Además, esto menor
necesidad de recursos se traduce en un menor consumo de energÃa, lo cual es interesante en dispositivos
que funcionan 24/7 y muy especialmente en dispositivos alimentados por baterÃa.
Otra consecuencia de
la ligereza del protocolo MQTT es que requiere un ancho de banda mÃnimo, lo cual es importante en redes
inalámbricas, o conexiones con posibles problemas de calidad.
Por último, MQTT
dispone de medidas adicionales importantes, como la seguridad y calidad del servicio (QoS).
Por último, es una solución largamente testada y consolidad, que aporta robustez y fiabilidad.


















