Serveur d'authentification et de gestion centralisé pour dispositifs ESP32 utilisant le M5Stack CoreS3. Ce projet transforme votre M5Stack en un hub WiFi autonome qui gère l'appairage sécurisé et la supervision des dispositifs IoT domotiques.
Ce projet implémente un serveur ESP32 qui agit comme point d'accès WiFi et contrôleur central pour :
- Créer un réseau WiFi autonome pour dispositifs domotiques
- Gérer l'authentification sécurisée des dispositifs via tokens
- Superviser les connexions/déconnexions en temps réel
- Valider manuellement les demandes d'appairage
- Fournir une interface graphique de monitoring
- Interface moderne avec design card-based et palette de couleurs professionnelle
- Affichage temps réel des informations système :
- 📡 Logo MyHouseOS avec IP du serveur
- 👥 Nombre de clients connectés en direct
- 📝 Logs d'activité avec historique de 10 événements
- Codage couleur des événements (vert=connexion, orange=déconnexion, bleu=info)
- Écran de confirmation pour les demandes de pairing
- Point d'accès WiFi autonome (AP Mode)
- Endpoint
/linkpour appairage de nouveaux dispositifs - Génération automatique de tokens UUID uniques
- Vérification via API externe si le dispositif existe déjà
- Communication sécurisée avec l'API backend (Authorization header)
- Réponse JSON structurée avec statut et token
- Monitoring automatique toutes les 2 secondes
- Détection des connexions/déconnexions de clients
- Affichage des adresses MAC et IP DHCP
- Gestion jusqu'à 10 clients simultanés
- Logs détaillés dans le moniteur série
- Bouton A (BtnA) : Accepter une demande d'appairage
- Bouton B (BtnB) : Rejeter une demande d'appairage
- Timeout de 1 seconde pour les validations manuelles
- Feedback visuel immédiat des actions utilisateur
- M5Stack CoreS3 (ESP32-S3)
- Câble USB-C pour programmation et alimentation
- Réseau WiFi (optionnel pour communication avec API externe)
Le serveur fonctionne de manière autonome sans composants externes.
#include "M5CoreS3.h" // Librairie M5Stack CoreS3
#include <WiFi.h> // Gestion WiFi
#include <esp_wifi.h> // API WiFi ESP32
#include <esp_netif.h> // Interface réseau
#include <ESPAsyncWebServer.h> // Serveur Web asynchrone
#include <HTTPClient.h> // Client HTTP pour API externe
#include <ArduinoJson.h> // Parsing JSON// Point d'accès WiFi créé par le serveur
SSID: "MyHouseOS"
Password: "12345678"
IP: 192.168.4.1
Gateway: 192.168.4.1
Subnet: 255.255.255.0
// API externe pour validation (optionnel)
const char* externalAPICheckURL = "http://192.168.4.2:3000/check";
const char* externalAPIAuthURL = "http://192.168.4.2:3000/auth";
// Authentification API
Authorization: master:master#define MAX_LOGS 10 // Nombre de logs affichés
#define MAX_CLIENTS 10 // Clients WiFi maximum
const unsigned long UPDATE_INTERVAL = 2000; // Rafraîchissement (ms)
const unsigned long TIMEOUT = 1000; // Timeout pairing (ms)- Arduino IDE ou PlatformIO
- M5Stack Library
- ESPAsyncWebServer
- ArduinoJson (v7+)
Dans Arduino IDE :
Outils → Gérer les bibliothèques
Rechercher et installer :
- M5CoreS3
- ESPAsyncWebServer (me-no-dev)
- ArduinoJson
- Ouvrir
Server.ino - Modifier le SSID/password WiFi si désiré
- Ajuster les URLs de l'API externe selon votre backend
- Personnaliser les couleurs si souhaité
- Connecter le M5Stack CoreS3 via USB-C
- Sélectionner le port COM approprié
- Board: "M5Stack-CoreS3"
- Téléverser le code
- Le M5Stack affiche "STARTING..."
- Le point d'accès WiFi "MyHouseOS" est créé
- L'interface principale s'affiche avec :
- Logo et IP du serveur (192.168.4.1)
- Compteur de clients (initialement 0)
- Zone de logs d'activité
- Le dispositif se connecte au WiFi "MyHouseOS"
- Il envoie une requête POST à
http://192.168.4.1/link - Corps de la requête :
{"id":"ESP32_DEVICE_001"}
- Réception de la demande → Log "Link request: [ID]"
- Écran de confirmation s'affiche :
PAIRING REQUEST ESP32_DEVICE_001 BtnA = Accept BtnB = Reject - L'utilisateur a 1 seconde pour décider
- Si accepté (BtnA) :
- Vérification si le dispositif existe déjà (via API externe)
- Si oui : récupération du token existant
- Si non : génération d'un nouveau token UUID
- Enregistrement dans l'API externe
- Réponse au client avec le token
- Si rejeté (BtnB) ou timeout :
- Réponse d'erreur au client
- Retour à l'interface principale
L'écran affiche en temps réel :
- Connexions : "Connected: 192.168.4.X" (vert)
- Déconnexions : "Disconnected: 192.168.4.X" (orange)
- Événements système : Logs avec timestamps implicites
Request:
{
"id": "F8C096E350CC"
}Response (succès):
{
"status": "success",
"token": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
}Response (erreurs possibles):
// JSON invalide
{
"status": "error",
"message": "Invalid JSON"
}
// ID manquant
{
"status": "error",
"message": "Missing or empty ID"
}
// Rejeté par utilisateur
{
"status": "error",
"message": "Connection rejected by user"
}
// Timeout
{
"status": "error",
"message": "Request timeout"
}
// API externe inaccessible
{
"status": "error",
"message": "Check API unreachable"
}Response:
{
"status": "running"
}Vérifie si un dispositif existe déjà.
Headers:
Authorization: master:master
Response:
{
"exists": true,
"token": "existing-token-here"
}Enregistre un nouveau dispositif.
Headers:
Authorization: master:master
Content-Type: application/json
Body:
{
"id": "F8C096E350CC",
"token": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
}Fond principal : #0f172a (Bleu nuit slate-900)
Cartes : #1e293b (Gris ardoise slate-800)
Accent : #6366f1 (Indigo-500)
Texte : #f8fafc (Blanc cassé slate-50)
Sous-texte : #94a3b8 (Gris clair slate-400)
Succès : #22c55e (Vert green-500)
Avertissement : #fb923c (Orange orange-400)┌─────────────────────────────────┐
│ MyHouseOS │ CLIENTS │
│ 192.168.4.1│ 3 │ Header (cards)
├─────────────────────────────────┤
│ ACTIVITY LOGS │
│ │
│ ● Connected: 192.168.4.5 │
│ ● Link request: ESP32_001 │
│ ● Accepted: ESP32_001 │ Logs (8 derniers)
│ ● API OK: ESP32_001 │
│ ● New device: ESP32_001 │
│ ● System started │
│ ● Server running │
└─────────────────────────────────┘
┌─────────────────────────────────┐
│ │
│ PAIRING REQUEST │
│ │
│ F8C096E350CC │
│ │
│ │
│ BtnA = Accept │
│ BtnB = Reject │
│ │
└─────────────────────────────────┘
┌─────────────────┐ WiFi ┌──────────────┐
│ Dispositif │ ────────────→ │ M5Stack │
│ ESP32 Client │ MyHouseOS │ Serveur AP │
└─────────────────┘ └──────────────┘
│
HTTP POST /link │
{"id":"..."} │
↓
┌──────────────────┐
│ Validation User │
│ BtnA / BtnB │
└──────────────────┘
│
Si accepté │
↓
┌──────────────────┐ HTTP
│ API Externe │ ←─────────
│ 192.168.4.2 │
│ - /check │
│ - /auth │
└──────────────────┘
│
Token généré │
↓
┌──────────────────┐
│ Response JSON │
│ avec token │
└──────────────────┘
- updateClientList() → Scan stations WiFi connectées
- Récupération des IPs via DHCP
- Comparaison avec liste précédente
- Détection connexions/déconnexions
- Mise à jour logs et compteur
- drawInterface() → Rafraîchissement écran
- Vérifier que le M5Stack démarre correctement
- Ouvrir le moniteur série (115200 bauds)
- Chercher "MyHouseOS started" dans les logs
- Vérifier qu'aucun autre programme n'utilise le WiFi
- Vérifier le SSID : "MyHouseOS"
- Vérifier le mot de passe : "12345678"
- S'assurer que MAX_CLIENTS (10) n'est pas atteint
- Redémarrer le M5Stack
- Vérifier que l'API backend est accessible
- Ping 192.168.4.2 depuis un client connecté
- Vérifier les URLs dans le code
- Vérifier le header Authorization: "master:master"
- Consulter les logs série pour détails HTTP
- Par défaut, timeout = 1 seconde
- Modifier
TIMEOUTpour plus de temps - Vérifier que les boutons physiques fonctionnent
- Le M5Stack doit recevoir M5.update() dans la boucle
- Vérifier que MAX_LOGS = 10
- Les logs sont circulaires (les anciens sont écrasés)
- L'écran se rafraîchit toutes les 2 secondes
- Vérifier l'appel à drawInterface()
- Appuyer sur le bouton Reset
- Vérifier l'alimentation USB-C
- Vérifier dans le moniteur série si le code tourne
- Tester avec un code minimal M5CoreS3
WiFi.softAP("MonReseauPerso", "MotDePasseSecurise");const unsigned long UPDATE_INTERVAL = 5000; // 5 secondes#define MAX_CLIENTS 20 // 20 clients maxconst unsigned long TIMEOUT = 60000; // 60 secondes#define COLOR_BG CoreS3.Display.color565(0, 0, 0) // Fond noir
#define COLOR_ACCENT CoreS3.Display.color565(255, 0, 0) // Accent rougeaddLog("Mon message", COLOR_SUCCESS); // Vert
addLog("Attention", COLOR_WARNING); // Orange
addLog("Information", COLOR_ACCENT); // Bleu- Changer le mot de passe WiFi : Ne pas utiliser "12345678"
- Sécuriser l'API externe : Utiliser des tokens robustes, pas "master:master"
- Implémenter HTTPS : Pour les communications sensibles
- Validation côté serveur : Vérifier tous les inputs JSON
- Rate limiting : Limiter les tentatives de pairing
- Logs sécurisés : Ne pas afficher de données sensibles
- Timeout adapté : 1s peut être court en production
- Whitelist MAC : Optionnellement filtrer par adresse MAC
Projet open source - Libre d'utilisation et de modification.
Développé pour le M5Stack CoreS3 dans le cadre d'un projet de domotique connectée MyHouseOS.
Version : 1.0
Date : Décembre 2025
Plateforme : M5Stack CoreS3 (ESP32-S3)