Introducción

Eclipse Mosquitto es un broker de mensajes de código abierto y tan liviano que se puede ejecutar sin problemas en una Raspberry Pi.

Mosquitto implementa el protocolo de mensajería simple MQTT (Message Queuing Telemetry Transport) diseñado para dispositivos limitados y con poco ancho de banda (p.ej. dispositivos IoT).

La comunicación MQTT funciona como un sistema de publicación y suscripción. Los dispositivos (p.ej. un sensor de temperatura) publican mensajes sobre un tema específico. Estos mensajes son recibidos por el broker MQTT, que se encarga de filtrarlos, decidir quién está interesado en ellos y luego publicarlos para todos los clientes suscritos a ese tema.

MQTT Broker (c) Cedalo

Instalación

La instalación en Docker se realiza usando la imagen eclipse-mosquitto.

La forma más sencilla es usar un fichero docker-compose.yml con el siguiente contenido:

version: "3"
services:
  mosquitto:
    image: eclipse-mosquitto:latest
    container_name: mosquitto
    environment:
      - TZ=Europe/Madrid    
    volumes:
      - /home/pi/volumes/mosquitto/config:/mosquitto/config
      - /home/pi/volumes/mosquitto/data:/mosquitto/data
      - /home/pi/volumes/mosquitto/log:/mosquitto/log
    ports:
      - 1883:1883
      - 9001:9001
    restart: unless-stopped

Se puede usar docker-compose up -d o usar el contenido del fichero en Portainer.

Nota: Antes de ponerlo en marcha es necesario crear un fichero de configuración conf/mosquitto.conf con el siguiente contenido:

persistence true
persistence_location /mosquitto/data/
log_dest file /mosquitto/log/mosquitto.log
listener 1883
socket_domain ipv4
# Mosquitto >= 2.0 únicamente permite conexiones autenticadas mediante usuario/contraseña
# Permitimos temporalmente las conexiones anónimas para probar el entorno
allow_anonymous true

A continuación, se puede usar el comando tail para ver si Mosquitto se ha iniciado correctamente:

pi@pi4nas: $ sudo tail -f /home/pi/volumes/mosquitto/log/mosquitto.log
1677440889: mosquitto version 2.0.15 starting
1677440889: Config loaded from /mosquitto/config/mosquitto.conf.
1677440889: Opening ipv4 listen socket on port 1883.
1677440889: mosquitto version 2.0.15 running

Finalmente, para probar el envío y recepción de mensajes, se crea una suscripción a los mensajes de un tema determinado usando el comando mosquitto_sub:

# Suscripción al tema /test/message
docker exec -it mosquitto mosquitto_sub -v -t /test/message

Y, desde otro terminal, se envían mensajes usando el comando mosquitto_pub al tema /test/message:

# Envío de mensajes al tema /test/message
docker exec -it mosquitto mosquitto_pub -t /test/message -m 'Hello World!'
docker exec -it mosquitto mosquitto_pub -t /test/message -m 'Hello World again!'

Si todo funciona correctamente, los mensajes se mostrarán en el terminal donde se había creado la suscripción:

pi@pi4nas:~ $ docker exec -it mosquitto mosquitto_sub -v -t /test/message
/test/message Hello World!
/test/message Hello World again!

Configuración

Aunque durante las pruebas se ha utilizado conexiones anónimas, lo más recomendable es realizarlas de manera autenticada. Para ello es necesario crear un fichero de passwords conf/mosquitto.passwd usando el comando mosquitto_passwd:

pi@pi4nas: $ docker exec -it mosquitto mosquitto_passwd -c /mosquitto/config/mosquitto.passwd admin
Password: ********
Reenter password: ********

El contenido del fichero debería ser similar al siguiente, una entrada para el usuario admin seguida por : y el hash sha512-pbkdf2 de la contraseña introducida:

pi@pi4nas:~ $ cat /home/pi/volumes/mosquitto/config/mosquitto.passwd
admin:$6$utCGq9HKlEIB2HWO$Q77ea1FcXR9b1XoGU/iWQ1Yf9ptVZOgjW/gIxM/YECHdDECZrt0GONub3JtlkC0IGqFrZg4JemcqHzjc1QakQg==

A continuación se deberá modificar el fichero de configuración y reiniciar el docker:

allow_anonymous false
password_file /mosquitto/config/mosquitto.passwd

Si se intenta realizar la misma prueba de suscripción/envío realizada anteriormente debería fallar:

pi@pi4nas:~ $ docker exec -it mosquitto mosquitto_sub -v -t /test/message
Connection error: Connection Refused: not authorised.

Para que todo vuelva a funcionar correctamente se deberá especificar el usuario y contraseña:

# Suscripción
docker exec -it mosquitto mosquitto_sub -u admin --pw password -v -t /test/message
# Envío
docker exec -it mosquitto mosquitto_pub -u admin --pw password -t /test/message -m 'Hello World!'

Y los logs deberían mostrar la información de conexión:

# Conexión del suscriptor (se mantiene escuchando)
1677522832: New connection from 127.0.0.1:42796 on port 1883.
1677522832: New client connected from 127.0.0.1:42796 as auto-CF9D1353-ACA4-247E-AEE2-200CC336F081 (p2, c1, k60, u'admin').

# Conexión del publicador (envía y desconecta)
1677522863: New connection from 127.0.0.1:42876 on port 1883.
1677522863: New client connected from 127.0.0.1:42876 as auto-C9E3C15F-94B6-BE9E-6AE0-9B99CBC27580 (p2, c1, k60, u'admin').
1677522863: Client auto-C9E3C15F-94B6-BE9E-6AE0-9B99CBC27580 disconnected.

Integración con Home Assistant

La integración con Home Assistant es muy sencilla:

  • Acceder a Settings
  • Acceder a Device and Services
  • Pulsar en el botón ADD INTEGRATION
  • Buscar la integración MQTT y añadirla
  • En el wizard de configuración se introduce la siguiente información:
    • Broker: 127.0.0.1
    • Port: 1883
    • Username: admin
    • Password: ********
  • Pulsar en SUBMIT

A continuación se puede realizar la misma prueba de suscripción a un topic desde la configuración de la integración:

  • Configure MQTT
  • Listen to a topic: /test/message
  • Pulsar en START LISTENING

A continuación, se envía un mensaje usando el comando mosquitto_pub y, si todo funciona correctamente, se debería recibir el mensaje en Home Assistant:

Test de integración en HA

Nota: También se puede probar el envío desde el propio HA mediante la opción Publish a packet, indicando el topic y el payload (mensaje) y pulsando en PUBLISH.

Actualizar

Si ya se había instalado Mosquitto, se puede actualizar de la siguiente manera:

docker stop mosquitto
docker rm mosquitto
docker rmi eclipse-mosquitto
docker-compose up -d

Soporte

Algunos comandos para gestionar la configuración del contenedor:

# Acceder al shell mientras el contenedor está ejecutándose
docker exec -it mosquitto /bin/sh

# Monitorizar los logs del contenedor en tiempo real
docker exec -it mosquitto tail -f /mosquitto/log/mosquitto.log

Referencias

Herramientas

  • MQTT Explorer, cliente que proporciona una visión gráfica estructurada de los temas (topics) de MQTT

MQTT Explorer