MQTT | Parte 1

Introducción al protocolo MQTT

Roberto Lodeiro

Esta primera entrada sobre MQTT, pretende ser una forma sencilla de entender los conceptos básicos. Explicaré en que consiste y como podemos usarlo, pero sin entrar en demasiados tecnicismos (para eso ya vendrán entradas posteriores).

Si usas Telegram u otra aplicación de mensajería actual o has usado IRC antaño, ¡será muy fácil que lo entiendas!.


MQTT(Message Queuing Telemetry Transport), es un protocolo de comunicación muy utilizado en el Iot(Internet of Things). En un supuesto muy básico, donde queremos comunicar dos dispositivos, uno emitiría un mensaje y otro tendría que recibirlo, ¡pues de eso se encarga MQTT!.

Llevando el supuesto anterior a un entorno cotidiano, tú serás el dispositivo2 que va a recibir el mensaje (por Telegram), y tu amigo (el pesado que siempre escribe en los grupos) el dispositivo1 que emite el mensaje. No quiere decir que Telegram utilice MQTT, pero supongamos que si para explicarlo.

Mensaje - Emisor & Receptor

Pongamos dos casos:

  • Caso 1:

    Conversación privada entre tú y un amigo

En este primer caso, nuestro querido amigo (dispositivo1) nos envía un mensaje para contarnos que tal le ha ido el día, este pasa por el servidor de Telegram y nos llega a nosotros (dispositivo2). Perfecto!

  • Caso 2:

    Conversación en grupo con más amigos

Aquí nuevamente nuestro queridísimo amigo (dispositivo1) envía un mensaje, pero esta vez al grupo que tenemos creado para las Parties. El mensaje en esta ocasión llega a todas las personas que están en el grupo (dispositivos 2, 3 y 4). Perfecto again!

Broker VS Topics

Obviamente estos dos ejemplo anteriores, serían así en un mundo idílico, pero en la realidad no podemos tener un servidor o broker para cada conversación.

Siguiendo en el contexto imaginario donde Telegram usase MQTT, lo que ocurriría sería algo similar a esto:

El amigo (dispositivo1) envía dos mensajes, uno privado para ti, y otro al grupo. Ambos llegan al mismo servidor, y aquí es donde viene la magia. ¿Como sabe el servidor para quien es cada mensaje? simplemente no lo sabe.

Cada mensaje va destinado a un topic, en nuestro ejemplo topic1 y topic2. Tu (dispositivo2) estas suscrito al topic de la conversación privada y al del grupo, con lo cual ves ambos mensajes, pero los otros dos amigos (dispositivo 3 y 4) solo ven el mensaje publicado en el topic2.

Entorno real

Antes de que te asustes, explico el porque de las flechas en ambas direcciones. Un cliente (dispositivo) puede tanto enviar como recibir mensajes a diferentes topics. Antes no era así por no complicar los ejemplos, y porque nadie le contesta al amigo pesado.

Este es el entorno real que vamos a suponer:

Tenemos tres clientes conectados al Broker. El primero, la Raspberry Pi, es el encargado de controlar todas las luces. Los otros dos, en este caso dos Arduino, encenderán o apagarán la luz que controlan según el mensaje ON/OFF recibido.

El mensaje puede ser el que queramos, desde un simple ON/OFF como en el ejemplo, hasta un JSON o similar.

Los topics, simplemente son rutas donde publicamos y/o recibimos mensajes. Estas también son definidas a nuestro antojo, pero es buena idea seguir un patrón ordenado. En el ejemplo solo hay luces, pero suponiendo que en ambas habitaciones tengamos además un enchufe, su topic podría ser algo como enchufes/dormitorio/cmd, en el caso del dormitorio.

El motivo por el cual he creado un topic terminado en /cmd y otro en /stat para cada dispositivo, es simplemente para poder tando enviar ordenes como recibir su estado. Esto puede ser útil, entre otras razones, si el Arduino en cuestión tiene un botón físico y apagamos en el la luz. De este forma la Raspberry Pi conozcerá su nuevo estado.

Podemos resumirlo en algo como esto:

#### Broker MQTT ####
Servidor que gestiona las comunicaciones

#### Clientes ####
Dispositivos que se conectan al broker para enviar y/o recibir mensajes
En nuestro ejemplo:
Raspberry Pi - Controla todas las luces
Arduino salon - Enciende/apaga las luces del salón
Arduino dormitorio - Enciende/apaga las luces del dormitorio

#### Topics ####
"Lugares" o "salas" donde los dispositivos pueden enviar y/o recibir mensajes
En nuestro ejemplo:
luces/dormitorio/cmd/ - Para enviarle ordenes al Cliente3
luces/dormitorio/stat/ - Publica estado el Cliente3
luces/salon/cmd/ - Para enviarle ordenes al Cliente2
luces/salon/stat/ - Publica su estado el Cliente2

Todo esto se puede volver lo complejo que queramos, pero queda para otra entrada.


Espero que sea útil, ¡gracias por leerme!