1. Architecture Système

GM-CONNECT repose sur un modèle de séparation stricte entre les composants d'accès local et de transport radio longue portée. Le téléphone client interagit avec le nœud ESP32 via un réseau Wi-Fi local sécurisé en HTTPS (port 443), servit directement par le serveur web embarqué du microcontrôleur.

Les tâches FreeRTOS découplées gèrent la radio de façon asynchrone :

  • TaskRadioTX : dépile les trames depuis la file prioritaire RadioQueue et exécute les émissions SX1262.
  • TaskRadioRX : écoute continue sur l'interruption DIO1 du SX1262, déchiffre les datagrammes et alimente le pool de réassemblage.

2. Routage Radio Mesh

Chaque datagramme radio transporte un en-tête compact PacketHeader (43 octets) comprenant un champ TTL décrémenté à chaque saut et un identifiant de message unique messageId.

Le module MeshRouter implémente :

  • Dédoublonnage : un cache LRU circulaire de 64 entrées mémorise les hashes des paquets vus. Un paquet déjà reçu n'est jamais rediffusé.
  • Relais Unicast Optimisé : si un paquet Unicast est destiné au nœud local, sa rediffusion radio cesse immédiatement après remise locale, préservant ainsi le duty cycle réglementaire (1%).

3. Transport AEAD & Nonces

Tous les paquets applicatifs (Text, TextAck, VoiceFile) sont chiffrés avec l'algorithme ChaCha20-Poly1305 AEAD via l'API PSA de mbedTLS.

Le header du paquet fait office de Donnée Authentifiée Associée (AAD), garantissant que toute altération des adresses source/destination ou du type de paquet par un attaquant provoque le rejet immédiat du paquet par le récepteur.

4. Fenêtre Anti-Rejeu Glissante (64 bits)

Pour tolérer le réordonnancement des paquets inhérent aux réseaux maillés multi-sauts sans sacrifier la sécurité, GM-CONNECT emploie une fenêtre anti-rejeu glissante de 64 bits (similaire à IPsec/WireGuard).

Le compteur de nonces le plus élevé vu (highest) et le masque de bits (bitmap) sont conservés en mémoire flash NVS pour chaque pair appairé.

5. API REST HTTPS Locale

L'interface PWA communique avec l'ESP32 via des endpoints JSON :

  • GET /api/status : renvoie l'identifiant matériel LC-XXXXXXXX, le nom mDNS, le protocole et la liste des pairs.
  • GET /api/messages : retourne la liste des messages stockés localement au format NDJSON.
  • POST /api/messages : ajoute un message texte à la file d'émission radio.
  • GET /api/pairs & POST /api/pairs : consultation et ajout d'un pair authentifié.

6. Mémos Vocaux Asynchrones

La PWA enregistre l'audio via l'API HTML5 MediaRecorder (limité à 120 secondes par enregistrement). La donnée audio capturée est fragmentée et émise en priorité radio VoiceFile pour ne pas bloquer les messages texte d'urgence.

7. Dépannage & Logs Série

En cas d'absence de certificat TLS, la carte démarre en mode provisionnement série à 115200 bauds. Connectez la carte en USB sur la page d'accueil pour signer la CSR émise et injecter automatiquement les certificats.