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

