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.
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