#pragma once #include #include // <-- mDNS hinzufügen #include #include #include #include #include "licenceing.h" #include "master.h" #include "timesync.h" String uniqueSSID; PrettyOTA OTAUpdates; String getUniqueSSID(); bool isInternetAvailable(); void loopOTA(); void setupOTA(); void onWiFiAPClientConnected(WiFiEvent_t event, WiFiEventInfo_t info); // Initialisiert das WLAN als Access Point oder Station und startet mDNS/OTA. void setupWifi() { IPAddress local_ip(192, 168, 10, 1); IPAddress gateway(192, 168, 10, 1); IPAddress subnet(255, 255, 255, 0); WiFi.softAPConfig(local_ip, gateway, subnet); // Set AP IP and DHCP range uniqueSSID = getUniqueSSID(); ssidAP = uniqueSSID.c_str(); if (ssidSTA == nullptr || passwordSTA == nullptr || String(ssidSTA).isEmpty() || String(passwordSTA).isEmpty()) { Serial.println("Fehler: ssidSTA oder passwordSTA ist null!"); WiFi.mode(WIFI_MODE_AP); WiFi.softAP(ssidAP, passwordAP, 1, 0, 8); // Call this in setupWifi() after WiFi.softAP(...) WiFi.onEvent(onWiFiAPClientConnected, WiFiEvent_t::ARDUINO_EVENT_WIFI_AP_STACONNECTED); } else { WiFi.mode(WIFI_MODE_APSTA); WiFi.begin(ssidSTA, passwordSTA); WiFi.softAP(ssidAP, passwordAP, 1, 0, 8); // Call this in setupWifi() after WiFi.softAP(...) WiFi.onEvent(onWiFiAPClientConnected, WiFiEvent_t::ARDUINO_EVENT_WIFI_AP_STACONNECTED); // Add timeout for WiFi connection unsigned long startAttemptTime = millis(); while (WiFi.status() != WL_CONNECTED && millis() - startAttemptTime < 10000) { // 10 seconds timeout delay(500); Serial.print("."); } if (WiFi.status() != WL_CONNECTED) { Serial.println("Fehler: Verbindung zum WLAN fehlgeschlagen!"); Serial.println("Starte Access Point..."); WiFi.mode(WIFI_MODE_AP); WiFi.softAP(ssidAP, passwordAP, 1, 0, 8); } else { Serial.println("Erfolgreich mit WLAN verbunden!"); Serial.print("IP Adresse: "); Serial.println(WiFi.localIP()); if (isInternetAvailable) { syncTimeWithNTP(); } // Synchronisiere Zeit mit NTP } // Only wait for connection if ssidSTA and passwordSTA are set Serial.println("WiFi AP gestartet"); Serial.print("SSID: "); Serial.println(WiFi.softAPSSID()); Serial.print("IP Adresse: "); Serial.println(WiFi.softAPIP()); Serial.println("PrettyOTA can be accessed at: http://" + WiFi.softAPIP().toString() + "/update"); // mDNS starten if (MDNS.begin("ninjacross")) { // z.B. http://ninjacross.local/ Serial.println("mDNS responder gestartet: http://ninjacross.local/"); } else { Serial.println("Fehler beim Starten von mDNS!"); } } } // Initialisiert das OTA-Update-System (PrettyOTA) für Firmware-Updates. void setupOTA(AsyncWebServer *server) { // Initialize PrettyOTA // ElegantOTA.begin(server); OTAUpdates.Begin(server); // Set unique Hardware-ID for your hardware/board OTAUpdates.SetHardwareID("AquaCross-Master"); // Set firmware version to 1.0.0 OTAUpdates.SetAppVersion(firmwareversion); OTAUpdates.UseDefaultCallbacks(true); // Set current build time and date PRETTY_OTA_SET_CURRENT_BUILD_TIME_AND_DATE(); } // Generiert eine eindeutige SSID auf Basis der MAC-Adresse. String getUniqueSSID() { uint8_t mac[6]; esp_wifi_get_mac(WIFI_IF_STA, mac); // Create a 5-character string from last 3 bytes of MAC char uniqueId[6]; snprintf(uniqueId, sizeof(uniqueId), "%02X%03X", mac[4], mac[5]); return String("NinjaCross-") + String(uniqueId); } // Prüft, ob das Internet erreichbar ist (z.B. durch Ping auf 8.8.8.8) bool isInternetAvailable() { WiFiClient client; // Versuche, eine Verbindung zu Googles DNS auf Port 53 herzustellen return client.connect("8.8.8.8", 53); } void onWiFiAPClientConnected(WiFiEvent_t event, WiFiEventInfo_t info) { Serial.print("Client connected! MAC: "); for (int i = 0; i < 6; i++) { Serial.printf("%02X", info.wifi_ap_staconnected.mac[i]); if (i < 5) Serial.print(":"); } Serial.println(); }