Squelette d'application web pour ESP32 avec implémentations de fonctions basiques telles que : -Authentification -Responsive design -Mise à jour OTA -Paramétrage
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

#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);
}