| Name | Modified | Size | Downloads / 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 (vialibcodec2), 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
- Les deux profils de liaison
- Concepts
- Installation PC — Linux
- Installation PC — Windows (MSYS2)
- Le serveur TNC (PC)
- Référence des commandes
#(PC) - Outils en ligne de commande (PC)
- Fichiers créés (PC)
- Appli Android
- Réglages radio
- Format de trame (résumé)
- Dépannage
- Licence
Fonctionnalités
- Deux profils de liaison, commutables à chaud, même forme d'onde PC et Android :
ssb(DATAC OFDM, BLU HF) etfm-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/@IDmises 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 dessb, 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/rxmanipulent 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-rxfont 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 :
- Indicatif (active le mode RA) ; Pseudonyme (facultatif).
- Entrée / Sortie audio (« Défaut du système » ou une interface USB branchée).
- Profil de liaison : SSB (DATAC, BLU HF) ou FM — 4FSK + LDPC (narrow).
- 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). Untarget/reconstruit les efface : recopiez‑les. cargo: command not found(MSYS2) →export PATH="$PATH:/c/Users/<vous>/.cargo/bin".libclangintrouvable →export LIBCLANG_PATH=/mingw64/bin(Windows) ; paquetclang/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 pourssb, FM étroite pourfm-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 cleandansrust/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.