Libraries und Framework
Für die Programmierung des ESP32 wird das Arduino-Framework verwendet.
Zusätzlich wird die MQTT-Library pubsubclient von Nick O'Leary in der Version 2.8 verwendet. (Link zur Libray auf GitHub)
Die platformio.ini Datei enthält alle nötigen Informationen.
Beschreibung der Funktion des Testprogramms
Funktion und Idee
Mit diesem einfachen Programm soll die Kommunikation via MQTT mit dem ESP32 getestet werden.
Der ESP32 veröffentlicht (published) dazu die Zeichenkette "Hallo " + zaehler + "!" auf dem Topic test1. Die Variable zaehler wird bei jeder neuen Veröffentlichung um 1 hochgezählt.
Voraussetzungen
Da der ESP32 über WLAN kommunizieren soll, muss ein solches erreichbar sein.
Das kann das hauseigene WLAN sein, in das sich der ESP32 (im Station-Mode) einloggen kann, oder auch ein separates WLAN.
Es ist auch möglich, zu Testzwecken in eigenes WLAN von einem separaten ESP32 Mikrocontroller aufzuspannen. Mit diesem muss sich der Raspberry pi verbinden, auf dem Mosquitto läuft und der ESP32 der per MQTT kommunizieren soll. Dabei ist zu bedenken, dass ein ESP32 im AP-Modus maximal vier Teilnehmer gleichzeitig im aufgespannten WLAN zulässt.
Der Broker muss über dieses WLAN erreichbar sein. Die IP-Adresse des Brokers muss für die Kommunikation via MQTT bekannt sein.
Für dieses Beispiel wird auf einem Raspberry pi der Broker Mosquitto installiert und verwendet. Dieser muss für die Kommunikation im WLAN konfiguriert werden.
Quellcode
/*!
* Test-program for MQTT communication with the ESP32
* ESP32 in Station Mode
*/
#include <Arduino.h>
#include <WiFi.h>
#include <PubSubClient.h>
// ssid and password of your WLAN
const char ssid[] = "ESP32_SoftAP"; // SSID
const char password[] = "12345678"; // at least 8 characters!
IPAddress mqtt_server = {192, 168, 4, 5}; // IP of the MQTT Broker in your LAN
WiFiClient espClient;
PubSubClient client(espClient);
char sendestring[30];
unsigned int zaehler = 1;
void reconnect()
{
// Loop until we're reconnected
while (!client.connected())
{
Serial.print("Attempting MQTT connection...");
// Create a random client ID
String clientId = "ESP8266Client-";
clientId += String(random(0xffff), HEX);
// Attempt to connect
if (client.connect(clientId.c_str()))
{
Serial.println("connected");
// Once connected, publish an announcement...
client.publish("test1", "hello world");
// ... and resubscribe
}
else
{
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
// Wait 5 seconds before retrying
delay(5000);
}
}
}
void setup()
{
Serial.begin(115200);
delay(1000); // Wait for Serial to initialize
Serial.println("Setup WIFI Network in STA Mode.");
Serial.print("SSID: ");
Serial.println(ssid);
Serial.print("Secret password: ");
Serial.println(password);
WiFi.mode(WIFI_STA); // Set WIFI-Mode in STA-Mode
WiFi.begin(ssid, password); // connect to your WLAN
Serial.println("*********");
Serial.println("Waiting for WiFi connection!");
// wait for connection
while (WiFi.status() != WL_CONNECTED)
{
Serial.print(".");
delay(500);
}
Serial.println("");
// display the IP
Serial.println("IP address:");
Serial.println(WiFi.localIP());
// start a client on port 1883
client.setServer(mqtt_server, 1883);
}
void loop()
{
client.loop();
if (!client.connected())
{
reconnect();
}
else
{
sprintf(sendestring, "Hallo %d!", zaehler);
client.publish("test1", sendestring);
zaehler++;
}
delay(3000);
}