Testprogramm für die Kommunikation via MQTT mit dem ESP32

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.

Link to the video in English language

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);
  }