From e2791b744ca880dbbe59bde923dd74e30874c55b Mon Sep 17 00:00:00 2001 From: scayac Date: Fri, 9 Jan 2026 09:31:02 +0100 Subject: [PATCH] =?UTF-8?q?Bug=20bluetooth=20+=20am=C3=A9lioration=20HTML?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 103 ++++++++++++++++++++++++++++++++---------------- html/index.html | 19 ++++++++- src/main.cpp | 24 ++++++++--- 3 files changed, 104 insertions(+), 42 deletions(-) diff --git a/README.md b/README.md index 555a15e..0948f27 100644 --- a/README.md +++ b/README.md @@ -4,16 +4,27 @@ Application HTML5 de quiz temps rĂ©el pour plusieurs modules ESP32-S3 via Blueto ## 📋 Description -BleQuiz permet de crĂ©er un systĂšme de quiz interactif en temps rĂ©el oĂč plusieurs ESP32-S3 peuvent ĂȘtre connectĂ©s simultanĂ©ment via Bluetooth. Chaque module ESP32-S3 surveille des GPIOs (boutons) et envoie instantanĂ©ment les Ă©vĂ©nements Ă  une interface web HTML5. +BleQuiz permet de crĂ©er un systĂšme de quiz interactif en temps rĂ©el oĂč jusqu'Ă  8 modules ESP32-S3 peuvent ĂȘtre connectĂ©s simultanĂ©ment via Bluetooth. Chaque module surveille 4 boutons (GPIOs) et envoie instantanĂ©ment les Ă©vĂ©nements Ă  une interface web HTML5 avec feedback visuel LED. + +**Cas d'usage** : Quiz en classe, jeux de rapiditĂ©, systĂšmes de vote, buzzers interactifs multi-joueurs. **Adresse de test :** [https://blequiz.apps.christophe-scaya.fr/](https://blequiz.apps.christophe-scaya.fr/) (serveur de dĂ©monstration, utiliser le fichier `quiz_exemple.txt`) +## ✹ FonctionnalitĂ©s principales + +- 🎼 **Identification automatique** : 8 modules nommĂ©s automatiquement via jumpers (BleQuiz-1 Ă  BleQuiz-8) +- 🔐 **Appairage sĂ©curisĂ©** : Code PIN 123456, mĂ©morisation pour reconnexion automatique +- 💡 **LED RGB intĂ©grĂ©e** : Feedback visuel couleur selon la rĂ©ponse (Rouge/Vert/Bleu/Jaune) +- đŸ“± **Multi-plateforme** : Compatible Android, iOS, Linux, Windows (Chrome/Edge) +- 🌐 **Interface web moderne** : Support des formules chimiques (indices/exposants) +- ⚡ **Temps rĂ©el** : DĂ©tection instantanĂ©e du premier Ă  rĂ©pondre + ## 🔧 Configuration -### ESP32 (src/main.cpp) +### ESP32-S3 (src/main.cpp) -Par dĂ©faut, le code surveille 4 GPIOs : **2, 4, 5, 6** d'un module ESP32-S3 supermini gĂ©nĂ©rique. +Par dĂ©faut, le code surveille 4 GPIOs : **2, 4, 5, 6** (compatibles ESP32-S3 Supermini) Pour modifier les GPIOs surveillĂ©s, Ă©ditez cette ligne : ```cpp @@ -64,27 +75,40 @@ Chaque module ESP32-S3 peut ĂȘtre identifiĂ© automatiquement via 3 GPIOs configu | LOW | LOW | HIGH | 110 | **BleQuiz-7** | | LOW | LOW | LOW | 111 | **BleQuiz-8** | +**Avantage** : Plus besoin de modifier le code pour chaque module, il suffit de configurer les jumpers ! + +### Appairage Bluetooth sĂ©curisĂ© + +Le systĂšme utilise un appairage sĂ©curisĂ© avec code PIN pour une meilleure compatibilitĂ© : + +- **Code PIN fixe** : **123456** (affichĂ© au dĂ©marrage dans le moniteur sĂ©rie) +- **Premier appairage** : Entrez 123456 sur votre appareil +- **Appairages suivants** : Reconnexion automatique sans code +- **CompatibilitĂ©** : ✅ Android | ✅ iOS | ✅ Linux | ✅ Windows ## 🚀 Installation et utilisation ### 1. PrĂ©requis -- **PlatformIO** installĂ© (via VS Code ou CLI) -- **Python 3** (pour le serveur HTTPS) -- **Navigateur compatible** : Chrome, Edge ou Opera (Firefox et Safari ne supportent pas Web Bluetooth) +- **PlatformIO** (VS Code ou CLI) +- **ESP32-S3** (Seeed XIAO ESP32-S3 ou compatible) +- **Python 3** (serveur HTTPS) +- **Navigateur** : Chrome, Edge ou Opera -### 2. Configuration des ESP32 +### 2. Compilation et tĂ©lĂ©versement -**Compiler et tĂ©lĂ©verser pour ESP32-S3** : +**Compiler et tĂ©lĂ©verser** : ```bash -pio run -e esp32-s3-supermini pio run -e esp32-s3-supermini --target upload ``` -**Monitorer le port sĂ©rie** (optionnel) : + +**Monitorer le port sĂ©rie** (voir code PIN 123456) : ```bash pio device monitor ``` +⚠ **Important** : Notez le code PIN **123456** affichĂ© au dĂ©marrage pour le premier appairage. + ### 3. DĂ©marrer le serveur HTTPS ⚠ **Important** : Web Bluetooth nĂ©cessite HTTPS (ou localhost en HTTP) @@ -128,9 +152,17 @@ https://localhost:8443 ### 5. Utiliser l'application 1. **Charger un fichier de questions** : Cliquez sur "Choisir un fichier" et sĂ©lectionnez votre fichier de quiz (voir `quiz_exemple.txt`) -2. **Connecter les modules** : Cliquez sur "Connecter un module" et sĂ©lectionnez votre ESP32-S3 dans la liste Bluetooth -3. **Lancer le quiz** : Naviguez entre les questions, les modules rĂ©pondent en appuyant sur leurs boutons -4. **RĂ©pĂ©tez** pour connecter plusieurs modules simultanĂ©ment +2. **Connecter les modules** : Cliquez sur "Connecter un module" et sĂ©lectionnez votre ESP32 +3. **Premier appairage** : Entrez le code **123456** quand demandĂ© (Android/iOS) +4. **Appairages suivants** : La connexion se fait automatiquement sans code +5. **Lancer le quiz** : Naviguez entre les questions, les modules rĂ©pondent en appuyant sur leurs boutons +6. **RĂ©pĂ©tez** pour connecter plusieurs modules simultanĂ©ment + +**Note sur l'appairage** : +- **PremiĂšre connexion** : Le systĂšme demande un code PIN (**123456**) +- **Connexions suivantes** : L'appairage est mĂ©morisĂ©, reconnexion automatique +- **Android/iOS** : L'appairage sĂ©curisĂ© amĂ©liore grandement la compatibilitĂ© +- **Ubuntu/Linux** : Fonctionne avec ou sans appairage ## 🌐 Pourquoi HTTPS est nĂ©cessaire ? @@ -249,28 +281,28 @@ CrĂ©ez un fichier texte avec ce format (voir `quiz_exemple.txt`) : ## 🐛 DĂ©pannage -### L'ESP32-S3 n'apparaĂźt pas dans la liste Bluetooth -- VĂ©rifiez que le module est alimentĂ© correctement (USB ou externe 5V) -- Consultez le moniteur sĂ©rie : `pio device monitor` pour voir les messages de dĂ©marrage -- Assurez-vous que le Bluetooth est activĂ© sur votre ordinateur -- Sur Linux, vĂ©rifiez que BlueZ est Ă  jour : `bluetoothctl --version` -- RedĂ©marrez l'ESP32-S3 (bouton RESET ou dĂ©brancher/rebrancher) - -### Pas de donnĂ©es reçues dans l'interface web -- VĂ©rifiez que les UUID correspondent dans `src/main.cpp` et `index.html` -- Consultez la console JavaScript (F12) pour voir les erreurs -- Testez en connectant un GPIO Ă  GND avec un simple fil -- VĂ©rifiez que le module est bien connectĂ© (voyant dans l'interface) - -### DĂ©connexions frĂ©quentes -- RĂ©duisez la distance entre l'ESP32-S3 et l'ordinateur (< 5 mĂštres) -- Assurez-vous que l'alimentation de l'ESP32-S3 est stable (cĂąble USB de qualitĂ©) -- Évitez les interfĂ©rences (WiFi 2.4GHz, micro-ondes) -- Augmentez le dĂ©lai dans la boucle principale si trop de donnĂ©es sont envoyĂ©es +### ProblĂšmes d'appairage Bluetooth + +**Android ne veut pas appairer** : +- Assurez-vous d'entrer le code PIN **123456** quand demandĂ© +- Effacez les appairages Bluetooth prĂ©cĂ©dents dans les paramĂštres Android +- RĂ©initialisez l'ESP32 et rĂ©essayez + +**iOS ne voit pas le module** : +- VĂ©rifiez que le Bluetooth est activĂ© dans les rĂ©glages iOS +- Le module doit ĂȘtre alimentĂ© et le moniteur sĂ©rie doit afficher "Advertising BLE dĂ©marrĂ©" +- iOS peut mettre quelques secondes avant de dĂ©couvrir les pĂ©riphĂ©riques BLE +- Entrez le code **123456** lors du premier appairage + +**Le module n'apparaĂźt pas dans la liste Bluetooth** : +- VĂ©rifiez l'alimentation USB (5V stable) +- Consultez `pio device monitor` pour voir "Code d'appairage : 123456" +- RedĂ©marrez l'ESP32 (bouton RESET) +- Sur Linux, vĂ©rifiez BlueZ : `bluetoothctl --version` ### Erreur "HTTPS required" ou "Bluetooth API not available" -- VĂ©rifiez que vous accĂ©dez bien Ă  `https://localhost:8443` (pas `http://`) -- Utilisez Chrome, Edge ou Opera (pas Firefox ni Safari) +- AccĂ©dez Ă  `https://localhost:8443` (pas http://) +- Navigateurs supportĂ©s : Chrome, Edge, Opera uniquement - Sur Linux, utilisez le script `./start.sh` pour les bons paramĂštres Chrome ### Erreur de compilation PlatformIO @@ -295,7 +327,8 @@ CrĂ©ez un fichier texte avec ce format (voir `quiz_exemple.txt`) : ## 🎯 Notes d'utilisation - **Identification automatique** : Les modules se nomment automatiquement BleQuiz-1 Ă  BleQuiz-8 selon les GPIOs 8, 9, 10 -- **SĂ©curitĂ© BLE** : Le code utilise un mode sans bonding (pas de mĂ©morisation d'appairage) +- **Appairage BLE** : Code PIN fixe **123456** pour le premier appairage, puis reconnexion automatique +- **CompatibilitĂ©** : Appairage sĂ©curisĂ© (bonding) pour Android/iOS, fonctionne aussi sur Ubuntu/Linux - **Web Bluetooth** : La page HTML doit obligatoirement ĂȘtre servie en HTTPS ou via localhost - **DĂ©tection de changement** : Les Ă©vĂ©nements GPIO sont envoyĂ©s instantanĂ©ment lors des transitions HIGH→LOW - **Mode Pull-up** : Les boutons doivent connecter le GPIO Ă  GND (pas Ă  VCC) @@ -329,4 +362,4 @@ pio run -e esp32dev --target upload ## 📄 Licence -Ce projet est open source. Libre d'utilisation, modification et distribution. +Ce projet est open source. Libre d'utilisation, modification et distribution. \ No newline at end of file diff --git a/html/index.html b/html/index.html index d5a293b..8bad50b 100644 --- a/html/index.html +++ b/html/index.html @@ -178,6 +178,23 @@ margin-right: 15px; } + .answer-letter.letter-a { + background: #f44336; + } + + .answer-letter.letter-b { + background: #4CAF50; + } + + .answer-letter.letter-c { + background: #2196F3; + } + + .answer-letter.letter-d { + background: #FFEB3B; + color: #333; + } + .answer-content { display: flex; align-items: center; @@ -1031,7 +1048,7 @@ answerDiv.innerHTML = `
-
${letters[index]}
+
${letters[index]}
${formatText(answer)}
`; diff --git a/src/main.cpp b/src/main.cpp index c760133..0ea9b51 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -3,6 +3,8 @@ #include #include #include +#include +#include #include // Configuration LED WS2812 @@ -128,12 +130,19 @@ void setup() { // Initialisation BLE BLEDevice::init(moduleName.c_str()); - // --- Sécurité BLE : mode sans bonding (pas de mémorisation d'appairage) --- - // Cela permet des reconnexions aprÚs reboot sans problÚme de clés obsolÚtes + // --- Configuration sécurité BLE pour compatibilité Android/iOS --- + // Mode avec bonding pour mémoriser l'appairage BLESecurity *pSecurity = new BLESecurity(); - pSecurity->setAuthenticationMode(ESP_LE_AUTH_NO_BOND); // Pas de bonding, connexion temporaire - pSecurity->setCapability(ESP_IO_CAP_NONE); // Pas de clavier/écran + pSecurity->setAuthenticationMode(ESP_LE_AUTH_REQ_SC_MITM_BOND); // Appairage sécurisé avec bonding + pSecurity->setCapability(ESP_IO_CAP_OUT); // Affichage d'un code (via Serial) pSecurity->setInitEncryptionKey(ESP_BLE_ENC_KEY_MASK | ESP_BLE_ID_KEY_MASK); + pSecurity->setRespEncryptionKey(ESP_BLE_ENC_KEY_MASK | ESP_BLE_ID_KEY_MASK); + + // Activer le static passkey (code fixe : 123456) + uint32_t passkey = 123456; + esp_ble_gap_set_security_param(ESP_BLE_SM_SET_STATIC_PASSKEY, &passkey, sizeof(uint32_t)); + + Serial.println("Code d'appairage : 123456"); // Créer le serveur BLE pServer = BLEDevice::createServer(); @@ -167,10 +176,13 @@ void setup() { // Démarrer l'advertising BLEAdvertising *pAdvertising = BLEDevice::getAdvertising(); pAdvertising->addServiceUUID(SERVICE_UUID); - pAdvertising->setScanResponse(false); - pAdvertising->setMinPreferred(0x0); + pAdvertising->setScanResponse(true); // Activer scan response pour iOS + pAdvertising->setMinPreferred(0x06); // iOS recommande 20ms minimum + pAdvertising->setMaxPreferred(0x12); // iOS recommande 40ms maximum BLEDevice::startAdvertising(); + Serial.println("Advertising BLE démarré"); + // Initialiser l'état des GPIO for (int i = 0; i < NUM_PINS; i++) { int pinState = digitalRead(GPIO_PINS[i]);