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