This repository has been archived on 2025-10-20. You can view files and clone it, but cannot push or open issues or pull requests.
Files
2bki21/INF/CaptivePortal/CaptivePortal.ino
2025-01-15 13:14:16 +01:00

99 lines
3.3 KiB
C++

/* 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 <Arduino.h>
#include <WiFi.h>
#include <WebServer.h>
#include <DNSServer.h>
const char* ssid = "wlan4win"; // SSID des Netzwerks
const char* password = "lol4win"; // 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", "<h1>Willkommen zum ESP32 Captive Portal!</h1><p>Du bist jetzt verbunden, jetzt zur <a href=/index.html>Hautpseite</a> wechseln.</p>");
}
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 = "<h1>ESP32 Steuerung</h1><p>Setze ein Lesezeichen auf diese Seite</p>";
page += "<p>oder gibt die Adresse 192.168.4.1 im Browser ein.</p>";
return page;
}