MQTT (Message Queue Telemetry Transport) es un protocolo de mensajería abierto para la comunicación máquina a máquina (M2M), que permite la transmisión de datos de telemetría en forma de mensajes entre dispositivos, a pesar de altas demoras o redes con recursos limitados. Los dispositivos correspondientes abarcan desde sensores y actuadores, teléfonos móviles, sistemas embebidos en vehículos o portátiles hasta ordenadores completamente desarrollados. [Wikipedia]

La información que se presenta a continuación sobre la especificación proviene, entre otros, de la especificación MQTT actual de IBM.

OSI Dentro del modelo OSI, MQTT se ubica de la siguiente manera: La especificación MQTT distingue entre redes basadas en TCP/IP y redes no TCP/IP. De forma predeterminada, MQTT utiliza el protocolo/conexión TCP (puerto 1883 y 8883 para una conexión SSL). En MQTT-SN (MQTT for Sensor Networks) se utiliza el protocolo UDP en lugar de TCP.

MQTT Paket Struktur El ‘fixed header’ siempre está presente, mientras que el ‘variable header’ y el ‘payload’ no siempre aparecen.

Fixed header El encabezado ‘fixed’ de un mensaje MQTT tiene una longitud de dos bytes y se divide de la siguiente manera:

Listado de ‘Message Types’ - byte 1, bits 7-4: Para una descripción detallada, remito a la especificación, capítulo 3.

Listado de byte 1, bits 3-1:

RETAIN Cuando un suscriptor se registra a un topic, solo recibe los datos cuando el publicador proporciona nuevos datos. Si los datos, p. ej., se transmiten una vez al día, el suscriptor tendrá que esperar hasta que llegue el nuevo registro. Para contrarrestar esta situación, el publicador puede asegurarse de que los nuevos suscriptores reciban el último registro (aunque esté desactualizado). Para ello, el flag RETAIN debe establecerse en 1.

Quality of Service (QoS) QoS o calidad de servicio designa la calidad de un servicio de comunicación desde la perspectiva de los usuarios. Es decir, qué tan bien la calidad del servicio cumple con sus requisitos. Formalmente, QoS es un conjunto de requisitos de calidad para el comportamiento conjunto o la interacción de varios objetos.

Estándar IEEE 802.1p

  • Un usuario desea conectarse de manera confiable al destino deseado y desconectarse de forma confiable al finalizar la comunicación.
  • La conexión debe establecerse rápidamente.
  • Los problemas al establecer la conexión (p. ej., destino no accesible) deben notificarse al usuario lo antes posible.
  • La conexión de comunicación debe mantenerse estable.
  • Los participantes de la comunicación quieren entenderse entre sí.
  • La información debe transmitirse completa y sin errores.
  • No debe transmitirse información de otros participantes ni interferencias.
  • La comunicación debe desarrollarse lo más fielmente posible al original.
  • No debe haber tiempos de espera prolongados durante la comunicación. La facturación de la comunicación debe corresponder con la duración de tiempo y el volumen de datos correctos. [Wikipedia]

En el contexto de MQTT se distinguen los siguientes tres niveles de QoS:

A continuación, la representación de las variantes de QoS como diagrama de secuencia para una mejor comprensión:

Duplicate delivery (DUP) Este flag siempre se establece cuando el cliente o el servidor desean reenviar los siguientes comandos:

  • PUBLISH
  • PUBREL
  • SUBSCRIBE
  • UNSUBSCRIBE

DUP puede establecerse con QoS > 0.

Variable header Además del fixed header, los mensajes MQTT pueden incluir un encabezado variable.

Message identifiers

El encabezado variable de los siguientes ‘Message Types’ se describe mediante ‘Message identifiers’:

  • PUBLISH
  • PUBACK
  • PUBREC
  • PUBREL
  • PUBCOMP
  • SUBSCRIBE
  • SUBACK
  • UNSUBSCRIBE
  • UNSUBACK

Payload Los siguientes comandos MQTT tienen un ‘payload’: