Instalación y configuración de Mosquitto en un servidor local

Instalación de Mosquitto broker, configuración básica, comandos de administración

Módulo 3 ⏱️ 2 horas 🛠️ ESP32 + DHT11 🌐 Flask + MQTT

Introducción

En esta lección aprenderemos a instalar y configurar Mosquitto, un broker MQTT ligero y eficiente que servirá como intermediario de comunicación en nuestro proyecto IoT. Mosquitto será el núcleo de comunicación entre nuestros dispositivos ESP32 con sensores DHT11 y nuestra aplicación web Flask.

MQTT (Message Queuing Telemetry Transport) es un protocolo de mensajería ligero diseñado para dispositivos IoT con recursos limitados y redes con poco ancho de banda. Mosquitto implementa este protocolo proporcionando un broker confiable para la comunicación publish/subscribe.

Objetivo de la lección: Al finalizar esta clase, podrás instalar, configurar y administrar un broker Mosquitto local, listo para recibir datos de sensores ESP32 y servirlos a aplicaciones web Flask.

Conceptos Fundamentales

Antes de proceder con la instalación, es fundamental comprender los conceptos clave del protocolo MQTT y el rol de Mosquitto:

¿Qué es MQTT?

  • Protocolo Publisher/Subscriber: Los clientes publican mensajes en tópicos específicos y se suscriben para recibir mensajes de tópicos de interés
  • Broker: Servidor central que recibe, filtra y distribuye mensajes entre clientes
  • Tópicos: Canales de comunicación organizados jerárquicamente (ej: /casa/salon/temperatura)
  • QoS (Quality of Service): Niveles de garantía de entrega (0, 1, 2)

Arquitectura de nuestro sistema:

  • ESP32 + DHT11: Actúa como cliente MQTT publisher, enviando datos de temperatura y humedad
  • Mosquitto Broker: Recibe y distribuye los mensajes de los sensores
  • Flask Application: Actúa como cliente MQTT subscriber, recibe datos y los presenta en una interfaz web

Ventajas de Mosquitto:

  • Ligero y eficiente en recursos
  • Soporte completo del estándar MQTT 3.1.1 y 5.0
  • Autenticación y autorización configurable
  • SSL/TLS para comunicaciones seguras
  • Persistencia de mensajes
  • Clustering para alta disponibilidad

Implementación Práctica

Paso 1: Instalación de Mosquitto

La instalación varía según el sistema operativo. A continuación se muestran los comandos para los sistemas más comunes:

Ubuntu/Debian:


# Actualizar repositorios
sudo apt update

# Instalar Mosquitto broker y clientes
sudo apt install mosquitto mosquitto-clients

# Habilitar el servicio para inicio automático
sudo systemctl enable mosquitto

# Iniciar el servicio
sudo systemctl start mosquitto

# Verificar el estado del servicio
sudo systemctl status mosquitto
            

CentOS/RHEL/Fedora:


# Instalar EPEL repository (CentOS/RHEL)
sudo yum install epel-release

# Instalar Mosquitto
sudo yum install mosquitto mosquitto-clients

# O en Fedora:
sudo dnf install mosquitto mosquitto-clients

# Habilitar e iniciar el servicio
sudo systemctl enable mosquitto
sudo systemctl start mosquitto
            

Windows (usando chocolatey):


# Instalar chocolatey si no está instalado
# Luego instalar Mosquitto
choco install mosquitto

# O descargar desde: https://mosquitto.org/download/
            

macOS (usando Homebrew):


# Instalar Mosquitto
brew install mosquitto

# Iniciar el servicio
brew services start mosquitto
            

Paso 2: Configuración Básica

El archivo de configuración principal se encuentra en /etc/mosquitto/mosquitto.conf (Linux) o en el directorio de instalación (Windows/macOS).

Configuración inicial (/etc/mosquitto/mosquitto.conf):


# Puerto por defecto para conexiones MQTT
port 1883

# Permitir conexiones anónimas (solo para desarrollo)
allow_anonymous true

# Archivo de log
log_dest file /var/log/mosquitto/mosquitto.log

# Nivel de log (error, warning, notice, information, debug)
log_type error
log_type warning
log_type notice
log_type information

# Persistencia de datos
persistence true
persistence_location /var/lib/mosquitto/

# Archivo PID
pid_file /var/run/mosquitto.pid

# Tiempo de keep alive por defecto
max_keepalive 65535

# Tamaño máximo de mensaje (bytes)
message_size_limit 268435456

# Tiempo máximo de espera para QoS 1 y 2
retry_interval 20

# Configuraciones de conexión
max_connections 1000
max_inflight_messages 500
            

Paso 3: Configuración de Seguridad

Para un entorno de producción, es importante configurar autenticación y autorización:

Crear archivo de usuarios:


# Crear archivo de contraseñas
sudo mosquitto_passwd -c /etc/mosquitto/passwd iot_user

# Agregar más usuarios
sudo mosquitto_passwd /etc/mosquitto/passwd flask_app
sudo mosquitto_passwd /etc/mosquitto/passwd esp32_device
            

Configuración con autenticación:


# Configuración segura en mosquitto.conf
port 1883

# Deshabilitar conexiones anónimas
allow_anonymous false

# Archivo de usuarios y contraseñas
password_file /etc/mosquitto/passwd

# Archivo de ACL (Access Control List)
acl_file /etc/mosquitto/acl

# Logs
log_dest file /var/log/mosquitto/mosquitto.log
log_type all

# Persistencia
persistence true
persistence_location /var/lib/mosquitto/
            

Archivo de ACL (/etc/mosquitto/acl):


# Permisos para el usuario ESP32
user esp32_device
topic write sensors/+/temperature
topic write sensors/+/humidity
topic read sensors/+/status

# Permisos para la aplicación Flask
user flask_app
topic read sensors/+/temperature
topic read sensors/+/humidity
topic write sensors/+/command

# Permisos para usuario administrativo
user iot_user
pattern readwrite #
            

Paso 4: Comandos de Administración

Mosquitto incluye herramientas de línea de comandos para testing y administración:

Comandos básicos de administración:


# Reiniciar el servicio después de cambios de configuración
sudo systemctl restart mosquitto

# Ver logs en tiempo real
sudo tail -f /var/log/mosquitto/mosquitto.log

# Verificar conexiones activas
sudo netstat -tlnp | grep :1883

# Probar conexión local
mosquitto_pub -h localhost -t test/topic -m "Hello MQTT"
mosquitto_sub -h localhost -t test/topic

# Probar con autenticación
mosquitto_pub -h localhost -t sensors/room1/temperature -m "22.5" -u iot_user -P password
mosquitto_sub -h localhost -t sensors/+/+ -u iot_user -P password
            

Paso 5: Testing del Broker

Es crucial verificar que el broker funciona correctamente antes de conectar dispositivos reales:

Script de testing en Python:


#!/usr/bin/env python3
import paho.mqtt.client as mqtt
import time
import json

# Configuración del broker
BROKER_HOST = "localhost"
BROKER_PORT = 1883
USERNAME = "iot_user"
PASSWORD = "password"

def on_connect(client, userdata, flags, rc):
    if rc == 0:
        print("✓ Conectado al broker MQTT")
        client.subscribe("sensors/+/+")
    else:
        print(f"✗ Error de conexión: {rc}")

def on_message(client, userdata, msg):
    topic = msg.topic
    message = msg.payload.decode()
    print(f"📨 Tópico: {topic}")
    print(f"📄 Mensaje: {message}")
    print("-" * 40)

def on_disconnect(client, userdata, rc):
    print("🔌 Desconectado del broker")

# Crear cliente MQTT
client = mqtt.Client(client_id="test_client")
client.username_pw_set(USERNAME, PASSWORD)

# Asignar callbacks
client.on_connect = on_connect
client.on_message = on_message
client.on_disconnect = on_disconnect

try:
    # Conectar al broker
    print("🔄 Conectando al broker...")
    client.connect(BROKER_HOST, BROKER_PORT, 60)
    
    # Iniciar loop en segundo plano
    client.loop_start()
    
    # Publicar mensajes de prueba
    for i in range(5):
        test_data = {
            "temperature": 20.0 + i,
            "humidity": 50.0 + i * 2,
            "timestamp": int(time.time())
        }
        
        client.publish("sensors/room1/temperature", json.dumps(test_data))
        print(f"📤 Publicado mensaje {i + 1}")
        time.sleep(2)
    
    # Mantener conexión por 10 segundos más
    time.sleep(10)
    
except KeyboardInterrupt:
    print("\n⏹️  Deteniendo cliente...")
finally:
    client.loop_stop()
    client.disconnect()
            

Salida Esperada del Script de Testing:

🔄 Conectando al broker...
✓ Conectado al broker MQTT
📤 Publicado mensaje 1
📨 Tópico: sensors/room1/temperature
📄 Mensaje: {"temperature": 20.0, "humidity": 50.0, "timestamp": 1699123456}
----------------------------------------
📤 Publicado mensaje 2
📨 Tópico: sensors/room1/temperature
📄 Mensaje: {"temperature": 21.0, "humidity": 52.0, "timestamp": 1699123458}
----------------------------------------
📤 Publicado mensaje 3
📨 Tópico: sensors/room1/temperature
📄 Mensaje: {"temperature": 22.0, "humidity": 54.0, "timestamp": 1699123460}
----------------------------------------
⏹️  Deteniendo cliente...
🔌 Desconectado del broker
            

Paso 6: Configuración Avanzada para Producción

Para un entorno de producción, considera estas configuraciones adicionales:

Configuración con SSL/TLS:


# Generar certificados (ejemplo con OpenSSL)
sudo openssl genrsa -out ca.key 2048
sudo openssl req -new -x509 -days 1826 -key ca.key -out ca.crt
sudo openssl genrsa -out server.key 2048
sudo openssl req -new -key server.key -out server.csr
sudo openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 360

# Configuración en mosquitto.conf
port 8883
cafile /etc/mosquitto/certs/ca.crt
certfile /etc/mosquitto/certs/server.crt
keyfile /etc/mosquitto/certs/server.key
require_certificate false
            

Paso 7: Monitoreo y Logs

Configurar un sistema de monitoreo adecuado es esencial para mantener el broker en producción:

Script de monitoreo básico:


#!/bin/bash
# monitor_mosquitto.sh

LOG_FILE="/var/log/mosquitto/mosquitto.log"
STATUS_FILE="/tmp/mosquitto_status.txt"

# Verificar si el servicio está ejecutándose
if systemctl is-active --quiet mosquitto; then
    echo "✓ Mosquitto está ejecutándose" > $STATUS_FILE
    
    # Verificar conexiones
    CONNECTIONS=$(netstat -an | grep :1883 | grep ESTABLISHED | wc -l)
    echo "🔗 Conexiones activas: $CONNECTIONS" >> $STATUS_FILE
    
    echo "--- Últimos eventos ---" >> $STATUS_FILE
    tail -n 20 $LOG_FILE >> $STATUS_FILE
else
    echo "✗ Mosquitto NO está ejecutándose" > $STATUS_FILE
fi