Este proyecto tiene como objetivo montar un broker MQTT usando Mosquitto en una VM Ubuntu y conectar una ESP32 para enviar y recibir datos de sensores de manera remota. La comunicación se realiza mediante tópicos MQTT, lo que permite actualizar la configuración de la ESP32 sin reprogramarla.
-
Hardware
- ESP32
- Sensor(es) conectado(s) a la ESP32 (ej: temperatura, humedad)
- Computadora host para desarrollo
-
Software
- Vagrant
- VirtualBox
- Ubuntu 22.04 (Jammy) como VM
- Mosquitto MQTT Broker
- IDE Arduino o PlatformIO
- Librería Arduino
PubSubClientpara MQTT
Ejemplo de Vagrantfile:
Vagrant.configure("2") do |config|
config.vm.box = "ubuntu/jammy64"
config.vm.network "private_network", ip: "192.168.1.56"
config.vm.provider "virtualbox" do |vb|
vb.memory = "1024"
vb.cpus = 1
end
endPasos para levantar la VM:
vagrant up
vagrant sshDentro de la VM:
sudo apt update
sudo apt install mosquitto mosquitto-clients -y
sudo systemctl enable mosquitto
sudo systemctl start mosquitto
sudo systemctl status mosquittoEditar el archivo de configuración:
sudo nano /etc/mosquitto/mosquitto.confAgregar al final:
listener 1883 0.0.0.0
allow_anonymous true
persistence false
Reiniciar el servicio:
sudo systemctl restart mosquittoVerificar que escuche en todas las interfaces:
sudo netstat -tuln | grep 1883
# O usando ss
sudo ss -tuln | grep 1883Resultado esperado:
tcp 0 0 0.0.0.0:1883 0.0.0.0:* LISTEN
WiFi.hPubSubClient.h(instalable desde el Library Manager de Arduino)
#include <WiFi.h>
#include <PubSubClient.h>
const char* ssid = "TU_SSID";
const char* password = "TU_PASSWORD";
const char* mqtt_server = "192.168.1.56"; // IP de la VM broker
WiFiClient espClient;
PubSubClient client(espClient);
void setup() {
Serial.begin(115200);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\n✅ Conectado a WiFi!");
client.setServer(mqtt_server, 1883);
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
// Publicar datos cada 5 segundos
static unsigned long lastMsg = 0;
unsigned long now = millis();
if (now - lastMsg > 5000) {
lastMsg = now;
client.publish("sensor/temp", "Dato de prueba");
}
}
void reconnect() {
while (!client.connected()) {
Serial.print("Conectando MQTT...");
if (client.connect("ESP32_Client")) {
Serial.println("✅ Conectado al broker MQTT");
client.subscribe("config/esp32");
} else {
Serial.print("Error rc=");
Serial.print(client.state());
Serial.println(" intentando de nuevo en 5s");
delay(5000);
}
}
}- Suscribirse a los tópicos publicados por la ESP32:
mosquitto_sub -t "sensor/temp" -v
mosquitto_sub -t "config/esp32" -v- Publicar mensajes de configuración:
mosquitto_pub -h 192.168.1.56 -t "config/esp32" -m '{"intervalo":10000}'La ESP32 debería recibir los mensajes en tiempo real.
mosquitto_sub -h 192.168.1.56 -t "sensor/temp" -v
mosquitto_pub -h 192.168.1.56 -t "config/esp32" -m '{"intervalo":10000}'- La ESP32 no debe usar localhost (127.0.0.1) para conectarse al broker; siempre usar la IP de la VM.
- Evitar
delay()largos en elloop()para no perder la conexión MQTT. - Usar
client.loop()constantemente para mantener la sesión activa. - Para entornos de producción, se recomienda configurar autenticación y TLS en Mosquitto.
- La ESP32 se conecta automáticamente al Wi-Fi y al broker MQTT.
- Los mensajes publicados aparecen en el broker en tiempo real.
- Se pueden enviar mensajes de configuración desde la VM o cualquier cliente MQTT externo.