ESP32 – MQTT Beispielcode

Beschreibung

Ich möchte hier die MQTT Grundlagen anhand eines ESP32 Testaufbaues kurz und knapp darstellen.

MQTT „Message Queuing Telemetry Transport“ ist ein Nachrichtenprotokoll das die Kommunikation von Sensoren/Geräten untereinander ermöglicht. Im Mittelpunkt steht ein Nachrichtenbroker, der eingehende Nachrichten von Sensoren/Geräten annimmt, speichert und abfragenden Sensoren/Geräten diese Informationen zugänglich macht.

Das Beispiel gibt an den MQTT Broker einen Zähler, „homeassistant/sensor/testmqtt/uptime“ , der set Start des Programmes läuft. Der Zähler wird jede Minute um eins erhöht. Das Programm etabliert einen Callback Call, wenn „homeassistant/sensor/testmqtt/onoff“ vom Broker gesendet wird. Entsprechend der Message, ON oder OFF wird eine LED an-, oder ausgeschaltet.

Der nachfolgende Code ist eine Beispiel-Implementation für ESP32.

MQTT Demo Definitionen

// 
// MQTT Demo
//
#include <stdio.h>

#if defined(ESP32)
#include <WiFi.h>
#endif
#if defined(ESP8266)
#include <ESP8266WiFi.h>
#endif

#include <PubSubClient.h>
#include <Wire.h>
#include <string.h>
//
// Wifi Parameter
//
const char* ssid = "WLAN SSID";
const char* password = "WLAN PASSWORD";
//
// MQTT Broker
//
const char* mqtt_server = "MQTT BROKER IP";
//
// MQTT port
//
#define MQTTPort  1883
//
// MQTT User
//
const char* mqtt_user = "MQTT USER";
const char* mqtt_password = "MQTT USER PASSWORD";
//
// MQTT Path
//
const char* mqtt_path =        "homeassistant/sensor/testmqtt/";
const char* mqtt_path_onoff =  "homeassistant/sensor/testmqtt/onoff";
const char* mqtt_path_uptime = "homeassistant/sensor/testmqtt/uptime";
char mqtt_path_str[100];
//
// MQTT Global Client Id
//
String clientId = "ESP32-" 
WiFiClient espClient;
PubSubClient client(espClient);
long lastTickMin = 0;
//
// Aktive Zeit in sec
//
int uptime=0; 
//
// LED zur Anzeige von MQTT Callback
//
#define LED_PIN       23

MQTT Demo Setup

//
// Setup des Sensors
//
void setup() {
  //
  // Seriell DEBUG init
  //
  Serial.begin(115200);
  //
  // Start Meldug DEBUG
  //
  Serial.printf("\n-----  DEMO MQTT -----\n\n");
  //
  // Wifi Setup
  //
  setup_wifi();
  // 
  // MQTT Setup, Port, Callback
  //
  client.setServer(mqtt_server, MQTTPort);
  client.setCallback(callback);
  setup_reconnect_mqtt();

  pinMode(LED_PIN, OUTPUT);
    digitalWrite(LED_PIN, HIGH);
}


//
// mqtt Pfad+Wert erzeugen
//
char *genmqtt_path(char *value) {
  strcpy(mqtt_path_str,"");
  strcat(mqtt_path_str, mqtt_path);
  strcat(mqtt_path_str, value);
  return &mqtt_path_str[0];
}

WiFi Setup

//
// WIFI Setup
//
void setup_wifi() {
  //
  // Warten
  //
  delay(10);
  Serial.printf("Connecting to %s ", ssid);
  //
  // WIFI starten
  //
  WiFi.begin(ssid, password);
  //
  // Warten bis WIFI initialisiert ist
  //
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.print(" WiFi connected, IP adress = ");
  Serial.println(WiFi.localIP());
}

MQTT Callback

//
// MQTT Callback
//
void callback(char* topic, byte* message, unsigned int length) {
  char Message[100];
  //
  // Message angekommen
  //
  strncpy((char *)Message, (char *)message, length > 99?0:length);
  Message[length] = 0;
  Serial.printf("Callback Break ---> Topic=%s Length=%d= '%s'\n",topic,length,Message);
  //
  // LED ein-oder ausschalten
  //
  if (strcmp(Message,"ON") == 0)
    digitalWrite(LED_PIN, LOW);
  else
    digitalWrite(LED_PIN, HIGH);
}

MQTT Setup

//
// MQTT Setup
//
void setup_reconnect_mqtt() {
  //
  // Falls nicht connected, weiter versuchen
  //
  while (!client.connected()) {
    Serial.print("Connecting to MQTT");
    clientId += String(random(0xffff), HEX);
    if (client.connect(clientId.c_str(), mqtt_user, mqtt_password)) {
      Serial.println(" . MQTT connected");
      client.subscribe(mqtt_path_onoff);
    } 
    else {
      Serial.print("Error, result=");
      Serial.print(client.state());
      Serial.println(" try again (1 sec)");
      delay(1000);
    }
  }
  client.loop();
}

MQTT in ESP32 Loop

// 
//Loop 
//
void loop() {
  int j;

  setup_reconnect_mqtt();

  long now = millis();
  //
  // pdate MQTT alle 60s
  //
  if (((now - lastTickMin) > (long)60000) || (lastTickMin == 0)) {
    //
    // Minuten Tick, Uptime -> MQTT ->homeassistant->testmqtt->uptime
    //
    lastTickMin = now;
    uptime++;
    Serial.printf("Uptime = %d min\n",uptime);
    char buffer[10];
    client.publish(mqtt_path_uptime, itoa(uptime,buffer,10));
  }
}

Aktualisiert: 4.2.25

Nach oben scrollen