Aller au contenu
Interface Utilisateur & UX

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.

LoRa Ready 100%
NODE ID
SRC: 001
MODE
SECURE
LAST TX/RX RAW
SEC1:IV=a8F9...:CT=kLp9...
DECRYPTED
"Hello World"
RSSI
-45 dBm
M5Stack Core

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.

SRC=001;DST=002;MSG=SEC1:IV=d9F...:CT=Kp7...
1
SRC / DST

Identifiants des nœuds (ex: "001", "002") pour le routage.

2
Séparateurs

Le point-virgule (;) délimite les champs majeurs.

3
Payload (MSG)

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. 1

    Émission

    Lorsqu'un message est envoyé, le système attend un ACK (accusé de réception) correspondant à l'ID du message.

  2. 2

    Timeout

    Si aucun ACK n'est reçu sous 3 secondes, le message est considéré comme perdu.

  3. 3

    Retries (Réessais)

    Le système tente de renvoyer le message automatiquement jusqu'à 3 fois avant d'abandonner.

M5Sender M5Receiver MSG (ID=101) ACK (ID=101) Succès

Parsing des Données

Packet_Parser.cpp
// 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)