Download Latest Version Mesh126_win_x64.zip (1.4 MB) Google Add to Preferred Sources
Home
Name Modified Size InfoDownloads / Week
Sources 2026-10-04
README.md 2026-10-04 22.2 kB
Mesh126 2026-10-04 1.3 MB
Mesh126.apk 2026-10-04 10.6 MB
Mesh126_win_x64.zip 2026-10-04 1.4 MB
_gitignore 2026-10-01 608 Bytes
LICENSE 2026-10-01 34.7 kB
THIRD-PARTY-LICENSES.md 2026-10-01 46.9 kB
Totals: 8 Items   13.3 MB 0

Mesh126

Messagerie radio chiffrée et réseau mesh, pour PC et Android. Modem de données HF/VHF/UHF (formes d'onde FreeDV DATAC et 4FSK+LDPC), messagerie privée chiffrée de bout en bout, relais multi‑sauts. En Rust.

Mesh126 porte une même messagerie sur deux profils physiques :

  • ssb — OFDM FreeDV DATAC3 / DATAC0 (via libcodec2), pour la BLU HF ;
  • fm-ldpc — 4FSK + code correcteur LDPC rate‑1/2, bande étroite (250 bauds, canal FM 12,5 kHz), pour les postes FM VHF/UHF (talkies, mobiles).

Les deux transportent 126 octets de charge utile par trame — d'où le nom. Le même code de protocole tourne côté PC (serveur TCP de type TNC) et côté Android (appli) : les deux dialoguent directement entre eux.

Par‑dessus la couche modem : identités ed25519, canal public en clair, canal privé chiffré de bout en bout (x25519 + ChaCha20‑Poly1305), accusés de réception, relais multi‑sauts, mode répéteur, pseudonymes.

Mesh126 ne réimplémente pas les modems : il s'appuie sur libcodec2 pour les formes d'onde DATAC et pour le code LDPC du profil FM (voir Licence).

⚠️ Statut / avertissements. Fonctionne de bout en bout, validé sur l'air (PC↔PC, PC↔Android, Android↔Android). La couche cryptographique et le protocole de messagerie sont maison et n'ont pas été audités : à ne pas utiliser tel quel pour protéger des informations sensibles. Sur les bandes radioamateurs, le chiffrement est généralement interdit : n'utilisez alors que le mode RA (en clair, indicatif transmis). L'opérateur reste seul responsable du respect de sa réglementation (plan de bandes, identification, chiffrement).


Sommaire


Fonctionnalités

  • Deux profils de liaison, commutables à chaud, même forme d'onde PC et Android : ssb (DATAC OFDM, BLU HF) et fm-ldpc (4FSK + LDPC narrow, poste FM).
  • Décision dure au décodage : robuste à la désaccentuation et au filtrage d'un poste FM (validé sur l'air).
  • Blanchiment (whitening) des données : un XOR par une PRBS garantit des transitions de symboles quel que soit le contenu (une trame courte complétée de zéros décrocherait sinon l'horloge du démodulateur).
  • Niveau d'émission réglable pour doser la déviation FM.
  • Identité ed25519 persistante ; ID court = xxhash32 de la clef publique.
  • Canal public en clair et canal privé chiffré bout‑en‑bout.
  • Auto‑annonce de la clef publique quand la place le permet : les pairs apprennent les clefs sans commande explicite.
  • Accusés de réception (ACK) avec empreinte du message déchiffré ; confirmation d'envoi immédiate ; coche de réception publique (quand on entend sa propre trame publique relayée par un tiers → « quelqu'un vous reçoit »).
  • Relais multi‑sauts (TTL, anti‑boucle, back‑off, mode push booster) et mode répéteur de canal public.
  • Pseudonymes (≤ 16 car.) et mentions @pseudo / @ID mises en gras.
  • Serveur TCP de type TNC multi‑fenêtres (PC) ; appli graphique (Android).
  • Mesure du niveau et de la qualité (# niveau) pour régler le gain.
  • PTT audio stéréo, tonalité de réveil VOX.
  • Mode RA (radioamateur) : public, en clair, indicatif transmis.
  • Persistance : identité, configuration, carnet de pairs (clefs + pseudos).
  • Mode loopback interne pour tester sans radio.

Les deux profils de liaison

On choisit le profil à chaud (côté PC : # --link ; côté Android : sélecteur dans les Paramètres). Le réglage est sauvegardé. Les deux stations doivent choisir le même profil.

ssb — DATAC OFDM (HF, BLU) — défaut

Les messages partent en DATAC3 (126 o utiles/trame, burst ≈ 3,2 s) et les accusés en DATAC0 (14 o). La réception décode les deux en parallèle. C'est le mode historique, conçu pour la BLU HF à très bas rapport signal/bruit. Les sous‑modes DATAC sont automatiques : on ne choisit que le profil ssb.

fm-ldpc — 4FSK + LDPC narrow (FM VHF/UHF)

4FSK à enveloppe constante (passe le limiteur d'un poste FM), 4 tons à 500/750/1000/1250 Hz, 250 bauds, qui tiennent dans un canal FM étroit 12,5 kHz. Chaque trame est protégée par le code correcteur LDPC rate‑1/2 de codec2 (H_1024_2048_4f). 126 o utiles/trame, burst ≈ 4,5 s. Décision dure au décodage (robuste à la désaccentuation du poste).

Sensibilité & débit (ordres de grandeur)

Profil Débit charge utile (~) Trame FEC Sensibilité
DATAC3 (SSB, messages) 321 bit/s 126 o · 3,2 s LDPC (2048,1024) ~0 dB MPP (doc codec2)
DATAC0 (SSB, ACK) 291 bit/s 14 o · 0,44 s LDPC (256,128) ~0 dB MPP (doc codec2)
fm-ldpc narrow ~225 bit/s 126 o · ~4,5 s LDPC (2048,1024) non mesurée

Honnêteté sur ces chiffres : les valeurs DATAC viennent de la documentation codec2 (canal MultiPath Poor). Pour le 4FSK+LDPC, seul le débit est calculé ; la sensibilité n'a pas été mesurée sur l'air — le profil est simplement validé en pratique, poste à poste. (Une décision douce a été essayée : elle gagne en théorie sur canal propre mais se dégrade sur radio réelle à cause de la désaccentuation des postes, d'où le retour à la décision dure.)


Concepts

Identité et ID. Au premier lancement, Mesh126 crée une paire de clefs ed25519. L'ID court affiché (8 chiffres hexadécimaux) est le xxhash32 de la clef publique. On s'adresse à un pair par cet ID ou par son pseudonyme s'il est connu.

Canal public vs privé. Un message vers public (broadcast) part en clair. Un message vers un pair connu part chiffré (seul ce pair peut le lire), déclenche un ACK et affiche une confirmation d'envoi.

Apprentissage des clefs. Pour chiffrer vers un pair, il faut sa clef publique. Elle s'apprend via une annonce (# announce / bouton Annoncer) ou automatiquement : tout message assez court embarque la clef publique complète de l'émetteur dans l'en‑tête (« full‑key »).

Pseudonyme. Encapsulé entre deux & en tête du payload (&nom&…). À la réception, associé à l'ID et affiché à sa place. Dans le canal public, un message contenant @<votre_pseudo> ou @<votre_ID> s'affiche en gras.

Relais et répéteur. Le relais réémet les trames privées (TTL, anti‑boucle). Le mode répéteur réémet les messages du canal public entendus (couverture étendue). Le push (booster) réémet en plus les trames arrivées à TTL 0. Une station ne relaie jamais ses propres trames, et renonce si elle entend qu'un autre a déjà relayé.

Coche de réception publique. Si vous entendez votre propre trame publique revenir (relayée par un tiers), une coche s'affiche : quelqu'un vous a reçu. En semi‑duplex réel on ne s'entend pas soi‑même, donc toute réception de sa propre trame = un relais. (Le serveur PC ignore par ailleurs ce qu'il décode pendant sa propre émission, pour ne pas confondre son écho avec un relais.)


Installation PC — Linux

Dépendances : Rust (édition 2021, rustc 1.75+), libcodec2 + en‑têtes de dev, pkg-config, clang.

# Debian / Ubuntu
sudo apt install build-essential pkg-config clang libcodec2-dev
# Fedora
sudo dnf install @development-tools pkgconf-pkg-config clang codec2-devel
# Arch
sudo pacman -S base-devel pkgconf clang codec2
git clone <votre-dépôt-sourceforge> mesh126
cd mesh126
cargo build --release
sudo install -m0755 target/release/mesh126 /usr/local/bin/

Si libcodec2 est hors chemins standards : export CODEC2_INCLUDE_DIR=/chemin/include CODEC2_LIB_DIR=/chemin/lib avant cargo build.


Installation PC — Windows (MSYS2)

Se construit dans l'environnement MSYS2 MINGW64 (toolchain GNU, barre bleue).

pacman -Syu          # redémarrez le shell si demandé, puis relancez
pacman -S --needed mingw-w64-x86_64-codec2 mingw-w64-x86_64-clang \
                   mingw-w64-x86_64-pkgconf git

Installez Rust toolchain GNU, puis dans le dossier du projet :

rustup override set stable-x86_64-pc-windows-gnu
export LIBCLANG_PATH=/mingw64/bin
cd /c/Users/<vous>/mesh126
cargo build --release

Binaire : target/release/mesh126.exe. Copiez les DLL à côté de l'exe (sinon il se ferme au démarrage, erreur DLL silencieuse) :

ldd target/release/mesh126.exe | grep -i mingw64 | awk '{print $3}' \
  | while read f; do cp "$f" target/release/; done

Vous obtenez libcodec2.dll, libgcc_s_seh-1.dll, libwinpthread-1.dll (et parfois libstdc++-6.dll). Distribuez ces DLL avec l'exe, et le texte LGPL de libcodec2.dll (voir Licence). Après un cargo clean/rebuild, recopiez les DLL : un target/ neuf les efface.


Le serveur TNC (PC)

Le mode server ouvre un port TCP et se comporte comme un TNC : on s'y connecte avec un client texte, une ligne = un message, les lignes # sont des commandes.

mesh126 server --port 7300
mesh126 server --port 7300 --loopback     # test sans radio

Connexion PuTTY : Connection type Raw (pas Telnet/SSH), Host 127.0.0.1, Port 7300. Sous Linux : nc 127.0.0.1 7300.

Fenêtres et cible (focus). Chaque connexion TCP est une fenêtre avec sa cible : public (défaut, clair, broadcast) ou un pair (via # focus <pseudo|ID>, chiffré). À la réception, un message est routé vers les fenêtres concernées. Couleurs : bleu = système, vert = public reçu (gras si mention), orange = privé reçu, rouge = erreur, blanc = votre saisie.

Régler le niveau (# niveau). Affiche le niveau moyen d'entrée (0..32768) et la qualité (SNR moyen des trames décodées). # niveau on l'affiche en continu (~2 s, arrêt auto 30 s) — réglez le volume côté radio/interface pour monter franchement sans approcher 32768 (saturation).

Port dédié par pair. --peer-port <ID_hex>:<port> ouvre un port d'emblée focalisé sur ce pair (répétable).


Référence des commandes # (PC)

Tapées dans une fenêtre connectée (# help pour l'aide en ligne).

Commande Effet
# help, # ? affiche l'aide
# id mon ID et ma clef publique complète
# announce émet ma clef publique (annonce broadcast)
# peers liste les pairs connus : ID [pseudo] = clef publique
# focus <pseudo\|hex8> | # focus public cible de cette fenêtre (alias # dest)
# niveau | # niveau on\|off niveau d'entrée + qualité (ponctuel ou continu)
# pseudo <nom> (# nick) pseudonyme (≤ 16 car.) ; sans argument, l'efface
# relay on\|off demande de relais sur mes trames privées
# relay public on\|off mode répéteur du canal public
# push on\|off booster : relaie aussi les trames à TTL 0
# callsign F4XYZ saisit l'indicatif : active le mode RA
# ra on\|off (dé)active le mode radioamateur (public, en clair, indicatif en tête)
# --link ssb\|fm-ldpc profil physique : ssb (DATAC OFDM, BLU HF), fm-ldpc (4FSK+LDPC narrow, poste FM)
# --tx-level PCT niveau d'émission en % (1–100) : dose la déviation FM (défaut 100)
# --key PREFIX charge une autre identité <PREFIX>.key/.pub
# --loopback on\|off boucle interne (test sans radio)
# --in-device "NOM" / # --out-device "NOM" / # --device "NOM" périphériques audio
# --vox-tone MS tonalité VOX avant le préambule (0 = off)
# --ptt on\|off / # --ptt-freq HZ / # --ptt-channel L\|R PTT stéréo
# --gap-ms MS silence entre bursts d'un message multi‑trames
# --freq-range HZ demi‑fenêtre de recherche fréquence (±HZ, SSB)
# --color on\|off couleur ANSI

Les réglages # --…, les pseudos et les relais sont sauvegardés et rechargés au démarrage. Seul le profil de liaison (# --link) est configurable ; à l'intérieur de ssb, le choix DATAC3/DATAC0 est automatique.

Options de server : --port N, --bind IP, --config CHEMIN (défaut mesh126-server.cfg), --peer-port <ID_hex>:<port>, et tout jeton --… en config initiale. Exemple : mesh126 server --port 7300 --link fm-ldpc --pseudo Bibi.


Outils en ligne de commande (PC)

mesh126 a aussi des sous‑commandes de diagnostic (sans messagerie ni chiffrement) :

mesh126 tx --text "bonjour" | mesh126 rx      # test modem DATAC par pipe
mesh126 devices                               # lister les cartes son
mesh126 keygen --out ma-station               # générer une identité
  • tx / rx manipulent les formes d'onde DATAC brutes (--mode datac0|datac1|datac3|datac4|datac13), avec --text|--file|--stdin, --audio, --device, --gap-ms, --vox-tone, --freq-range, --hex.
  • fsk-tx / fsk-rx font de même pour le 4FSK brut (chaîne audio d'un poste FM). La messagerie FM complète, elle, se pilote depuis le serveur (# --link fm-ldpc).

Fichiers créés (PC)

Dans le dossier de travail :

Fichier Contenu
mesh126-id.key clef secrète ed25519 (à protéger)
mesh126-id.pub clef publique ed25519
mesh126-server.cfg configuration du serveur
mesh126-peers.txt carnet de pairs (clefs + pseudos), réécrit à chaque apprentissage

Appli Android

L'appli Mesh126 parle exactement le même protocole que le serveur PC, sur les deux mêmes profils (ssb et fm-ldpc narrow) : PC et téléphones communiquent directement (public, privé, accusés, relais, pseudonymes).

Pré‑requis. Android 8.0+, ARM 64 bits. Liaison audio avec la radio : interface USB en OTG (Digirig, carte son USB — le plus fiable), câble sur la prise casque/micro, ou à défaut HP/micro du téléphone près de la radio. Radio : réglée selon le profil (voir Réglages radio), VOX activé (l'appli ne commande pas le PTT).

Installation. Depuis l'APK publié (SourceForge) : ouvrez le .apk, autorisez l'installation depuis cette source, installez. Depuis les sources : SDK/NDK Android, Rust + cargo‑ndk, ./gradlew assembleDebug.

Premier lancement. Icône ⚙ → Paramètres :

  1. Indicatif (active le mode RA) ; Pseudonyme (facultatif).
  2. Entrée / Sortie audio (« Défaut du système » ou une interface USB branchée).
  3. Profil de liaison : SSB (DATAC, BLU HF) ou FM — 4FSK + LDPC (narrow).
  4. Démarrer le modem.

Android demande le micro (obligatoire) et les notifications (recommandées). Une notification « Mesh126 à l'écoute » apparaît ; le modem reçoit écran éteint. Au premier démarrage, l'appli crée aussi votre identité (clefs propres au téléphone), visible dans les Paramètres.

Niveaux. Une barre fine montre la crête d'entrée : verte = bon, orange = peu de marge, rouge = saturation. Réglez le volume côté radio/interface pour rester vert (moitié–deux tiers). En émission, réglez le Gain TX pour ne pas saturer l'ALC (SSB) ou surdévier (FM), et le pré‑déclenchement VOX (150–300 ms) si le début des messages est coupé. L'appli désactive elle‑même l'annulation d'écho, la réduction de bruit et l'AGC d'Android à la capture — indispensable, sans quoi la réduction de bruit prend le signal data pour du bruit et le détruit (c'était le bug du 4FSK sur l'appli).

Écran principal. Fil de messages (le dernier en bas ; vert public reçu, orange privé, blanc vos messages, bleu système, rouge erreur ; un ✓ = privé reçu et déchiffré ; appui long = copier). Liste déroulante de cible (Canal public ou une station pseudo · ID → messages chiffrés). Saisie : @pseudo pour mentionner. Les 200 derniers messages sont conservés.

Public / privé / RA, relais (trois interrupteurs : Relais, Push TTL, Relais canal public), apprentissage des clefs : identiques au PC (voir Concepts). En mode RA, la cible reste figée sur le canal public (privé interdit).

Essai sans radio. Paramètres → « Démoduler pendant l'émission (test HP → micro) » : le téléphone s'entend lui‑même, le message apparaît deux fois (envoi puis décodage). À désactiver pour l'usage normal.

Correspondance des réglages appli ↔ serveur PC :

Appli (Paramètres) Serveur PC (commande)
Profil de liaison # --link ssb / # --link fm-ldpc
Indicatif # callsign F4XYZ
Mode RA # ra on\|off
Pseudonyme # pseudo NOM
Relais / Push TTL / Relais canal public # relay on / # push on / # relay public on
Annoncer ma clef publique # announce

Toutes les données (identité, pairs, 200 messages, réglages) restent dans l'espace privé de l'appli ; rien n'est envoyé ailleurs que sur l'air. La clef privée ne quitte jamais le téléphone. Désinstaller efface tout.


Réglages radio

Selon le profil, les deux stations doivent s'accorder :

Profil ssb (DATAC, HF/BLU)

  • Mode USB (ou DATA‑U), filtre ≥ 2,4 kHz.
  • Compresseur, égaliseur, réducteur de bruit désactivés.
  • Même fréquence à ±50 Hz près (élargir au besoin : # --freq-range 100).
  • VOX ~0,5 s de retombée (ou PTT).

Profil fm-ldpc (4FSK+LDPC, VHF/UHF)

  • Mode FM étroite 12,5 kHz sur les deux postes.
  • Déviation maîtrisée : une surdéviation déborde le canal et empêche le décodage d'en face. Réglez # --tx-level (ou le Gain TX de l'appli) pour une occupation ~10 kHz, largeurs comparables des deux côtés (vérifiable à la cascade d'un SDR).
  • Prise data/flat audio du poste de préférence (prise Kenwood, etc.) : elle contourne la désaccentuation et donne le signal le plus propre.

Format de trame (résumé)

Le premier octet est l'octet de contrôle :

Bit Rôle
0x01 PRIVATE trame chiffrée et adressée
0x02 RELAY demande de relais
0x04 ANNOUNCE annonce de clef publique
0x08 RA mode radioamateur (indicatif en clair)
0x10 FULLKEY source portée en clef publique 32 o (auto‑annonce)
0xC0 TTL 2 bits de TTL (max 3 ≈ 4 sauts)

Suit l'en‑tête (ID courts 4 o ou clefs publiques 32 o) puis le payload : en clair pour le public, nonce(12) | longueur(1) | ciphertext+tag pour le privé. Le pseudo est encapsulé &pseudo& en tête du payload (donc chiffré en privé). Les ACK sont des trames courtes de 14 o (dst, src, empreinte du message).

Chiffrement : ECDH x25519 (dérivé des clefs ed25519) → clef ChaCha20‑Poly1305 ; l'empreinte d'ACK porte sur le clair déchiffré. Sur les deux profils FM, les données sont blanchies (XOR PRBS) avant modulation.


Dépannage

  • L'exe Windows ne démarre pas → DLL manquantes à côté de mesh126.exe (voir Installation Windows). Un target/ reconstruit les efface : recopiez‑les.
  • cargo: command not found (MSYS2) → export PATH="$PATH:/c/Users/<vous>/.cargo/bin".
  • libclang introuvable → export LIBCLANG_PATH=/mingw64/bin (Windows) ; paquet clang/libclang-dev (Linux).
  • Rien n'est décodé → # niveau on (PC) ou la barre (Android) : le niveau doit monter sans approcher la saturation. Vérifiez le même profil des deux côtés, le réglage radio du profil (USB pour ssb, FM étroite pour fm-ldpc), et la fréquence.
  • 4FSK : ça décode sur SDR mais pas sur l'appli → c'était le traitement DSP d'Android (réduction de bruit) ; il est désormais coupé par l'appli. Assurez‑vous d'avoir la dernière version (et, en compilant, un cargo clean dans rust/ pour régénérer la bibliothèque native).
  • Mes correspondants ne me décodent pas (FM) → surdéviation : baissez # --tx-level / le Gain TX. Augmentez la pré‑tonalité VOX si le préambule est coupé.
  • « Clef inconnue » → demandez à la station un message court ou une annonce.
  • Deux messages publics identiques n'apparaissent qu'une fois → le second est pris pour un relais du premier (anti‑doublon).
  • (Android) modem arrêté en arrière‑plan → retirez l'appli de l'optimisation batterie.

Licence

Code source de Mesh126 : GNU General Public License v3.0 (fichier LICENSE).

Composants tiers. Mesh126 se lie à Codec2 / FreeDV (API freedv_api.h, code LDPC), sous LGPL v2.1 : en distribuant un binaire qui l'inclut — notamment le paquet Windows avec libcodec2.dll — joignez le texte de la LGPL v2.1 et les avis de copyright de Codec2, et conservez la liaison dynamique (ce que fait Mesh126). Les bibliothèques Rust employées sont sous licences permissives (MIT / Apache‑2.0, quelques BSD/ISC) ; inventaire complet dans THIRD-PARTY-LICENSES.md.

Réutiliser le format d'onde FreeDV n'impose aucune licence en soi ; c'est la liaison à libcodec2 (LGPL) qui crée ces obligations, satisfaites par la liaison dynamique. Orientation technique, pas avis juridique.

Source: README.md, updated 2026-10-04