You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
205 lines
6.0 KiB
205 lines
6.0 KiB
#include <Arduino.h> |
|
#include <WiFi.h> |
|
#include <LittleFS.h> |
|
#include <ArduinoJson.h> |
|
#include <ArduinoOTA.h> |
|
#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>(); |
|
String passHash = doc["auth"]["password_hash"].as<String>(); |
|
authManager.setCredentials(username, passHash); |
|
} |
|
|
|
if (doc["system"]["hostname"]) { |
|
hostname = doc["system"]["hostname"].as<String>(); |
|
} |
|
|
|
if (doc["system"]["session_timeout"]) { |
|
authManager.setSessionTimeout(doc["system"]["session_timeout"]); |
|
} |
|
|
|
if (doc["wifi"]["ssid"]) { |
|
wifiSSID = doc["wifi"]["ssid"].as<String>(); |
|
} |
|
|
|
if (doc["wifi"]["password"]) { |
|
wifiPassword = doc["wifi"]["password"].as<String>(); |
|
} |
|
|
|
if (doc["wifi"]["ap_password"]) { |
|
apPassword = doc["wifi"]["ap_password"].as<String>(); |
|
} |
|
|
|
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); |
|
}
|
|
|