Ejemplos de código

Ejemplo MQTT con ESP32

Conecta un ESP32 a un broker MQTT por Wi-Fi con la biblioteca PubSubClient de Arduino. Empieza con el broker público gratuito y después apunta el mismo código a un broker privado y seguro en ConnectMQ.

Instalación
arduino-cli lib install PubSubClient
Código fuente en GitHubmqtt-code-samples/esp32Clona los ejemplos completos y listos para ejecutar. Se agradecen estrellas y pull requests. Ver en GitHub

1. Pruébalo en el broker público gratuito

Sin necesidad de cuenta: conéctate a broker.connectmq.com en el puerto 1883 y empieza a publicar en segundos.

esp32_mqtt.ino
#include <WiFi.h>
#include <PubSubClient.h>

const char* WIFI_SSID = "YOUR_WIFI";
const char* WIFI_PASS = "YOUR_WIFI_PASSWORD";
const char* TOPIC = "your-project/sensors/temperature"; // Usa un prefijo de topic único: cualquiera puede leer el broker público

WiFiClient net;
PubSubClient mqtt(net);

// Se ejecuta con cada mensaje de un topic suscrito
void onMessage(char* topic, byte* payload, unsigned int length) {
  Serial.printf("%s: %.*s\n", topic, length, (char*)payload);
}

void connectMqtt() {
  while (!mqtt.connected()) {
    // Cada cliente necesita un client ID único
    String id = "esp32-" + String((uint32_t)ESP.getEfuseMac(), HEX);
    if (mqtt.connect(id.c_str())) {
      // Suscribirse al topic de temperatura
      mqtt.subscribe(TOPIC);
    } else {
      delay(2000);
    }
  }
}

void setup() {
  Serial.begin(115200);
  // Conectar primero al Wi-Fi
  WiFi.begin(WIFI_SSID, WIFI_PASS);
  while (WiFi.status() != WL_CONNECTED) delay(500);
  // Conectar al broker público gratuito (sin cuenta)
  mqtt.setServer("broker.connectmq.com", 1883);
  mqtt.setCallback(onMessage);
}

void loop() {
  // Reconectar automáticamente si se pierde la conexión
  if (!mqtt.connected()) connectMqtt();
  mqtt.loop();
  static unsigned long last = 0;
  if (millis() - last > 10000) {
    last = millis();
    // Publicar una lectura en JSON
    mqtt.publish(TOPIC, "{\"temperature\":21.5}");
  }
}

Broker MQTT público gratuito

El broker público es compartido: cualquiera puede suscribirse a tus topics. Nunca envíes por él contraseñas, datos personales ni información confidencial.

Acerca del broker MQTT público gratuito

2. Pasa a producción con ConnectMQ

Para dispositivos reales, usa un broker MQTT serverless privado en ConnectMQ en lugar del público: cifrado TLS, usuario y contraseña para cada dispositivo y control de acceso por topic, totalmente gestionado. Empieza con el plan Free, sin tarjeta.

Sustituye YOUR_BROKER_HOST, YOUR_USERNAME y YOUR_PASSWORD por los valores de tu panel de ConnectMQ.

esp32_mqtt.ino
#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <PubSubClient.h>

const char* WIFI_SSID = "YOUR_WIFI";
const char* WIFI_PASS = "YOUR_WIFI_PASSWORD";
const char* TOPIC = "your-project/sensors/temperature";

// Certificado CA raíz (PEM) del certificado TLS del broker
const char* ROOT_CA = R"PEM(
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
)PEM";

WiFiClientSecure net;
PubSubClient mqtt(net);

// Se ejecuta con cada mensaje de un topic suscrito
void onMessage(char* topic, byte* payload, unsigned int length) {
  Serial.printf("%s: %.*s\n", topic, length, (char*)payload);
}

void connectMqtt() {
  while (!mqtt.connected()) {
    // Cada cliente necesita un client ID único
    String id = "esp32-" + String((uint32_t)ESP.getEfuseMac(), HEX);
    // Usuario y contraseña de tu panel de ConnectMQ
    if (mqtt.connect(id.c_str(), "YOUR_USERNAME", "YOUR_PASSWORD")) {
      // Suscribirse al topic de temperatura
      mqtt.subscribe(TOPIC);
    } else {
      delay(2000);
    }
  }
}

void setup() {
  Serial.begin(115200);
  // Conectar primero al Wi-Fi
  WiFi.begin(WIFI_SSID, WIFI_PASS);
  while (WiFi.status() != WL_CONNECTED) delay(500);
  net.setCACert(ROOT_CA);
  // Conectar a tu broker privado de ConnectMQ en el puerto 8883
  mqtt.setServer("YOUR_BROKER_HOST", 8883);
  mqtt.setCallback(onMessage);
}

void loop() {
  // Reconectar automáticamente si se pierde la conexión
  if (!mqtt.connected()) connectMqtt();
  mqtt.loop();
  static unsigned long last = 0;
  if (millis() - last > 10000) {
    last = millis();
    // Publicar una lectura en JSON
    mqtt.publish(TOPIC, "{\"temperature\":21.5}");
  }
}

Preguntas frecuentes sobre MQTT con ESP32

¿Cómo conecto ESP32 a un broker MQTT?

Instala PubSubClient (Arduino), conéctate al host del broker en el puerto 1883 (o 8883 con TLS), suscríbete a un topic y publica mensajes en él. Los ejemplos de esta página se conectan al broker público gratuito broker.connectmq.com y a un broker privado de ConnectMQ.

¿Hay un broker MQTT gratuito para probar ESP32?

Sí. broker.connectmq.com es un broker MQTT público y gratuito que no requiere cuenta. Cualquiera puede leer sus topics, así que úsalo solo para pruebas y con un prefijo de topic único.

¿Cómo protejo una conexión MQTT con ESP32?

Conéctate mediante TLS en el puerto 8883 con un usuario y una contraseña de tu panel de ConnectMQ, y asigna a cada dispositivo sus propias credenciales y permisos de topic en lugar de usar el broker público.

Broker MQTT público gratuito

Prueba cualquier ejemplo en broker.connectmq.com: sin registro, con MQTT 3.1.1 y 5, TCP, TLS y WebSocket.

Acerca del broker MQTT público gratuito

MQTT serverless seguro para producción

Cuando llegue el momento de usar dispositivos reales, ejecuta el mismo código en un broker de ConnectMQ privado y totalmente gestionado, con TLS y credenciales por dispositivo.

Empieza gratis

Tu broker MQTT privado, a unos pocos clics

Crea una cuenta, obtén las credenciales de tu broker y conecta tu primer dispositivo, sin servidores que instalar, parchear ni escalar.

MQTT sobre WebSocket: conecta un navegador a un broker MQTT con MQTT.js

Los navegadores no pueden abrir sockets TCP directos, así que las aplicaciones web hablan MQTT sobre WebSocket. Construye un cliente de navegador y un cliente Node.js funcionales contra broker.connectmq.com y aprende a resolver los errores de conexión más comunes.

9 min de lectura