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

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

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.

El Servidor

Usaremos el servidor Eclipse  Mosquitto, el cual es un servidor de código abierto.
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

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

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.

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

ESPURNA

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

Espurna MQTT

ESPEasy

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

ESPEasy MQTT

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. Podemos enlazarlo con Node-Red , un cliente Android, o directamente desde una shell en linux.