Interface M5Stack & Protocole Fiable
Visualisation temps réel des échanges sécurisés et implémentation d'un protocole LoRa robuste avec acquittement (ACK) et gestion des erreurs.
Interface graphique
Pour faciliter le débogage et la démonstration, j'ai développé une interface graphique fluide basée sur la librairie M5Unified.
Statut & Sécurité
Affiche l'ID du nœud, l'état de la clé (chargée depuis le Secure Element ou manquante) et le mode (Sécurisé/Non-sécurisé).
Trafic Réseau
Montre le dernier paquet brut envoyé (TX) et reçu (RX). En mode sécurisé, on y voit le format encapsulé (Base64).
Déchiffrement & Qualité
Affiche le RSSI (puissance du signal) et le résultat du déchiffrement immédiat. C'est ici que l'on vérifie que le message redevient lisible.
Structure des Paquets LoRa
Afin de gérer le routage et les types de messages, nous avons défini un protocole strict sous forme de chaîne de caractères.
Identifiants des nœuds (ex: "001", "002") pour le routage.
Le point-virgule (;) délimite les champs majeurs.
Contenu sécurisé : Préfixe SEC1 + IV + Texte Chiffré.
Gestion des Erreurs et ACK
Le LoRa étant un protocole radio 'fire-and-forget' (sans garantie de livraison), j'ai implémenté une couche de fiabilité applicative de type Stop-and-Wait :
-
1
Émission
Lorsqu'un message est envoyé, le système attend un ACK (accusé de réception) correspondant à l'ID du message.
-
2
Timeout
Si aucun ACK n'est reçu sous 3 secondes, le message est considéré comme perdu.
-
3
Retries (Réessais)
Le système tente de renvoyer le message automatiquement jusqu'à 3 fois avant d'abandonner.
Parsing des Données
// Extrait de notre parser de paquets
bool parsePacketFields(const String &packet, String &src, String &dst, String &msg) {
int srcPos = packet.indexOf("SRC=");
int dstPos = packet.indexOf(";DST=");
int msgPos = packet.indexOf(";MSG=");
// Vérification de l'intégrité de la trame
if (srcPos < 0 || dstPos < 0 || msgPos < 0) return false;
// Extraction des sous-chaines
src = packet.substring(srcPos + 4, dstPos);
dst = packet.substring(dstPos + 5, msgPos);
msg = packet.substring(msgPos + 5);
return true;
}
Pourquoi un Parser ?
Le récepteur reçoit une chaîne brute via LoRa. Cette fonction découpe intelligemment la chaîne pour isoler les composants essentiels. Sans cela, impossible de router le message ou de savoir quoi déchiffrer.
-
Qui a envoyé (SRC)
-
Pour qui c'est (DST)
-
Le Payload Chiffré (MSG)