/* Basisprogramm für ein Captive Portal * Grundversion, die bei einer Verbindung auf dem Client den Browser öffnet * und eine Startseite darstellt. * Der HTML-Code ist rudimentär, um das Beispiel einfach zu halten * Der Webserver antwortet auf die url / mit der Captive-Seite, bei index.html * wird eine andere Webseite ausgegeben, die über eine Funktion generiert wird. * Version 1.0 * Getestet mit Android-Handy und Android-Tablet => ok * Gestestet mit Windows-PC => Browser versucht auf eine Microsoft-Adresse umzuleiten */ #define __Version__ "V1.0 CaptivePortal" #include #include #include #include const char* ssid = "ESP32_Captive_Portal"; // SSID des Netzwerks const char* password = "12345678"; // Passwort const byte DNS_PORT = 53; DNSServer dnsServer; WebServer server(80); // IP-Adresse des ESP32 IPAddress apIP(192, 168, 4, 1); // HTML für die Captive Portal-Seite void handleRoot() { server.send(200, "text/html", "

Willkommen zum ESP32 Captive Portal!

Du bist jetzt verbunden, jetzt zur Hautpseite wechseln.

"); } void handleNotFound() { server.sendHeader("Location", "/", true); // Redirect zur Root-Seite server.send(302, "text/plain", ""); } void handleMain() { server.send(200, "text/html", getPage()); } void setup() { Serial.begin(115200); // Access Point starten WiFi.softAP(ssid, password); // IP-Adresse des ESP, Gateway-Adresse=ESP, Netzmaske WiFi.softAPConfig(apIP, apIP, IPAddress(255, 255, 255, 0)); Serial.println("Access Point gestartet."); Serial.println(WiFi.softAPIP()); // DNS-Server starten und alle Domains zur AP-IP weiterleiten dnsServer.start(DNS_PORT, "*", apIP); // HTTP-Server konfigurieren server.on("/", handleRoot); server.on("/index.html", handleMain); server.onNotFound(handleNotFound); server.begin(); Serial.println("HTTP-Server gestartet."); } void loop() { uint32_t currentMillis = millis(); static uint32_t lastMillis; static uint8_t currentClientCount, lastClientCount; dnsServer.processNextRequest(); // DNS-Anfragen verarbeiten server.handleClient(); // HTTP-Anfragen verarbeiten // Optional: 1x pro Sekunde nachschauen, ob sich an der Anzahl der Clients was geändert hat if (currentMillis - lastMillis >= 1000) { lastMillis = currentMillis; currentClientCount = WiFi.softAPgetStationNum(); // Überprüfen, ob sich die Anzahl der Clients geändert hat if (currentClientCount != lastClientCount) { Serial.printf("Anzahl verbundener Clients: %d\n", currentClientCount); // Optional: Aktion für neue Clients if (currentClientCount > lastClientCount) { Serial.println("Ein neuer Client hat sich verbunden!"); } // Optional: Aktion für getrennte Clients if (currentClientCount < lastClientCount) { Serial.println("Ein Client hat sich getrennt!"); } lastClientCount = currentClientCount; // Aktualisiere den letzten Stand } } } String getPage() { // zunächst nur ganz einfacher HTML-Code, es fehlt der komplette Header, CSS und vieles mehr String page = "

ESP32 Steuerung

Setze ein Lesezeichen auf diese Seite

"; page += "

oder gibt die Adresse 192.168.4.1 im Browser ein.

"; return page; }