Resumen de MQTT [Fuente: Wikipedia]

MQTT (Message Queuing 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, p.ej. sensores.
La Internet Assigned Numbers Authority (IANA) reserva para MQTT los puertos 1883 y 8883. Los mensajes MQTT se pueden cifrar con el protocolo TLS.
La especificación MQTT distingue entre redes basadas en TCP/IP y no TCP/IP.
MQTT es un protocolo cliente-servidor. Los clientes envían al servidor (“Broker”) tras establecer la conexión mensajes con un topic, que clasifica el mensaje jerárquicamente; por ejemplo Cocina/Nevera/Temperatura o Coche/Rueda/3/Presión. Los clientes pueden suscribir estos topics, y el servidor reenvía los mensajes recibidos a los suscriptores correspondientes.

Es interesante que un servidor MQTT (“Broker”) conserva todo el estado de sus socios de comunicación y puede usarse como base de datos de estado. De este modo es posible conectar pequeños dispositivos MQTT con bajo rendimiento a un broker MQTT, donde los dispositivos recopilan datos y/o reciben comandos, mientras que una visión de conjunto más compleja se crea únicamente en el broker MQTT y desde allí o mediante un socio de comunicación con mayor capacidad se puede evaluar.

Los mensajes siempre consisten en un topic y un contenido de mensaje. Se envían con una calidad de servicio (Quality of Service) configurable:

  • a lo sumo una vez: el mensaje se envía una vez y puede no llegar si se interrumpe la conexión
  • al menos una vez: el mensaje se envía hasta que se confirme la recepción y puede llegar varias veces al receptor
  • exactamente una vez: se garantiza que el mensaje llegue exactamente una vez incluso si se interrumpe la conexión

Además, con el Retain-Flag se puede indicar al servidor que almacene temporalmente el mensaje para ese topic.

Al establecer la conexión, los clientes pueden definir un “último deseo” en forma de mensaje. Si se pierde la conexión con el cliente, este mensaje se publica y se envía a los suscriptores correspondientes.

MQTT se usa habitualmente sobre TCP y tiene una cabecera de 2 bytes. El primer byte contiene el tipo de mensaje (4 bits), el Quality of Service (2 bits) y un Retain-Flag. El segundo byte contiene la longitud del resto del paquete MQTT. A continuación viene una parte variable que contiene el topic MQTT, es decir, el tema. Finalmente aparece la carga útil (payload), es decir, el contenido de datos que se publica bajo el tema.

Existen los siguientes tipos de mensaje:

  • CONNECT
  • CONNACK
  • PUBLISH
  • PUBACK
  • PUBREC
  • PUBREL
  • PUBCOMP
  • SUBSCRIBE
  • SUBACK
  • UNSUBSCRIBE
  • UNSUBACK
  • PINGREQ
  • PINGRESP
  • DISCONNECT

Los tipos de mensaje en negrita se encuentran de nuevo en la comunicación siguiente:

Los topics pueden incluir comodines:

  • Comodín de un solo nivel (+): Casa/+/Nevera/Temperatura
  • Comodín multinivel al final (#): Cocina/Nevera/#

Instalación de MQTTBox

MQTTBox es un cliente MQTT que nos da, entre otras cosas, la posibilidad de crear nuevos topics y/o suscribir topics existentes.

Configuración de MQTTBox para la comunicación con la plataforma Cumulocity (C8Y) IoT:

A partir de la ID de cliente MQTT se pueden asignar futuras solicitudes a un dispositivo existente con la ID mencionada arriba. Me adelanto un poco y muestro dónde se encuentra esta ID después de crear un dispositivo:

A continuación se puede establecer una conexión con C8Y.

Creación de dispositivo dentro de la plataforma C8Y IoT vía MQTT

Un dispositivo se puede crear con la ayuda de una plantilla MQTT de C8Y predefinida con el número de plantilla ‘100’.

100, deviceName, deviceType

Existe la posibilidad de indicar más plantillas dentro de la carga útil en una nueva línea. Por ejemplo, con la plantilla 110 se pueden indicar los siguientes atributos: serialNumber, model, revision

Lista de IDs de plantilla

Una descripción detallada de las plantillas y sus parámetros se encuentra en la siguiente URL.

100Creación de dispositivo
101Creación de dispositivo secundario
105Obtener dispositivos secundarios
106Obtener hijos de un dispositivo
110Configurar hardware
111Configurar móvil
112Configurar posición
113Establecer configuración
114Establecer operaciones soportadas
115Establecer firmware
116Establecer lista de software
117Establecer disponibilidad requerida
200Crear medición personalizada
210Crear medición de intensidad de señal
211Crear medición de temperatura
212Crear medición de batería
301Crear alarma CRÍTICA
302Crear alarma MAYOR
303Crear alarma MENOR
304Crear alarma ADVERTENCIA
305Actualizar la severidad de una alarma existente
306Eliminar alarma existente
400Crear evento básico
401Crear evento de actualización de ubicación
402Crear evento de actualización de ubicación con actualización de dispositivo
500Obtener operaciones PENDIENTES
501Establecer operación a EJECUTANDO
502Establecer operación a FALLIDA
503Establecer operación a EXITOSA
510Reiniciar
511Comando
513Configuración
515Firmware
516Lista de software
517Operación de solicitud de medición
518Relé
519Arreglo de relés
520Subir archivo de configuración
521Descargar archivo de configuración
522Solicitud de registro
523Modo de comunicación

La siguiente imagen muestra la creación de un dispositivo MQTT:

El dispositivo se muestra posteriormente dentro de ‘Gestión de dispositivos’:

Como se puede apreciar arriba en los IDs de plantilla, con el ID 100 se creó un nuevo dispositivo. Con el ID 117 se estableció el ‘intervalo de respuesta’ y el ID 212 representa el estado de carga de la batería. El 97 indica 97%. Introduciendo, por ejemplo, 212,95 & 212,85 & 212,65 & 212,57 podemos simular una descarga de batería.
He suscrito previamente al topic ’s/e’ para leer el estado de la batería.

Dentro de la plataforma, la descarga de la batería se ve así: