137 lines
4.1 KiB
C
137 lines
4.1 KiB
C
#pragma once
|
|
#include <Arduino.h>
|
|
#include <ESPmDNS.h> // <-- mDNS hinzufügen
|
|
#include <PrettyOTA.h>
|
|
#include <WiFi.h>
|
|
#include <esp_now.h>
|
|
#include <esp_wifi.h>
|
|
|
|
#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();
|
|
}
|
|
|
|
|