🛠 Publier et s'abonner en MQTT avec PubSubClient

ESP8266 (módulo ESP-12E) · intermediaire · Schéma : IMG-esp8266-esp-12e-intermediaire-3-esp8266-mqtt-pubsub.svg — Module ESP8266-ESP-12E connecté via Wi-Fi à un broker MQTT sur le réseau local, échanges sur les sujets esp12e/rssi et esp12e/led, LED sur GPIO2.

Objetivos

Conectar el ESP8266-ESP-12E a un broker MQTT (el protocolo rey de la domótica, muy ligero y perfectamente adaptado al chip) con la biblioteca PubSubClient. El módulo publica su RSSI cada 5 segundos en el tema «esp12e/rssi» y controla el LED integrado suscribiéndose a «esp12e/led» (mensajes ON/OFF). Se aprende el mantenimiento de la conexión (keepalive mediante mqtt.loop llamado regularmente), la reconexión manual cuando el broker desaparece y el aprovechamiento del callback de recepción. El broker puede ser Mosquitto en una Raspberry Pi o un NAS de la red local.

Material

Código completo

#include <ESP8266WiFi.h>
#include <PubSubClient.h>

const char* SSID = "mon-reseau";
const char* PASS = "mot-de-passe";
const char* BROKER = "192.168.1.50";   // IP du broker Mosquitto
const uint8_t LED = 2;                 // active-LOW

WiFiClient net;
PubSubClient mqtt(net);
unsigned long dernierePub = 0;

void callback(char* topic, byte* payload, unsigned int len) {
  String msg = String((char*)payload).substring(0, len);
  msg.toUpperCase;
  if (String(topic) == "esp12e/led") {
    digitalWrite(LED, msg == "ON" ? LOW : HIGH);   // LOW = allumee
    Serial.printf("LED -> %s\n", msg.c_str);
  }
}

void connexion {
  WiFi.mode(WIFI_STA);
  WiFi.begin(SSID, PASS);
  while (WiFi.status != WL_CONNECTED) { delay(250); Serial.print("."); yield; }
  while (!mqtt.connected) {
    Serial.print("Connexion MQTT...");
    if (mqtt.connect("esp12e-01")) {          // client id unique sur le broker
      Serial.println(" ok");
      mqtt.subscribe("esp12e/led");
    } else {
      Serial.printf("echec rc=%d, retry 2s\n", mqtt.state);
      delay(2000);
    }
  }
}

void setup {
  Serial.begin(115200);
  pinMode(LED, OUTPUT);
  mqtt.setServer(BROKER, 1883);
  mqtt.setCallback(callback);
  connexion;
}

void loop {
  if (WiFi.status != WL_CONNECTED || !mqtt.connected) connexion;
  mqtt.loop;                                 // keepalive + réception, indispensable
  if (millis - dernierePub > 5000) {
    dernierePub = millis;
    char buf[16];
    snprintf(buf, sizeof(buf), "%d", WiFi.RSSI);
    mqtt.publish("esp12e/rssi", buf);
  }
  delay(10);
}

Verificación esperada

Inicia el broker y luego el módulo: la consola muestra la conexión Wi-Fi y después «Conexión MQTT... ok». En el lado del broker, mosquitto_sub -t 'esp12e/#' debe mostrar un RSSI cada 5 segundos. Envía mosquitto_pub -t esp12e/led -m ON: el LED del módulo se enciende inmediatamente; «OFF» lo apaga. Detén el broker: el módulo muestra los fallos y luego se reconecta solo cuando el broker vuelve.

Errores frecuentes

Otros tutoriales para esta placa

Ejemplos de código para esta placa

← Volver a la ficha 🛠 Todos los tutoriales