#include #include #include #include #include #include "auth.h" #include "server.h" #include "utils.h" // Configuration par défaut String hostname = "ESP32-Webapp"; String wifiSSID = ""; String wifiPassword = ""; String apPassword = "webapp123"; void createDefaultConfig() { logMessage(LOG_INFO, "Création de la configuration par défaut"); JsonDocument doc; // Configuration authentification doc["auth"]["username"] = "admin"; doc["auth"]["password_hash"] = sha256("admin"); // Mot de passe par défaut: admin // Configuration WiFi doc["wifi"]["ssid"] = ""; doc["wifi"]["password"] = ""; doc["wifi"]["ap_password"] = apPassword; // Configuration système doc["system"]["hostname"] = hostname; doc["system"]["session_timeout"] = 60; // Paramètres application doc["params"]["app_name"] = "ESP32 Webapp"; File file = LittleFS.open("/config.json", "w"); if (file) { serializeJson(doc, file); file.close(); logMessage(LOG_INFO, "Configuration par défaut créée"); } else { logMessage(LOG_ERROR, "Impossible de créer config.json"); } } void loadConfig() { File file = LittleFS.open("/config.json", "r"); if (!file) { logMessage(LOG_WARN, "Fichier config.json introuvable, création..."); createDefaultConfig(); file = LittleFS.open("/config.json", "r"); if (!file) { logMessage(LOG_ERROR, "Échec de la création de config.json"); return; } } String content = file.readString(); file.close(); JsonDocument doc; DeserializationError error = deserializeJson(doc, content); if (error) { logMessage(LOG_ERROR, "Erreur de lecture de config.json"); return; } // Charger les paramètres if (doc["auth"]["username"]) { String username = doc["auth"]["username"].as(); String passHash = doc["auth"]["password_hash"].as(); authManager.setCredentials(username, passHash); } if (doc["system"]["hostname"]) { hostname = doc["system"]["hostname"].as(); } if (doc["system"]["session_timeout"]) { authManager.setSessionTimeout(doc["system"]["session_timeout"]); } if (doc["wifi"]["ssid"]) { wifiSSID = doc["wifi"]["ssid"].as(); } if (doc["wifi"]["password"]) { wifiPassword = doc["wifi"]["password"].as(); } if (doc["wifi"]["ap_password"]) { apPassword = doc["wifi"]["ap_password"].as(); } logMessage(LOG_INFO, "Configuration chargée"); } void setupWiFi() { if (wifiSSID.length() > 0) { logMessage(LOG_INFO, "Connexion au WiFi: " + wifiSSID); WiFi.mode(WIFI_STA); WiFi.setHostname(hostname.c_str()); WiFi.begin(wifiSSID.c_str(), wifiPassword.c_str()); int attempts = 0; while (WiFi.status() != WL_CONNECTED && attempts < 20) { delay(500); Serial.print("."); attempts++; } if (WiFi.status() == WL_CONNECTED) { logMessage(LOG_INFO, "WiFi connecté"); logMessage(LOG_INFO, "Adresse IP: " + WiFi.localIP().toString()); return; } logMessage(LOG_WARN, "Échec de connexion WiFi"); } // Mode Point d'accès logMessage(LOG_INFO, "Démarrage en mode Point d'Accès"); WiFi.mode(WIFI_AP); WiFi.softAP(hostname.c_str(), apPassword.c_str()); logMessage(LOG_INFO, "AP démarré: " + hostname); logMessage(LOG_INFO, "Adresse IP: " + WiFi.softAPIP().toString()); } void setupOTA() { ArduinoOTA.setHostname(hostname.c_str()); ArduinoOTA.onStart([]() { String type = (ArduinoOTA.getCommand() == U_FLASH) ? "firmware" : "filesystem"; logMessage(LOG_INFO, "Début de la mise à jour OTA: " + type); }); ArduinoOTA.onEnd([]() { logMessage(LOG_INFO, "Mise à jour OTA terminée"); }); ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) { Serial.printf("Progression: %u%%\r", (progress / (total / 100))); }); ArduinoOTA.onError([](ota_error_t error) { Serial.printf("Erreur OTA [%u]: ", error); if (error == OTA_AUTH_ERROR) logMessage(LOG_ERROR, "Échec d'authentification"); else if (error == OTA_BEGIN_ERROR) logMessage(LOG_ERROR, "Échec de démarrage"); else if (error == OTA_CONNECT_ERROR) logMessage(LOG_ERROR, "Échec de connexion"); else if (error == OTA_RECEIVE_ERROR) logMessage(LOG_ERROR, "Échec de réception"); else if (error == OTA_END_ERROR) logMessage(LOG_ERROR, "Échec de fin"); }); ArduinoOTA.begin(); logMessage(LOG_INFO, "OTA prêt"); } void setup() { Serial.begin(115200); delay(100); logMessage(LOG_INFO, "========================================"); logMessage(LOG_INFO, "ESP32 Webapp - Démarrage"); logMessage(LOG_INFO, "========================================"); // Initialiser LittleFS if (!LittleFS.begin(true)) { logMessage(LOG_ERROR, "Échec du montage de LittleFS"); return; } logMessage(LOG_INFO, "LittleFS monté"); // Charger la configuration loadConfig(); // Initialiser le WiFi setupWiFi(); // Initialiser OTA setupOTA(); // Démarrer le serveur web webServer.begin(); logMessage(LOG_INFO, "========================================"); logMessage(LOG_INFO, "Système prêt!"); logMessage(LOG_INFO, "========================================"); } unsigned long lastCleanup = 0; void loop() { ArduinoOTA.handle(); // Nettoyer les sessions expirées toutes les minutes unsigned long now = millis(); if (now - lastCleanup > 60000) { authManager.cleanExpiredSessions(); lastCleanup = now; } delay(10); }