MQTT Mosquitto el servidor para IOT

MQTT (Message Queuing Telemetry Transport)  es el principal protocolo de comunicación en dispositivos de Internet de las Cosas (IOT). Fue diseñado por IBM a finales de los 90.

El protocolo MQTT

El protocolo MQTT fue un protocolo asíncrono basado en la pila TCP/IP diseñado por IBM en los 90 para unir sensores de oleoductos.  El diseño del protocolo fue para requerir la menor cantidad de datos necesarios, ya que se basaban en conexiones remotas o con poca capacidad.

A finales de 2014 fue liberado oficialmente convirtiéndose en un patrón de código abierto OASIS y empezó a ser soportado por los lenguajes de programación.

La estructura de Datos

El funcionamiento es mediante sistema de publicación y suscripción. Por lo que cada dispositivo tendrá un Topic. Ese topic es parte de una estructura jerárquica que permitirá suscribirse a un topic y recibir la información de todo lo que tenga ese Topic. Esta es una estructura de ejemplo:

MQTT Topic Alferez
MQTT Topic

En esta estructura jerarquica, si nos suscribimos a Alferez/Salon/Luz recibiremos todos los eventos relativos a relay que en este caso tiene 2. Además podemos usar el comodín ‘+’ para agrupar un nivel del ejemplo Alferez/+/Luz. También podemos usar ‘#’ para subir varios niveles para Alferez/#/relay.

MQTT Broker

El MQTT Broker es ese punto de unión entre todos los dispositivos que están conectados. Por decirlo de alguna forma es el lugar donde los dispositivos IOT vuelcan datos y preguntan datos de otros.

Eclipse Mosquitto

Eclipse Mosquitto es un MQTT Broker OpenSource o de código abierto ampliamente utilizado. Es el servidor donde llegan todas esas peticiones de los MQTT Clients. Es un servidor, que como hemos visto anteriormente utiliza muy pocos recursos. Gracias a este uso de recursos es muy extendido.

Usaremos un docker para montarlo con la imagen oficial. Para obtenerla ejecutaremos:

docker pull eclipse-mosquitto

Configuración

Crearemos la siguiente  estructura de directorios:

  • config
  • data
  • log

dentro de config crearemos dos ficheros:

mosquitto.conf

persistence true
persistence_location /mosquitto/data/
log_dest file /mosquitto/log/mosquitto.log
allow_anonymous false
password_file /mosquitto/config/users.txt

Con esto configuraremos que almacene los datos en la ruta /mosquitto/data. Que no permita anónimos y que use el fichero de contraseña users.txt

users.txt

La generación del fichero de password la debemos realizar con el mismo docker

docker run --rm -ti -v /RUTA_DIR/config:/mosquitto/config eclipse-mosquitto mosquitto_passwd -c /mosquitto/config/users.txt USUARIO

Si queremos añadir más usuarios:

docker run --rm -ti -v /RUTA_DIR/config:/mosquitto/config eclipse-mosquitto mosquitto_passwd -b /mosquitto/config/users.txt USUARIO PASSWORD

Inicio del servidor Mosquitto MQTT

Con la configuración del servidor y los usuarios, ya sólo nos queda arrancarlo. Para hacerlo tendremos que pasarle las rutas para que nos guarde los ficheros para un futuro:

docker run -d \
--restart=always \
--name=MQTT \
-p 1883:1883 \
-p 9001:9001 \
-v /RUTA_DIR/config:/mosquitto/config/ \
-v /RUTA_DIR/data:/mosquitto/data/ \
-v /RUTA_DIR/log:/mosquitto/log/ \
eclipse-mosquitto

Con esto ya tenemos nuestro servidor funcionando, pero necesitamos echarle datos para ver que todo funciona correctamente y demostrar que de verdad puede ser el core de nuestra central domótica o del IOT de nuestra casa.

Conexión de Dispositivos (MQTT Client)

Como ya vimos hay software alternativos como Tasmota/Espurna/Espeasy , cada usuario puede usar el que más fácil le sea, mejor resultado le de o directamente programarse su propio dispositivo con soporte para MQTT.

Para conectar cualquier dispositivo, necesitamos la IP, Puerto (por efecto 1883), usuarios y password y el Topic que queremos.

Configurar cliente MQTT en Tasmota

La conexión de dispositivos con Tasmota va por dos partes, una activar la conexión MQTT en la configuración general:

mqtt tasmota

Y luego configurara sus datos de conexión:

MQTT Tasmota

Configuración de ESPURNA como cliente MQTT

En Espurna hay un apartado sólo para la configuración de MQTT:

Espurna MQTT

Configurar MQTT en ESPEasy

Al igual que el firmware alternativo Tasmota, tiene un apartado sólo para MQTT:

ESPEasy MQTT

MQTT Arduino

Arduino también puede ser conectado sin mayor problema con nuestro servidor. Hay que tener en cuenta que deberíamos programarnos lo que deseamos, no como en los casos anteriores que ya hemos visto que es sólo configurar parámetros. Para ello en GitHub tiene la librería necesaria.

Datos de configuración del dispositivo

En todos hay datos comunes de configuración:

  • Usuario
  • Contraseña
  • Servidor MQTT
  • Puerto
  • Topic

Los datos son los que hemos configurado antes en el servidor excepto el Topic que como hemos visto en la estructura de datos, le daremos el que nos interese hacer la publicación.

Uso de MQTT en producción

Una vez que tenemos el servidor funcionando y los dispositivos volcando datos las posibilidades son infinitas. Podemos empezar a usarlo para obtener información del estado o para activarlo desde otros dispositivos.

El como sacarle el partido, está en cada uno, pero teniendo todos los estados y opciones de actuar en un único core, luego podemos ponerle una capa por encima que nor permita usarlo de forma más amigable. Más adelante, realizaré un post para ver como enlazar MQTT con Node Red o con Home Assistant.

MQTT Raspberry

Para ejecutar el servidor Mosquitto en Raspberry, puedes seguir los mismos pasos descritos arriba, ya que Eclipse dispone de una imagen para ARM, por lo que sólo tienes que seguir los mismos pasos.