Académique Documents
Professionnel Documents
Culture Documents
Internet of Things –
Protocolo MQTT
Este modelo trabaja, principalmente, con sensores, actuadores y otros periféricos que
demandan escasos recursos, por lo que una de las mayores necesidades para construirlo
es poseer una comunicación efectiva y de bajo consumo entre máquinas a través de la
red. Dicha necesidad y todas las soluciones generadas para satisfacerla (protocolos,
sistemas, nuevos modelos) se han vuelto prácticamente inseparables del Internet of
Things.
Dado que tiene algunas diferencias básicas con las redes de información más comunes,
IoT requiere otro modelo de capas. Sin embargo, debido a las variadas necesidades y
aplicaciones que presenta, existen múltiples modelos propuestos que pueden adaptarse
a diferentes áreas. En particular, es relevante el modelo usado para sensores, apodado
PNA (Perception Network Application), que se focaliza en la transmisión de datos desde
dispositivos físicos hacia un centro de procesamiento. También se debe mencionar la
modificación del modelo TCP/IP Suite, que colapsa la capa física y de enlace en una misma
“capa física y capa MAC”, y agrega una capa de adaptación dedicada a traducir paquetes
de IPv6 a IPv4 o 6LoWPAN, acordes con las necesidades.
Protocolo Message Queuing Telemetry Transport
El común de la gente tiende a considerar IoT como un concepto nuevo, pero ha sido
teorizado por ingenieros durante mucho tiempo. Algunos de los protocolos que hoy en
día se utilizan, sobre todo, para este modelo, se remontan hasta dos décadas atrás; es el
caso del Message Queuing Telemetry Transport, que fue diseñado en 1999. Este
protocolo, generalmente referido como MQTT, es un protocolo de mensajería liviano del
tipo publicar/subscribir, diseñado para trabajar con aparatos de poco ancho de banda,
alta latencia y redes poco confiables. Sus principios básicos tienden a minimizar el
consumo ancho de banda de la red y los recursos requeridos por el aparato, mientras
provee un servicio de entrega confiable y robusto. Estos principios son lo que lo hacen
ideal para comunicación M2M (“machine to machine”) y, por lo tanto, para trabajar en
conjunto con otros protocolos en IoT.
Si bien el protocolo recibió el título de estándar de OASIS en 2014 y fue publicado como
un open source con licencia libre de regalías, desde 2005 y 2006 ha tenido una constante
presencia en el desarrollo de tecnologías. Algunos proyectos se enfocaron en aprovechar
las ventajas inherentes del MQTT, para hacer posibles ideas como clasificar información
basada en los intereses y ubicaciones de los usuarios, traducir texto hablado a lenguaje
de señas, crear edificios inteligentes y más.
Desde entonces, el MQTT se ha convertido en uno de los protocolos más usados en IoT,
siendo la elección obvia al trabajar con tecnologías de automatización y compitiendo con
otros gigantes como XMPP, Rest API y CoAP. Su orientación al trabajo con sistemas
limitados o riesgosos generó la eventual evolución del protocolo en MQTT-S,
espacialmente diseñado para sistemas de sensores que pasan una gran cantidad de
tiempo desactivados.
Un patrón publicar/suscribir requiere que el protocolo sea capaz de enviar mensajes sin
un receptor definido, lo que les otorga cierta atemporalidad. El emisor envía un mensaje
sin un receptor particular o, lo que es lo mismo, lo “publica” y los receptores deben estar
vinculados con el emisor para recibir el contenido, es decir, se “suscriben” a él. Para
obtener una mejor organización, el MQTT crea “temas”, o sea, clasificaciones de mensajes
que permiten a un cliente decidir qué contenido recibir.
Para realizar esto, el protocolo designa dos entidades en la red: un broker de mensajes y
un cierto número de clientes. El broker actúa como un nodo de una red conectada en
forma de estrella; los clientes definidos como divulgadores emiten mensajes al broker,
que luego compara el tema del mensaje con sus archivos, para ver qué equipo debe
recibirlo, y lo deriva a los clientes que están suscritos a dicho tema. Ya que el MQTT es
liviano y de simple topología, el broker puede manejar fácilmente grandes cantidades de
clientes, con un máximo recomendado que, por lo general, ronda los diez mil.
ILUSTRACIÓN 1 DIAGRAMA DE TOPOLOGÍA UTILIZADA POR MQTT (EXTRAÍDO DE WEB OFICIAL DE IBM)
1
Todos los mensajes para cada comando MQTT tienen un encabezado fijo, de dos a cinco
bytes de largo, y pueden disponer o no de un encabezado variable y un payload de hasta
Encabezado fijo
El encabezado fijo de un mensaje MQTT puede ser dividido en dos partes: el byte de
control y los bytes de longitud restante de paquete. El byte de control es un único byte
que contiene el tipo de mensaje, el nivel de Quality of Service y los flags necesarios para
todo mensaje. El campo de longitud restante de paquete puede tener desde uno a cuatro
bytes y, como el nombre indica, define qué tan largo es el paquete en cuestión. Debido a
que estos dos campos son los únicos elementos siempre presentes en el mensaje, los
comandos más pequeños de MQTT son solamente dos bytes: uno de control y uno de
longitud de paquete.
7 6 5 4 3 2 1 0
bit
byte 1 Tipo de Mensaje DUP flag Nivel de QoS flag RETAIN flag
Tipo de Mensaje
Posición: Byte 1, bits 7 a 4
Valor de 4 bits que determina cuál de los 14 posibles tipos de mensaje disponibles se
está enviando. (Ver tabla en anexo)
Flags
Posición: Byte 1, bits 3 a 0
Valor de cuatro bits que contiene los campos de los flags DUP, QoS y RETAIN.
Finalmente, el campo RETAIN se ubica en la posición cero del primer byte e informa al
servidor si un mensaje debe de ser guardado en su memoria. Solo es usado en mensajes
de tipo PUBLISH, los cuales, de tener este flag en alto, deben ser almacenados luego de
que el servidor dirige el mensaje a los suscriptores. Cuando un cliente se suscribe a un
tema con mensajes retenidos, el servidor envía la última publicación con RETAIN alto que
tenía guardada. Se puede eliminar este último mensaje enviando un PUBLISH a dicho
tema con RETAIN alto y payload cero.
Encabezado Variable
Posición: Byte 3 o 5 a X
El encabezado variable es un campo directamente a continuación del encabezado fijo, y
su tamaño es dependiente del tipo de mensaje que se está enviando. Algunos comandos,
como DISCONNECT, por ejemplo, no poseen encabezados variables, mientras que otros,
como el PUBLISH, lo necesitan para conocer información como tema de destino o
identificador del cliente emisor.
Payload
Posición: Byte X a Y
Algunos paquetes de control MQTT contienen un payload al final del mensaje.
Dependiendo del tamaño del encabezado variable, los mensajes pueden ser de hasta
256 MB de largo.
Ver tabla de mensajes con payload requerido en Anexo.
Comportamiento Operacional
Guardar estado
Conexión de red
Debido a su diseño, MQTT requiere funcionar en un sistema de transporte de capas
inferiores que garantice un stream de bytes ordenado y sin pérdidas, de cliente a servidor
y viceversa. Es por esto que la mayoría de las versiones del protocolo funciona con
TCP/IP, lo que proporciona los servicios de capa superior que necesita, con TLS y
Websocket como opciones alternativas. Por estándar, los registrados por IANA para
MQTT son los puertos 8883 para comunicación TLS y 1883 para otros.
El nivel cero: “At Most Once Delivery”, se basa en el best effort del protocolo TCP/IP sobre
el que se encuentra implementado; por lo tanto, no garantiza que el mensaje llegue al
servidor. Es por esto que se le denomina con el término Fire and Forget, puesto que la
entidad envía el mensaje y no espera respuesta al respecto.
El nivel uno, “At Least Once Delivery”, utiliza un sistema de reconocimiento para
garantizar la llegada de los mensajes. Todo mensaje con QoS igual a uno espera recibir un
acknowledge del receptor, por lo que se le conoce como Acknowledged Delivery. Con este
sistema es posible que el receptor reciba múltiples mensajes, debido a que el
acknowledge se pierda en el camino o demore demasiado en llegar a destino.
El máximo nivel de Quality of Service, “Exactly Once Delivery”, no solo garantiza que el
mensaje llegue a destino, sino que asegura que no existan duplicados. Esto solo es usado
para mensajes en los que resulta indeseado tener copias recibidas; consume una gran
cantidad de ancho de banda, ya que no utiliza una, sino cuatro comunicaciones diferentes
para enviar un solo mensaje, y tres de ellas funcionan como acknowledgement, para
garantizar la llegada de los paquetes. Por esto, a este tipo de QoS se les denomina
“Assured Delivery”.
MQTT presenta la ventaja fundamental de ser mucho más ligero que XMPP, sin mencionar
que su formato publicación-suscripción es mucho más práctico para ciertos usos que la
comunicación directa que utiliza XMPP. Esto vuelve al MQTT el protocolo estrella para
comunicación M2M (machine-to-machine), aunque en otras situaciones el XMPP posee
algunas ventajas, como su escalabilidad y su capacidad de definir formato de mensajes.
Sin embargo, XMPP no es capaz de flexibilizar su QoS, cosa que MQTT puede hacer
fácilmente.
MQTT vs HTTP
Aunque HTTP ha sido el protocolo más usado para conexiones de red, se ve opacado
cuando se compara con el MQTT en IoT. El protocolo HTTP es extremadamente verboso
y denso, no siendo muy efectivo al trabajar con dispositivos de pocos recursos, sin
mencionar que el patrón request-response para interacciones entre cliente y servidor del
HTTP no se encuentra optimizado para tecnología móvil que es parte de la base de IoT
moderno.
Con respecto a velocidad, de acuerdo con medidas realizadas en redes 3G, el protocolo
MQTT es hasta noventa y tres veces más rápido que el HTTP, debido a sus pequeños
encabezados. Además, el MQTT ofrece varios niveles de Quality of Service y la capacidad
de retener mensajes luego de enviarlos, cualidades que el HTTP carece.
CONNECT Requerido
CONNACK Ninguno
PUBLISH Opcional
PUBACK Ninguno
PUBREC Ninguno
PUBREL Ninguno
PUBCOMP Ninguno
SUBSCRIBE Requerido
SUBACK Requerido
UNSUBSCRIBE Requerido
UNSUBACK Ninguno
PINGREQ Ninguno
PINGRESP Ninguno
DISCONNECT Ninguno
CONNECT Reserved 0 0 0 0
CONNACK Reserved 0 0 0 0
PUBACK Reserved 0 0 0 0
PUBREC Reserved 0 0 0 0
PUBREL Reserved 0 0 1 0
PUBCOMP Reserved 0 0 0 0
SUBSCRIBE Reserved 0 0 1 0
SUBACK Reserved 0 0 0 0
UNSUBSCRIBE Reserved 0 0 1 0
UNSUBACK Reserved 0 0 0 0
PINGREQ Reserved 0 0 0 0
PINGRESP Reserved 0 0 0 0
DISCONNECT Reserved 0 0 0 0