Desmitificando el Reinicio y la Configuración de MQTT con Mosquitto

MQTT, o Message Queuing Telemetry Transport, se ha consolidado como un protocolo de mensajería ligero y sumamente eficiente, encontrando su nicho principal en la comunicación entre dispositivos del Internet de las Cosas (IoT). Su diseño, basado en el modelo de publicación/suscripción, permite que dispositivos con recursos limitados, como microcontroladores, puedan intercambiar información de manera efectiva incluso en redes con ancho de banda restringido. En el ecosistema de la domótica, y particularmente en plataformas como Home Assistant, MQTT desempeña un papel crucial, actuando como el conducto para la integración de diversas automatizaciones. Un ejemplo paradigmático de su utilidad se observa al integrar sistemas de análisis de video como Frigate con Home Assistant. En este escenario, Frigate, al detectar un evento específico -por ejemplo, la presencia de una persona en un área determinada-, publica un mensaje al broker MQTT. Home Assistant, actuando como suscriptor, recibe este mensaje y puede desencadenar acciones subsiguientes, como el encendido de luces o el envío de notificaciones.

Diagrama de roles en MQTT: Publisher, Subscriber, Broker

Para comprender a fondo la arquitectura de MQTT y su implementación, es fundamental desglosar los roles que intervienen en este protocolo:

  • Publisher (Publicador): En el contexto de la integración Frigate-Home Assistant, Frigate asume el rol de publicador. Su función es monitorear las transmisiones de las cámaras IP y, al detectar un evento de interés, generar un mensaje que será enviado al broker MQTT.
  • Subscriber (Suscriptor): Home Assistant actúa como suscriptor. Se registra para recibir mensajes publicados en temas específicos. Una vez que recibe un mensaje, puede procesarlo para activar las automatizaciones configuradas.
  • Broker (Intermediario): Mosquitto, en este caso, funciona como el broker MQTT. Su labor es centralizar la comunicación, recibiendo mensajes de los publicadores y distribuyéndolos eficientemente a todos los suscriptores interesados en dichos temas. Es importante destacar que, en este modelo, Frigate y Home Assistant no se comunican directamente; su interacción se canaliza a través del broker Mosquitto.

La implementación de un broker MQTT como Mosquitto, especialmente en entornos Linux como Debian o sus derivados, puede realizarse de diversas maneras. Una aproximación moderna y eficiente es a través de contenedores Docker, gestionados con herramientas como Portainer. Esta metodología facilita la implementación, configuración y escalabilidad del servicio.

Instalación y Configuración de Mosquitto Broker

La instalación y configuración de un broker Mosquitto es un paso fundamental para establecer una infraestructura MQTT robusta. Si bien existen métodos directos en sistemas operativos, el uso de contenedores Docker, orquestados mediante Portainer, ofrece una capa adicional de aislamiento y facilidad de gestión.

Despliegue de Mosquitto mediante Portainer

Portainer proporciona una interfaz gráfica intuitiva para la gestión de contenedores Docker, simplificando el proceso de despliegue de servicios.

  1. Acceso a Stacks: Navega hasta la sección Stacks dentro de tu instancia de Portainer.

  2. Creación de Nuevo Stack: Haz clic en Agregar Stack para iniciar la creación de una nueva configuración.

  3. Nombre del Stack: Asigna un nombre descriptivo al stack, por ejemplo, mosquitto.

  4. Configuración del Docker Compose: En el Editor web, pega la siguiente configuración. Esta definición de docker-compose.yml especifica los parámetros para desplegar el broker Mosquitto en un contenedor.

    version: "3.8"services: # --- MQTT Broker (Eclipse Mosquitto) --- mosquitto: image: eclipse-mosquitto:2 container_name: mosquitto restart: unless-stopped volumes: - mosquitto_config:/mosquitto/config - mosquitto_data:/mosquitto/data - mosquitto_log:/mosquitto/log ports: - "1883:1883" # MQTT - "9001:9001" # WebSocketvolumes: mosquitto_config: mosquitto_data: mosquitto_log:
    • image: eclipse-mosquitto:2: Especifica la imagen Docker a utilizar, en este caso, la versión 2 del broker Mosquitto de Eclipse.
    • container_name: mosquitto: Asigna un nombre al contenedor para facilitar su identificación.
    • restart: unless-stopped: Configura el contenedor para que se reinicie automáticamente a menos que sea detenido manualmente.
    • volumes: Define volúmenes para persistir la configuración, los datos y los logs del broker fuera del ciclo de vida del contenedor. Esto es crucial para mantener la configuración y los datos incluso si el contenedor se elimina y se recrea.
    • ports: Mapea los puertos del host a los puertos del contenedor. El puerto 1883 es el estándar para MQTT, y el 9001 es comúnmente utilizado para la comunicación WebSocket, que puede ser útil para clientes web.
  5. Despliegue del Stack: Una vez pegada la configuración, haz clic en el botón Desplegar la pila para que Portainer cree y ejecute el contenedor de Mosquitto.

Configuración de Mosquitto y Autenticación

Tras el despliegue inicial, es esencial configurar el broker Mosquitto para asegurar su funcionamiento óptimo y, lo que es más importante, para implementar medidas de seguridad.

  1. Acceso a la Consola del Contenedor:

    • Dirígete a la página Contenedores en Portainer.
    • Busca el contenedor llamado mosquitto.
    • Haz clic en el contenedor para acceder a su página de detalles.
    • Selecciona la pestaña Consola.
    • En el campo Comando, ingresa /bin/sh y haz clic en Conectar. Esto te abrirá una interfaz de línea de comandos dentro del contenedor.
  2. Creación del Archivo de Contraseñas:

    • Dentro de la consola del contenedor, ejecuta el siguiente comando para crear un archivo de contraseñas y añadir un usuario.

      mosquitto_passwd -c -b /mosquitto/config/passwd <usuario> <contraseña>
      • Reemplaza <usuario> con el nombre de usuario deseado y <contraseña> con la contraseña correspondiente. Se recomienda utilizar combinaciones de letras y números, evitando caracteres especiales que puedan causar conflictos.
      • El flag -c crea un nuevo archivo de contraseñas. Si el archivo ya existe, este comando lo sobrescribirá.
      • El flag -b permite especificar el nombre de usuario y la contraseña directamente en la línea de comandos.
    • Para verificar que el archivo de contraseñas se ha creado correctamente, ejecuta ls /mosquitto/config y asegúrate de que passwd aparece en la lista junto con mosquitto.conf.

  3. Edición del Archivo de Configuración de Mosquitto:

    • En la misma consola del contenedor, edita el archivo de configuración principal de Mosquitto:

      vi /mosquitto/config/mosquitto.conf
    • Presiona la tecla i para entrar en modo de inserción del editor vi.

    • Agrega las siguientes líneas al archivo. Estas directivas deshabilitan el acceso anónimo y especifican la ubicación del archivo de contraseñas que acabamos de crear.

      allow_anonymous falsepassword_file /mosquitto/config/passwdlistener 1883 0.0.0.0socket_domain ipv4
      • allow_anonymous false: Esta línea es crucial para deshabilitar el acceso no autenticado al broker, forzando a los clientes a proporcionar credenciales válidas.
      • password_file /mosquitto/config/passwd: Indica a Mosquitto dónde encontrar el archivo que contiene los nombres de usuario y sus contraseñas.
      • listener 1883 0.0.0.0: Configura el broker para que escuche en el puerto 1883 en todas las interfaces de red disponibles (0.0.0.0), permitiendo conexiones desde cualquier cliente en la red.
      • socket_domain ipv4: Asegura que el listener utilice el protocolo IPv4.
    • Una vez que hayas añadido las líneas, presiona la tecla Esc para salir del modo de inserción. Luego, escribe :wq y presiona Enter para guardar los cambios y salir del editor vi. Si deseas descartar los cambios, puedes escribir :q! y presionar Enter.

  4. Reiniciar el Contenedor Mosquitto:

    • Para que los cambios en la configuración surtan efecto, es necesario reiniciar el contenedor.
    • Regresa a la página Contenedores en Portainer.
    • Localiza el contenedor mosquitto.
    • Haz clic en el botón Reiniciar asociado al contenedor.

🖥️Explicado con gracia!, Instalar Mosquitto Broker para MQTT. Curso Completo Home Assistant: 🚀CAP. 6

Configuración de la Integración MQTT en Home Assistant

Una vez que el broker Mosquitto está operativo y configurado con autenticación, el siguiente paso es integrarlo con Home Assistant para que pueda comunicarse con otros dispositivos y servicios.

  1. Agregar Integración MQTT:

    • Dentro de Home Assistant, navega a Configuración > Dispositivos y Servicios.
    • Haz clic en el botón Agregar Integración.
  2. Seleccionar Integración MQTT:

    • En el cuadro de búsqueda, escribe MQTT y selecciona la integración correspondiente.
  3. Configurar los Detalles del Broker:

    • Aparecerá un cuadro de diálogo emergente. Aquí deberás introducir la información de conexión a tu broker Mosquitto:

      • Broker: Introduce localhost si Home Assistant y el broker Mosquitto se ejecutan en el mismo servidor (o dentro del mismo Docker network), o la dirección IP de la máquina donde está desplegado el broker Mosquitto si están en hosts diferentes.
      • Puerto: Ingresa 1883 (el puerto estándar de MQTT).
      • Nombre de usuario: Proporciona el nombre de usuario que configuraste al crear el archivo de contraseñas para Mosquitto.
      • Contraseña: Ingresa la contraseña correspondiente al nombre de usuario configurado.
    • Una vez completados los campos, haz clic en Enviar o Conectar para establecer la conexión. Si la configuración es correcta, Home Assistant se conectará al broker Mosquitto y estará listo para enviar y recibir mensajes.

MQTT en la Práctica: Un Ejemplo con Frigate y Home Assistant

La verdadera potencia de MQTT se manifiesta cuando se integra con otros servicios. Consideremos el ejemplo de Frigate, un sistema de detección de objetos basado en IA para cámaras de seguridad, y su integración con Home Assistant.

  • Frigate (Publisher): Cuando Frigate detecta un evento (por ejemplo, una persona entrando en una zona de interés), genera un mensaje MQTT. Este mensaje contendrá información detallada sobre el evento, como el tipo de objeto detectado, la marca de tiempo y la cámara donde ocurrió. Frigate publica este mensaje en un tema específico, por ejemplo, frigate/events.

  • Home Assistant (Subscriber): Home Assistant, configurado con la integración MQTT, se suscribe al tema frigate/events. Al recibir un mensaje en este tema, Home Assistant puede procesar la información y desencadenar una serie de automatizaciones.

    Por ejemplo, una automatización podría ser configurada para:

    1. Si el evento detectado es de tipo persona y ocurre durante la noche, encender las luces exteriores.
    2. Enviar una notificación al teléfono del usuario con una instantánea del evento.
    3. Registrar el evento en un historial más detallado.

Diagrama de flujo de comunicación entre Frigate, Mosquitto Broker y Home Assistant

Este flujo de comunicación, mediado por el broker Mosquitto, permite una integración fluida y desacoplada entre diferentes sistemas, abriendo un abanico de posibilidades para la automatización del hogar y la monitorización inteligente.

Consideraciones Adicionales y Mejores Prácticas

La implementación de MQTT y Mosquitto, si bien es relativamente sencilla, se beneficia de la consideración de ciertos aspectos para asegurar un funcionamiento robusto y seguro.

Uso de Certificados TLS/SSL para Conexiones Seguras

Para entornos donde la seguridad es primordial, especialmente si el broker MQTT es accesible desde redes externas o si se manejan datos sensibles, es altamente recomendable configurar Mosquitto para utilizar conexiones cifradas mediante TLS/SSL.

  1. Generación de Certificados: Se deben generar certificados autofirmados o utilizar certificados de una Autoridad Certificadora (CA) reconocida. Esto implica la creación de un archivo de clave privada (.key) y un archivo de certificado (.pem).

  2. Configuración en mosquitto.conf: En el archivo de configuración de Mosquitto (/etc/mosquitto/mosquitto.conf o dentro del contenedor), se deben añadir las siguientes directivas:

    # Configuración para TLS/SSL# Reemplaza con las rutas reales a tus archivos de certificadotls_certfile /mosquitto/config/server.crttls_keyfile /mosquitto/config/server.key# Opcional: si usas una CA intermedia o tu propio CA# tls_cafile /mosquitto/config/ca.crt# Escuchar en el puerto seguro (por defecto 8883)listener 8883# Opcional: Limitar el puerto 1883 a localhost si no quieres que sea accesible externamente# listener 1883 localhost
  3. Configuración del Cliente: Los clientes MQTT que deseen conectarse de forma segura deberán ser configurados para utilizar TLS y proporcionar la ruta a los certificados de cliente o CA necesarios, dependiendo del método de autenticación configurado.

Monitoreo del Broker Mosquitto

Mantener un ojo en el estado y rendimiento del broker Mosquitto es crucial para detectar y solucionar problemas de manera proactiva.

  • Logs de Mosquitto: Los logs del broker, que pueden ser redirigidos a un volumen persistente o a un sistema de recolección de logs centralizado, proporcionan información valiosa sobre las conexiones, desconexiones, errores y actividad general.
  • Temas de Sistema ($SYS): Mosquitto expone una serie de temas bajo el prefijo $SYS que proporcionan métricas en tiempo real sobre el estado del broker, como el número de clientes conectados, el número de mensajes publicados y suscritos, y el uso de memoria. Los clientes MQTT pueden suscribirse a estos temas para monitorear el broker. Por ejemplo, suscribirse a $SYS/# permitirá recibir información de todos los temas del sistema.

Consideraciones sobre la Red

  • Puertos Abiertos: Asegúrate de que los puertos necesarios para MQTT (generalmente 1883 para conexiones no cifradas y 8883 para conexiones cifradas) estén abiertos en el firewall de la máquina donde se ejecuta el broker y en cualquier dispositivo de red intermedio.
  • Firewall en el Contenedor: Si utilizas Docker, los puertos se mapean desde el host al contenedor. Asegúrate de que el firewall del host permita el tráfico hacia los puertos mapeados.

Cliente MQTT de Ejemplo

Para probar la conectividad y el funcionamiento del broker, es útil contar con herramientas cliente.

  • mosquitto-clients: En sistemas Linux, la instalación del paquete mosquitto-clients proporciona las utilidades mosquitto_pub (para publicar mensajes) y mosquitto_sub (para suscribirse a temas).

    • Publicar un mensaje:bashmosquitto_pub -h <ipBroker> -t "raspberry/topic1" -m "Hola desde la terminal!" -u <usuario> -P <contraseña>
    • Suscribirse a un tema:bashmosquitto_sub -h <ipBroker> -t "raspberry/topic1" -u <usuario> -P <contraseña>

    Donde <ipBroker> es la dirección IP de tu broker Mosquitto, y <usuario> y <contraseña> son tus credenciales.

  • MQTT Explorer: Es una herramienta gráfica popular para interactuar con brokers MQTT, permitiendo visualizar temas, publicar y suscribirse a mensajes de forma sencilla.

La implementación correcta de MQTT con Mosquitto sienta las bases para arquitecturas de IoT eficientes y escalables, permitiendo la comunicación fluida entre una vasta gama de dispositivos y aplicaciones.

tags: #como #reinciar #incio #de #mqtt