Im Folgenden wird ein einfacher Web-Server für den ESP32 beschrieben.
Inhaltsverzeichnis
Das Arduino-Framework für den ESP32 besitzt bereits eine Web-Server-Klasse. Es sind dann nur noch wenige Ergänzungen für einen voll funktionsfähigen Server notwendig. Viele Details zu der Web-Server-Klasse findet man in meiner Beschreibung ESP8266-Webserver: Spinnen leicht gemacht. Das API der Klasse ist für den ESP32 und den ESP8266 im Wesentlichen identisch. Im Netz und im Arduino-Framework findet man zahllose Beispiele.
Je nachdem wo der ESP32 eingebaut wird, wird es schwierig sein, das Programm per Kabel zu aktualisieren. OTA bietet die Möglichkeit, das Programm per Funknetz (WLAN) zu ändern. Für dieses Projekt wird die eigene OTA-Bibliothek (ESP8266/ESP32 OTA: Neues aus der Luft gegriffen.) benutzt.
Bei der Entwicklung eines μC-Programms ist nicht immer klar, ob die aktuellste Version läuft. Ich benutzte ein System, dass bei jedem Build-Vorgang eine Build-Nummer erhöht, die beim Programmstart ausgegeben wird (Build-Nummer: Immer Eins drauf!).
Das Espressif-IDF, das Basis für das Arduino-Framework ist, sorgt dafür, dass nach einer Programm-Exception ein Reset ausgelöst wird. Da dadurch der Fehler nicht behoben wird, wird erneut ein Reset ausgelöst. So geht es dann endlos weiter.
Im Programm wird der Reset-Grund abgefragt und entsprechend regiert (siehe ESP32 UrsESP: Auf den Chip geschaut).
Für die Verbindung zum WLAN wird die Bibliothek UrsWiFi (ESP8266/ESP32 UrsWiFi: Was man immer wieder macht) benutzt. Ich möchte Kontrolle über die vergebene IP und den vergebenen Hostnamen1) des ESP32 haben.
1) Bei meiner alten Fitz!Box hat das sehr gut funktioniert. Bei meiner neuen Fritz!Box ist es so, dass der ESP32 den Namen behält, der beim ersten Anmelden vergeben wurde. Wahrscheinlich gibt es Möglichkeiten, das zu ändern. Ich bin den einfachen Weg gegangen und habe den Hostnamen in der Fritz!Box geändert.
Nach diesen Erläuterungen sollte das Verständnis des Codes keine weiteren Probleme bereiten:
/*
Name: AlexaServer
Created: 26.01.2024
Author: bieno
*/
#include <WiFi.h>
#include <WebServer.h>
#include <UrsWiFi.h>
#include <UrsEsp.h>
#include <UrsOTA.h>
#include "AppVersion.h"
using namespace UrsCPU;
const char* ssid = "your ssid";
const char* password = "your password";
const char* hostname = "AlexaServer";
const IPAddress ip(xxx, xxx, xxx, xxx);
const int port = 7235;
WebServer server(port);
void setup() {
// Serielle Schnittstelle initialisieren
// -------------------------------------------------------------------------
Serial.begin(115200);
Serial.println("\n" APP_NAME " gestartet. Version: " APP_VERSION "\n");
while (Serial.available()) // Falls es Schmutz auf der Leitung gibt.
Serial.read();
// Reset-Grund abprüfen
// -------------------------------------------------------------------------
int resetReason = UrsESP.getResetReason(0);
Serial.printf("CPU0 Reset Grund: %i (%s) %s\n", resetReason, UrsESP.getResetReasonName(resetReason).c_str(), UrsESP.getResetReasonDescription(resetReason).c_str());
// Interne Fehler führen dauernd zu einem neuen Reset
// Reason 1: POWER_ON_RESET
// Reason 12: SW_CPU_RESET (z.B. nach OTA)
if (resetReason != 1 && resetReason != 12)
while (1);
// mit WLAN verbinden
// -------------------------------------------------------------------------
auto conStatus = UrsWiFi.connectStation(ssid, password, hostname, ip);
if (!(conStatus & UrsCodes::ConnectCode::notConnected)) { // Verbunden
if (conStatus != UrsCodes::ConnectCode::noError) {// aber Probleme: 2. Versuch
Serial.println("=== 2. Versuch");
UrsWiFi.connectStation(ssid, password, hostname, ip);
}
}
// Web-Server konfigurieren
// -------------------------------------------------------------------------
server.on("/", handleRootRequest);
server.onNotFound(handleNotFound);
// Server starten
// -------------------------------------------------------------------------
server.begin();
Serial.printf("HTTP Server gestartet auf Port %i\n", port);
// OTA starten
// -------------------------------------------------------------------------
UrsOTA.begin(hostname);
}
void loop() {
server.handleClient();
UrsOTA.handle();
}
// Handler für HTTP-Requests
// -------------------------------------------------------------------------
void handleRootRequest() {
Serial.printf("RootRequest from %s, Argumente sind %s %s %s\n", server.client().remoteIP().toString().c_str(),
server.arg(0).c_str(), server.arg(1).c_str(), server.arg(2).c_str());
server.send(200, "text/html", "OK");
}
void handleNotFound() {
server.send(404, "text/plain", "ich verstehe nicht, was gemeint ist.");
}
Der Web-Server gibt beim Start aus, welche IP-Adresse zugewiesen wurde. Es sollte die Adresse sein, die bei der Initialisierung angefordert wurde. Nun kann man mit einem einfachen Browser-Aufruf testen, ob alles funktioniert. Nach einer der Eingabe von
sollte die Antwort OK angezeigt werden.
Das ZIP-Archiv Alaxa-ESP32.ZIP enthält im Order 2. Einfacher Web-Server das komplette Visual Micro Projekt für diesen Web-Server. Arduino-IDE-Anwender nutzen nur die .ino-Datei.