| Name | Modified | Size | Downloads / Week |
|---|---|---|---|
| Sources | < 11 hours ago | ||
| _gitignore | < 12 hours ago | 608 Bytes | |
| LICENSE | < 12 hours ago | 34.7 kB | |
| README.md | < 12 hours ago | 40.1 kB | |
| THIRD-PARTY-LICENSES.md | < 12 hours ago | 46.9 kB | |
| Totals: 5 Items | 122.3 kB | 0 |
Mesh126
Système de messagerie et réseau mesh (modem de données HF/VHF/UHF inspiré de la modulation FreeDV DATAC) + messagerie privée chiffrée, en Rust.
Mesh126 porte une même messagerie sur trois profils physiques : en BLU HF,
les formes d'onde OFDM FreeDV DATAC3 / DATAC0 (via libcodec2) ; en FM VHF/UHF
(talkies, mobiles), un modem 4FSK maison, éventuellement protégé par le code
correcteur LDPC de codec2 (profil robuste). Tous transportent 126 octets de charge
utile par trame — d'où le nom. Par‑dessus la couche modem, il ajoute une messagerie légère : 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, et un
serveur TCP de type TNC que l'on pilote depuis n'importe quel client texte
(PuTTY, nc, un terminal…).
Les formes d'onde sont produites par FreeDV/Codec2 : mesh126 ne réimplémente pas
le modem, il s'appuie sur libcodec2 (voir la section Licence).
⚠️ Statut / avertissements. Les trames DATAC ont été validées sur l'air, mais la couche cryptographique et le protocole de messagerie sont maison et n'ont pas fait l'objet d'un audit indépendant : à ne pas utiliser tel quel pour protéger des informations sensibles. Sur les bandes radioamateurs, le chiffrement et l'obscurcissement du contenu sont généralement interdits : n'utilisez alors que le mode RA (en clair, indicatif transmis). L'opérateur reste seul responsable du respect de sa réglementation nationale (plan de bandes, identification, chiffrement).
Sommaire
- Fonctionnalités
- Concepts
- Installation — Linux
- Installation — Windows (MSYS2)
- Prise en main rapide (CLI)
- Le serveur TNC
- Référence des commandes
# - Options du sous‑commande
server - Fichiers créés
- Modes
- Format de trame (résumé)
- Scénarios d'exemple
- Dépannage
- Licence
Fonctionnalités
- Trois profils de liaison commutables à chaud (
# --link) :ssb(DATAC3/DATAC0 OFDM, BLU HF),fm(4FSK, postes FM VHF/UHF),fm-ldpc(4FSK + LDPC rate‑1/2, FM robuste). - En FM, bande commutable (
# --fsk-band wide|narrow) :narrow(250 bd, tons 500–1250 Hz) tient dans un canal FM 12,5 kHz et gagne ~3 dB ;wide(500 bd) va deux fois plus vite. - Niveau d'émission réglable (
# --tx-level) pour doser la déviation FM. - Décodeur à décision douce sur le profil LDPC (~1 dB), données blanchies pour rester robustes aux trames bourrées de zéros.
- Identité ed25519 persistante ; ID court = xxhash32 de la clef publique.
- Canal public en clair et canal privé chiffré bout‑en‑bout (ECDH x25519 dérivé d'ed25519, AEAD ChaCha20‑Poly1305).
- Auto‑annonce de la clef publique dans l'en‑tête quand la place le permet : les pairs apprennent les clefs sans commande explicite.
- Accusés de réception (ACK) avec vérification par empreinte du message déchiffré, et confirmation d'envoi immédiate côté émetteur.
- Relais multi‑sauts avec TTL, anti‑boucle, back‑off aléatoire (mode
pushbooster), et mode répéteur de canal public. - Pseudonymes (≤ 16 car.) diffusés avec les messages et affichés à la place de
l'ID ; mentions
@pseudo/@IDmises en gras dans le canal public. - Serveur TCP type TNC multi‑fenêtres : chaque connexion a sa cible (public ou un pair, désignable par pseudo ou ID), ports dédiés par pair, couleurs ANSI.
- Mesure du niveau et de la qualité (
# niveau) : niveau moyen d'entrée sur 0..32768 et SNR moyen, avec affichage continu optionnel pour régler le gain. - PTT audio stéréo (une voie = trame, l'autre = tonalité de commande PTT), tonalité de réveil VOX.
- Mode RA (radioamateur) : public, en clair, indicatif transmis en tête.
- Persistance : identité, configuration serveur, carnet de pairs (clefs + pseudos) rechargés au démarrage.
- Mode loopback interne pour tester sans radio.
Concepts
Identité et ID. Au premier lancement, mesh126 crée une paire de clefs ed25519
(mesh126-id.key / .pub). L'ID court affiché (8 chiffres hexadécimaux) est le
xxhash32 de la clef publique 32 octets. On s'adresse à un pair par cet ID ou par son
pseudonyme s'il est connu.
Canal public vs privé. Un message envoyé vers public (broadcast) part en
clair. Un message envoyé 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 soit via # announce, soit automatiquement : tout message assez court
embarque la clef publique complète de l'émetteur dans l'en‑tête (« full‑key »).
Pseudonyme. # pseudo <nom> encapsule votre pseudo entre deux & en tête du
payload (&nom&…). À la réception il est associé à votre ID et affiché à la place
de l'ID. Dans le canal public, un message contenant @<votre_pseudo> ou
@<votre_ID> s'affiche en gras pour ressortir.
Relais et répéteur. # relay on demande le relais des trames privées que
vous émettez (elles portent un TTL, sont réémises par les nœuds intermédiaires,
avec anti‑boucle). # relay public on fait de votre station un répéteur de
canal public : elle réémet les messages publics qu'elle entend (utile pour étendre
la couverture). # push on (booster) réémet en plus les trames arrivées à TTL 0.
Installation — Linux
Dépendances
- Rust (édition 2021 ; testé avec rustc 1.75+). Voir https://rustup.rs.
- libcodec2 avec ses en‑têtes de développement, et pkg-config, clang (pour la génération des bindings).
Debian / Ubuntu :
sudo apt update
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
Compilation
git clone <votre-dépôt-sourceforge> mesh126
cd mesh126
cargo build --release
Le binaire est produit dans target/release/mesh126. Copiez‑le où vous voulez :
sudo install -m0755 target/release/mesh126 /usr/local/bin/
Si libcodec2 est installé dans un emplacement non standard, indiquez‑le :
export CODEC2_INCLUDE_DIR=/chemin/vers/include
export CODEC2_LIB_DIR=/chemin/vers/lib
cargo build --release
Installation — Windows (MSYS2)
La version Windows se construit dans l'environnement MSYS2 MINGW64 (toolchain GNU).
1. Installer MSYS2
Téléchargez et installez MSYS2 depuis https://www.msys2.org, puis ouvrez le raccourci « MSYS2 MINGW64 » (barre bleue — pas le shell « MSYS » ni « UCRT »).
2. Dépendances
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 (via rustup‑init de MSYS2 ou l'installeur officiel), puis dans le dossier du projet :
rustup override set stable-x86_64-pc-windows-gnu
export LIBCLANG_PATH=/mingw64/bin # aide bindgen à trouver libclang
3. Compilation
cd /c/Users/<vous>/mesh126
cargo build --release
Binaire : target/release/mesh126.exe.
4. Copier les DLL à côté de l'exécutable
Le binaire MinGW dépend de quelques DLL de /mingw64/bin. Copiez‑les à côté de l'exe
pour pouvoir le lancer hors du shell MSYS2 :
ldd target/release/mesh126.exe | grep -i mingw64 | awk '{print $3}' \
| while read f; do cp "$f" target/release/; done
Vous obtenez notamment libcodec2.dll, libgcc_s_seh-1.dll, libwinpthread-1.dll
dans target/release/. Distribuez ces DLL avec l'exécutable (et, pour
libcodec2.dll, le texte de licence LGPL — voir Licence).
Si
cargon'est pas trouvé dans un shell neuf :export PATH="$PATH:/c/Users/<vous>/.cargo/bin"(ajoutez cette ligne à~/.bashrc).
Prise en main rapide (CLI)
mesh126 a sept sous‑commandes : tx, rx, fsk-tx, fsk-rx, devices, keygen,
server. Sans argument, il affiche son aide.
Test sans radio (loopback par pipe)
mesh126 tx --text "bonjour" | mesh126 rx
Lister les cartes son
mesh126 devices
Émettre (tx)
mesh126 tx [--text "..." | --file CHEMIN | --stdin] [options]
| Option | Effet |
|---|---|
--text "..." |
message texte à émettre |
--file CHEMIN |
émettre le contenu binaire d'un fichier |
--stdin |
émettre les octets lus sur l'entrée standard (jusqu'à EOF) |
--gap-ms MS |
silence entre trames d'un message multi‑trames (défaut 200) |
--vox-tone MS |
tonalité 1500 Hz de MS ms avant le préambule (réveille le VOX) |
--audio |
jouer sur la carte son au lieu de la sortie standard |
--device NOM |
sous‑chaîne du nom du périphérique de sortie |
tx/rxsont les outils modem bruts (octets sans messagerie ni chiffrement), utiles pour tester la chaîne audio ou sniffer le trafic. Ils acceptent aussi--mode(datac0…datac13) pour manipuler d'autres formes d'onde — voir Modes.
Recevoir (rx)
mesh126 rx [options]
| Option | Effet |
|---|---|
--freq-range HZ |
élargit l'acquisition en fréquence de ±HZ (défaut 50) |
--hex |
sort les trames en hexadécimal au lieu de brut |
--audio |
capturer depuis la carte son au lieu de l'entrée standard |
--device NOM |
sous‑chaîne du nom du périphérique d'entrée |
4FSK pour la FM (fsk-tx / fsk-rx)
Équivalents bas niveau de tx/rx pour le modem 4FSK (profil FM), utiles pour
tester la chaîne audio d'un poste FM ou sniffer le trafic 4FSK :
mesh126 fsk-tx [--text "..." | --file CHEMIN | --stdin] [--audio] [--device NOM]
mesh126 fsk-rx [--audio] [--device NOM] [--hex]
Trames brutes (octets, sans messagerie ni chiffrement). La messagerie FM complète se
pilote depuis le serveur (# --link fm ou fm-ldpc).
Générer une identité (keygen)
mesh126 keygen --out ma-station
Écrit ma-station.key (secret, à garder) et ma-station.pub (public), et affiche
l'ID court et la clef publique complète. Sans --out, le préfixe par défaut est
mesh126-id (celui qu'utilise le serveur).
Le serveur TNC
Le mode server ouvre un port TCP et se comporte comme un TNC : on s'y connecte
avec un client texte, on tape des messages (une ligne = un message), et les lignes
commençant par # sont des commandes.
Lancer
mesh126 server --port 7300
# test sans radio :
mesh126 server --port 7300 --loopback
Se connecter avec PuTTY
- Connection type : Raw (surtout pas Telnet/SSH), Host
127.0.0.1, Port7300. - Category → Terminal : cochez Implicit CR in every LF si l'affichage se décale.
- Les couleurs sont en ANSI ; PuTTY les gère par défaut.
Ligne de commande équivalente sous Linux :
nc 127.0.0.1 7300
Fenêtres, cible (focus) et couleurs
Chaque connexion TCP est une fenêtre indépendante avec sa propre cible :
- public (défaut) : ce que vous tapez part en clair en broadcast.
- un pair (via
# focus <pseudo ou ID>, alias# dest) : ce que vous tapez part chiffré vers ce pair.
À la réception, un message est routé vers les fenêtres concernées : les messages publics vers les fenêtres en focus « public », les messages privés vers les fenêtres focalisées sur l'émetteur (repli sur public si aucune). Les réponses système ne vont qu'à la fenêtre qui a émis la commande.
Codes couleur : bleu = système, vert = message public reçu (gras s'il vous mentionne), orange = message privé reçu, rouge = erreur, blanc = votre saisie.
Régler le niveau audio (# niveau)
# niveau affiche le niveau moyen d'entrée sur l'échelle 0..32768 (pleine
échelle 16 bits, valable sur toute carte son) et la qualité de liaison (SNR moyen
des dernières trames décodées) :
# niveau [##--------] 6820/32768 SNR moy 2.1 dB
# niveau on réaffiche cette ligne en continu (toutes les ~2 s, arrêt automatique
au bout de 30 s, ou dès que vous tapez quoi que ce soit) — pratique pour régler le gain
en tournant le potentiomètre. Réglez le volume côté radio/interface pour que le
niveau monte franchement sans jamais approcher 32768 (saturation). Le SNR, lui,
dépend de la liaison (propagation, antenne) et non du volume : il indique si la
station rentre bien.
Un port dédié par pair
--peer-port <ID_hex>:<port> ouvre un port TCP supplémentaire dont les connexions
sont d'emblée focalisées sur ce pair — pratique pour dédier une fenêtre PuTTY à une
conversation privée :
mesh126 server --port 7300 --peer-port 1a2b3c4d:7301
Référence des commandes #
Tapées dans une fenêtre connectée (# help / # ? pour l'aide en ligne).
| Commande | Effet |
|---|---|
# help, # ? |
affiche l'aide |
# id |
affiche mon ID et ma clef publique complète |
# announce |
émet ma clef publique complète (annonce broadcast) |
# peers |
liste les pairs connus : ID [pseudo] = clef publique |
# focus <pseudo\|hex8> | # focus public |
cible de cette fenêtre : un pair (par pseudo ou ID), ou public. Alias : # dest |
# niveau |
niveau moyen d'entrée (0..32768) + qualité de liaison (SNR moyen) |
# niveau on\|off |
affichage continu du niveau (~2 s, arrêt auto 30 s) |
# pseudo <nom> (# nick) |
définit le pseudonyme (≤ 16 car.) diffusé avec mes messages ; sans argument, l'efface |
# relay on\|off |
demande de relais sur les trames privées que j'émets |
# relay public on\|off |
mode répéteur : réémet les messages du canal public entendus |
# push on\|off |
booster : relaie aussi les trames arrivées à TTL 0 (sans décrémenter) |
# callsign F4XYZ |
saisit l'indicatif : active le mode RA et sauvegarde |
# ra on\|off |
(dé)active le mode radioamateur (public, en clair, indicatif en tête) |
# --key PREFIX |
charge une autre identité <PREFIX>.key/.pub |
# --loopback on\|off |
boucle interne pour tester sans radio (défaut off = carte son) |
# --in-device "NOM" |
périphérique de capture (RX) |
# --out-device "NOM" |
périphérique de lecture (TX) |
# --device "NOM" |
entrée et sortie sur le même périphérique (codec USB unique) |
# --vox-tone MS |
tonalité VOX avant le préambule (0 = off) |
# --ptt on\|off |
PTT stéréo : une voie = trame, l'autre = tonalité PTT |
# --ptt-freq HZ |
fréquence de la tonalité PTT |
# --ptt-channel L\|R |
voie du PTT : left|right (la trame va sur l'autre) |
# --gap-ms MS |
silence entre bursts d'un message multi‑trames |
# --freq-range HZ |
demi‑fenêtre de recherche fréquence du démodulateur (±HZ) |
# --link ssb\|fm\|fm-ldpc |
profil physique : ssb (DATAC OFDM, BLU HF), fm (4FSK, poste FM), fm-ldpc (4FSK + LDPC, FM robuste) |
# --fsk-band narrow\|wide |
bande FSK des profils FM : wide = 500 bd, narrow = 250 bd (tient dans 12,5 kHz) |
# --tx-level PCT |
niveau d'émission en % (1–100) : dose la déviation FM (défaut 100) |
# --color on\|off |
couleur ANSI |
Les réglages
# --…, les pseudos et les relais sont sauvegardés dans le fichier de configuration et rechargés au prochain démarrage. Le mode d'émission n'est pas configurable côté serveur (voir Modes).
Options du sous‑commande server
mesh126 server [options] [config initiale…]
| Option | Effet |
|---|---|
--port N |
port TCP d'écoute (défaut 7300) |
--bind IP |
adresse d'écoute (défaut toutes interfaces) |
--config CHEMIN |
fichier de configuration (défaut mesh126-server.cfg) |
--peer-port <ID_hex>:<port> |
ouvre un port dédié focalisé sur ce pair (répétable) |
| config initiale | tout jeton --… accepté par les commandes # peut être passé au lancement |
Exemple :
mesh126 server --port 7300 --vox-tone 300 --pseudo Bibi
Fichiers créés
Dans le dossier de travail (ou le dossier du --config) :
| Fichier | Contenu |
|---|---|
mesh126-id.key |
clef secrète ed25519 (à protéger, ne pas partager) |
mesh126-id.pub |
clef publique ed25519 |
mesh126-server.cfg |
configuration du serveur (PTT, VOX, gap, périphériques, pseudo, relais, couleur…) |
mesh126-peers.txt |
carnet de pairs appris : clef publique [pseudo], rechargé au démarrage |
Le carnet mesh126-peers.txt est réécrit automatiquement dès qu'une nouvelle clef ou
un nouveau pseudo est appris ; les identités des correspondants survivent donc au
redémarrage (avant, tout repartait de zéro).
Modes & profils de liaison
Mesh126 porte la même messagerie (chiffrement, ACK, relais, pseudos) sur trois
profils physiques, choisis à chaud côté serveur par # --link et sauvegardés.
ssb — DATAC OFDM (HF, BLU) — défaut
Les messages partent en DATAC3 (126 o utiles/trame, burst ≈ 3,2 s, LDPC interne, très bas SNR) et les accusés en DATAC0 (14 o). La réception décode les deux en parallèle. Mode historique, pour la BLU HF.
fm — 4FSK (VHF/UHF, postes FM)
4FSK à enveloppe constante, pour un poste FM (talkie 433 MHz, mobile VHF…) via sa prise micro/HP. Un seul démodulateur lit messages (126 o) et accusés (14 o), distingués par deux mots uniques.
fm-ldpc — 4FSK + LDPC (FM robuste)
Comme fm, mais chaque trame est protégée par le code correcteur LDPC rate‑1/2 de
codec2 (code H_1024_2048_4f, décision douce). ~1 dB de sensibilité en plus et une
dégradation bien plus douce au seuil — le mode de secours des liaisons FM difficiles.
Bande FSK — # --fsk-band (profils FM)
| Bande | Tons | Rapidité | Débit brut | Occupation |
|---|---|---|---|---|
wide (défaut) |
1000 / 1500 / 2000 / 2500 Hz | 500 bd | ~1000 bit/s | large |
narrow |
500 / 750 / 1000 / 1250 Hz | 250 bd | ~500 bit/s | ~moitié |
Les tons narrow tombent au cœur du passe‑bande d'un poste FM étroit (les tons hauts
de wide se font raboter par le filtre FI), et narrow tient dans un canal FM 12,5 kHz
tout en gagnant ~3 dB. ⚠️ Les deux stations doivent choisir la même bande.
Niveau d'émission — # --tx-level (1–100 %)
Dose l'amplitude audio, donc la déviation FM. Une surdéviation déborde le canal et empêche la station d'en face de décoder : réglez le niveau (et la FM étroite du poste) pour une occupation ~10 kHz, largeurs égales des deux côtés. Reproductible et par plateforme (persisté).
Sensibilité & débit (ordres de grandeur)
Valeurs DATAC d'après la doc codec2 ; valeurs FSK estimées (théorie + pertes d'implémentation). SNR rapporté en 3 kHz, canal AWGN ; la FM ajoute un effet de seuil.
| Profil | Débit charge utile (~) | FEC | Sensibilité (~) |
|---|---|---|---|
| DATAC3 (SSB, messages) | 321 bit/s | LDPC (2048,1024) doux | ~0 dB (MPP) / −3 dB (AWGN) |
| DATAC0 (SSB, ACK) | 291 bit/s | LDPC (256,128) doux | ~0 dB (MPP) |
| 4FSK wide | ~820 bit/s | — | ~+6 dB |
| 4FSK narrow | ~410 bit/s | — | ~+3 dB |
| 4FSK+LDPC wide | ~450 bit/s | LDPC (2048,1024) | ~+3 dB |
| 4FSK+LDPC narrow | ~225 bit/s | LDPC (2048,1024) | ~0 dB |
Règle pratique, à puissance égale : liaison franche → fm wide (rapide) ; liaison
qui faiblit → fm narrow ou fm-ldpc wide ; liaison difficile → fm-ldpc narrow
(le plus robuste en FM) ; HF/BLU → ssb (DATAC, le plus sensible grâce à la décision
douce OFDM).
Essais bas niveau
mesh126 tx/rx manipulent les formes d'onde DATAC brutes (--mode
datac0|datac1|datac3|datac4|datac13) ; mesh126 fsk-tx/fsk-rx font de même pour le
4FSK brut. Ces trames ne sont pas des messages compris par le serveur.
Particularités
- 126 octets de charge utile par trame sur tous les profils — d'où le nom Mesh126.
- Blanchiment (whitening) des données sur les deux chemins FM : une trame bourrée de zéros (message court complété à 126 o) produirait sinon des centaines de symboles identiques et ferait décrocher l'horloge du démod ; un XOR par une PRBS garantit des transitions quel que soit le contenu. Les deux stations doivent évidemment partager la même convention (c'est le cas entre instances Mesh126).
- Décision douce sur le profil LDPC : magnitudes des tons → LLR, et corrélation douce du mot unique pour tenir la synchro plus bas — ~1 dB gagné face à la décision dure, le plancher résiduel étant l'acquisition du démod fsk lui‑même.
Format de trame (résumé)
Le premier octet est l'octet de contrôle. Ses bits :
| 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 |
la source est portée en clef publique 32 o (auto‑annonce) |
0xC0 TTL |
2 bits de TTL (max 3 ≈ 4 sauts) |
Selon les bits, l'en‑tête qui suit contient des ID courts (4 o) ou des clefs
publiques complètes (32 o), puis le payload (clair en public, chiffré en privé :
nonce(12) | longueur(1) | ciphertext+tag). Le pseudo, quand il est défini, est
encapsulé &pseudo& en tête du payload (donc chiffré en privé, en clair en public).
Les ACK sont des trames DATAC0 de 14 octets (dst, src, empreinte du message).
Chiffrement : ECDH x25519 (dérivé des clefs ed25519), secret partagé → clef ChaCha20‑Poly1305 ; l'empreinte d'ACK porte sur le clair déchiffré.
Scénarios d'exemple
Chat public local (2 stations, en loopback pour tester) :
# --loopback on
# pseudo Alice
salut à tous
En face, Bob voit : Alice> salut à tous.
Message privé chiffré : une fois la clef d'un pair apprise (# peers la montre),
focalisez dessus (par pseudo ou par ID) et écrivez :
# focus Bibi
rendez-vous 14h30
À l'envoi, la fenêtre confirme # → chiffré pour Bibi, envoyé (attente d'accusé) ;
puis, quand le destinataire a reçu et déchiffré, ✓ Bibi a bien reçu votre message.
Station répéteur de canal public :
# relay public on
La station réémet désormais les messages publics qu'elle entend (couverture étendue). L'anti‑boucle garantit que chaque trame n'est réémise qu'une fois par répéteur.
Mode radioamateur (bandes RA, en clair) :
# callsign F4NLJ
CQ CQ de F4NLJ
Émis en clair, indicatif en tête ; les correspondants voient F4NLJ> CQ CQ de F4NLJ.
Mention dans le canal public : si quelqu'un écrit @Alice on se cale sur 40 m,
la ligne apparaît en gras chez Alice.
Dépannage
cargo: command not found(MSYS2). Le dossier.cargo/binn'est pas dans le PATH :export PATH="$PATH:/c/Users/<vous>/.cargo/bin"(à mettre dans~/.bashrc).libclangintrouvable à la compilation.export LIBCLANG_PATH=/mingw64/bin(Windows) ; installez le paquetclang/libclang-dev(Linux).- L'exe Windows ne démarre pas (DLL manquante). Copiez
libcodec2.dll,libgcc_s_seh-1.dll,libwinpthread-1.dllà côté demesh126.exe(voir Installation). - Premier message avalé / caractères parasites dans PuTTY. Utilisez bien Raw (pas Telnet). Le serveur filtre déjà la négociation Telnet, mais Raw évite tout souci.
- Texte d'une couleur inattendue. Le serveur force le blanc en fin de ligne ;
si besoin,
# --color offdésactive l'ANSI. - Rien n'est décodé sur l'air. Ouvrez
# niveau on: le niveau moyen doit monter franchement sans approcher 32768, et un SNR apparaître dès qu'une trame décode. Vérifiez que la radio est en USB, que les deux stations sont sur la même fréquence (±50 Hz), et élargissez au besoin l'acquisition (# --freq-range 100).
Licence
Le code source de Mesh126 est distribué sous GNU General Public
License v3.0 (fichier LICENSE).
Composants tiers. Mesh126 se lie à Codec2 / FreeDV (API freedv_api.h),
diffusé sous LGPL v2.1 : en distribuant un binaire qui l'inclut — notamment le
paquet Windows contenant 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). L'inventaire complet et le texte intégral de ces
licences figurent 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 les obligations ci‑dessus, satisfaites par la liaison dynamique. Je ne suis pas juriste : orientation technique, pas avis juridique.
Appli Android Mesh126 — Mode d'emploi
Mesh126 est une messagerie texte par radio pour téléphone Android. Elle transforme les messages en signal audio FreeDV DATAC3 (modem OFDM de codec2), qui passe dans un émetteur-récepteur par sa prise audio, en HF comme en VHF/UHF. Elle parle le même protocole que le serveur Mesh126 pour PC : les deux logiciels peuvent échanger des messages entre eux.
ℹ️ FM / 4FSK. Les profils FM (
fm,fm-ldpc) sont pour l'instant disponibles côté PC (serveur Mesh126). L'appli Android émet et reçoit en DATAC (BLU HF) ; le pendant 4FSK pour dialoguer avec un poste FM est prévu dans une version ultérieure.
Ce que fait l'application :
- un canal public où tout le monde lit tout, avec pseudonymes et mentions
@pseudo; - des messages privés chiffrés de bout en bout vers une station précise, avec accusé de réception ;
- un mode radioamateur (RA) conforme aux bandes amateur : public, en clair, indicatif dans chaque trame ;
- le relais automatique des messages, jusqu'au mode répéteur complet.
1. Ce qu'il faut
Téléphone. Android 8.0 ou plus récent, processeur 64 bits ARM (arm64-v8a, soit la quasi-totalité des téléphones depuis 2017).
Liaison audio avec la radio, au choix :
- une interface audio USB branchée en OTG (type Digirig ou carte son USB) : c'est la solution la plus fiable ;
- un câble audio sur la prise casque/micro du téléphone ;
- pour un simple essai, le haut-parleur et le micro du téléphone tenus près de la radio.
Radio. Un émetteur-récepteur réglé en USB (ou en mode DATA/DIG s'il existe), avec le VOX activé. Mesh126 ne commande pas le PTT : c'est le VOX de la radio (ou de l'interface) qui passe en émission quand le signal arrive.
2. Installation
Depuis l'APK publié
- Téléchargez le fichier
Mesh126-x.y.z.apkdepuis la page SourceForge du projet, directement sur le téléphone. - Ouvrez-le. Android demande d'autoriser l'installation d'applications depuis le navigateur ou le gestionnaire de fichiers : acceptez pour cette source.
- Installez, puis ouvrez Mesh126.
Depuis les sources
La procédure de compilation (SDK Android, NDK, Rust et cargo-ndk, puis ./gradlew assembleDebug) est décrite dans le fichier README.md du dépôt.
3. Premier lancement
L'écran principal s'ouvre, vide. Touchez l'icône ⚙ en haut à droite pour ouvrir les Paramètres, puis :
- Indicatif : saisissez votre indicatif radioamateur (12 caractères au maximum). Saisir un indicatif active automatiquement le mode RA (voir §6).
- Pseudonyme (facultatif) : le nom sous lequel les autres stations vous verront, 16 caractères au maximum, sans le caractère
&. - Entrée et Sortie : choisissez l'interface audio. « Défaut du système » convient dans la plupart des cas ; une interface USB apparaît dans la liste une fois branchée.
- Touchez Démarrer le modem.
Au premier démarrage, Android demande deux autorisations :
- le micro : obligatoire, sans lui aucune réception n'est possible ;
- les notifications (Android 13 et plus) : recommandées, pour voir que le modem tourne en arrière-plan.
Une notification permanente « Mesh126 à l'écoute » apparaît alors. Le modem continue de recevoir écran éteint. Pour l'arrêter : Arrêter le modem dans les Paramètres, ou le bouton Arrêter de la notification.
Au premier démarrage, Mesh126 crée aussi votre identité : une paire de clés cryptographiques propre au téléphone. Son identifiant court (8 caractères hexadécimaux, par exemple 00979cc9) et la clé publique complète s'affichent dans les Paramètres. Un appui sur la clé la copie.
4. Réglage audio
Niveau de réception
Quand le modem tourne, une barre fine s'affiche entre le fil de messages et la liste déroulante. Elle indique la crête du signal qui arrive de la radio :
| Couleur | Signification | Action |
|---|---|---|
| Verte | niveau correct | rien |
| Orange | crêtes au-dessus de −6 dBFS, peu de marge | baisser un peu |
| Rouge (tenu 1 s) | saturation | baisser nettement |
Réglez le volume côté radio ou interface (le niveau micro ne se règle pas dans Android) pour que la barre reste verte, vers la moitié ou les deux tiers, sur un signal fort. Un niveau trop faible est moins grave qu'une saturation.
Niveau d'émission
Dans les Paramètres :
- Gain TX (−30 à +6 dB) : ajustez-le pour que la radio émette sans que l'ALC ne travaille, ou très peu. Le signal OFDM a des crêtes élevées : un ALC trop sollicité le déforme et le rend illisible au loin. Commencez vers −6 dB et montez prudemment.
- Pré-déclenchement VOX (0 à 500 ms) : ajoute une tonalité à 1500 Hz avant chaque émission, pour laisser au VOX le temps de basculer avant le début du message. Si les correspondants reçoivent mal vos messages alors que votre niveau est bon, augmentez cette valeur (150 à 300 ms suffisent en général).
Réglages côté radio
- mode USB (ou DATA-U), filtre d'au moins 2,4 kHz ;
- VOX activé, avec un délai de retombée d'environ 0,5 s ;
- compresseur de modulation, égaliseur et réducteur de bruit désactivés ;
- les deux stations doivent être sur la même fréquence à ±50 Hz près.
5. L'écran principal
De haut en bas, trois zones.
5.1 Le fil de messages
Les messages s'affichent du plus ancien au plus récent : le dernier est en bas, visible sans faire défiler. Si vous remontez lire l'historique, l'arrivée d'un message ne vous ramène pas en bas.
| Couleur | Ligne |
|---|---|
| Vert | message public reçu : heure · pseudo > texte |
| Orange | message privé reçu |
| Blanc | vos messages : heure > texte (public) ou heure → pseudo > texte (privé) |
| Bleu | information du système (clé apprise, annonce…) |
| Rouge | erreur (clé inconnue, déchiffrement impossible…) |
Quelques repères :
- l'expéditeur s'affiche par son pseudonyme s'il est connu, sinon par son identifiant court (ou son indicatif en mode RA) ;
- une ligne reçue qui vous mentionne (
@votre_pseudoou@votre_identifiant) s'affiche en gras ; - un ✓ vert à la fin d'un de vos messages privés signifie que le destinataire l'a reçu et déchiffré (accusé de réception) ;
- un appui long sur une ligne copie son texte.
Les 200 derniers messages sont conservés d'un lancement à l'autre.
5.2 La liste déroulante des messages privés
Par défaut elle affiche Canal public : vos messages sont lus par tout le monde.
Dépliez-la pour choisir une station connue, affichée comme pseudo · identifiant. Le choix passe en orange, et vos messages partent alors chiffrés, lisibles uniquement par cette station. Revenez sur Canal public pour reparler à tous.
En mode RA, la liste reste figée sur « Canal public (mode RA) », puisque le privé y est interdit.
5.3 La saisie
Tapez le message, puis touchez la flèche d'envoi. Sur le canal public, pour vous adresser à quelqu'un, écrivez simplement @pseudo dans le texte : chez lui, la ligne apparaîtra en gras.
Sous le champ, une ligne rouge apparaît seulement quand quelque chose bloque ou retarde l'envoi : modem arrêté, mode RA sans indicatif, clé du correspondant inconnue, émission en cours.
Un message long est découpé automatiquement en plusieurs trames. Chacune apparaît sur sa propre ligne, chez vous comme chez le correspondant.
6. Public, privé et mode radioamateur
Mode RA (radioamateur)
À utiliser sur les bandes radioamateur, où le chiffrement est interdit et l'identification obligatoire.
- Tous les messages sont publics et en clair.
- Votre indicatif est inclus dans chaque trame.
- Les messages privés sont refusés.
Le mode RA s'active automatiquement quand vous saisissez un indicatif, et se désactive dans les Paramètres.
Hors mode RA
Réservé aux fréquences où vous êtes autorisé à chiffrer (cadre d'exercice ou de service, liaison filaire de test…). Vous êtes seul responsable du respect de la réglementation de la fréquence utilisée.
- Les messages publics portent votre identifiant (et votre pseudonyme s'il est défini).
- Les messages privés sont chiffrés de bout en bout : échange de clés x25519 et chiffrement ChaCha20-Poly1305. Seul le destinataire peut les lire, même quand d'autres stations les relaient. Chaque message privé reçu déclenche un accusé de réception automatique.
Comment les stations se connaissent
Pour écrire en privé à quelqu'un, il faut connaître sa clé publique. Mesh126 l'apprend de trois façons :
- automatiquement : quand la place le permet, chaque message emporte la clé publique complète de son expéditeur. Il suffit donc généralement que la station vous ait envoyé un message court (par exemple « CQ ») pour apparaître dans la liste des privés ;
- par une annonce : le bouton Annoncer ma clef publique, dans les Paramètres, émet votre clé seule ;
- depuis la mémoire : les stations déjà connues et leurs pseudonymes sont enregistrés et rechargés à chaque démarrage du modem.
Une ligne bleue « clef de xxxxxxxx apprise » signale chaque nouvelle station.
7. Relais
Trois interrupteurs dans les Paramètres, tous désactivés par défaut.
Relais : demande aux autres stations de relayer vos messages privés, sur 3 sauts au maximum. Le canal public n'est jamais relayé par cette option.
Push TTL : donne une dernière chance aux messages en fin de parcours. Une trame qui arrive avec son compteur de sauts à zéro est quand même relayée une fois par votre station.
Relais canal public (mode répéteur) : votre station réémet tous les messages publics qu'elle entend. À activer uniquement sur une station placée en point haut pour servir de répéteur.
Dans tous les cas, une station ne relaie un même message qu'une seule fois, et renonce si elle entend qu'une autre l'a déjà fait. Vos propres messages ne sont jamais relayés par vous-même.
8. Essai sans radio
- Dans les Paramètres, activez Démoduler pendant l'émission (test HP → micro).
- Sortie audio : haut-parleur ; entrée : micro intégré.
- Démarrez le modem et envoyez un message court dans un endroit calme, volume moyen.
Le téléphone entend sa propre émission. Le message apparaît deux fois : en blanc à l'envoi, puis dans la couleur des messages reçus quand il est décodé. Cela valide toute la chaîne audio. Avec deux téléphones posés l'un en face de l'autre, vous pouvez aussi tester un échange complet.
Pensez à désactiver cette option pour l'usage normal.
9. Fonctionner avec le serveur PC Mesh126
Mesh126 et le serveur Mesh126 partagent exactement le même code de protocole. Un poste fixe sous Mesh126 et des téléphones sous Mesh126 communiquent donc directement : public, privé, accusés de réception, relais, pseudonymes.
Correspondance des réglages :
| Mesh126 — appli (Paramètres) | Mesh126 — serveur PC (commande) |
|---|---|
| Indicatif | # callsign F4XYZ |
| Mode RA | # ra on / # ra off |
| Pseudonyme | # pseudo NOM |
| Relais | # relay on |
| Push TTL | # push on |
| Relais canal public | # relay public on |
| Annoncer ma clef publique | # announce |
10. Dépannage
Rien n'est décodé
- Vérifiez la barre de niveau : elle doit bouger et rester verte.
- Vérifiez que la radio est en USB, sur la bonne fréquence à ±50 Hz près, filtre large, réducteur de bruit coupé.
- Vérifiez l'entrée audio choisie dans les Paramètres. Pour la changer, arrêtez d'abord le modem.
Mes correspondants ne me décodent pas
- Baissez le gain TX (ALC saturé).
- Augmentez le pré-déclenchement VOX : le début du message est peut-être coupé.
- Vérifiez que la radio passe bien en émission : la ligne « Émission en cours » doit apparaître pendant l'envoi.
« Clef de xxxxxxxx inconnue » Vous n'avez encore jamais reçu la clé de cette station. Demandez-lui d'envoyer un message court ou d'Annoncer sa clef publique.
Le modem s'arrête tout seul en arrière-plan Certains fabricants (Xiaomi, Huawei, Samsung…) arrêtent les applications de façon agressive. Dans les réglages Android, section Batterie, retirez Mesh126 de l'optimisation de la batterie.
L'interface USB n'apparaît pas Débranchez puis rebranchez-la, modem arrêté. Si elle n'apparaît toujours pas, le téléphone ne prend peut-être pas en charge l'audio USB en OTG : essayez un autre adaptateur OTG.
La liste des privés est vide au lancement Elle se remplit au démarrage du modem, qui recharge alors les stations mémorisées.
11. Données enregistrées sur le téléphone
Tout est stocké dans l'espace privé de l'application, et rien n'est envoyé ailleurs que sur l'air :
- votre identité (clé privée et clé publique) ;
- les stations connues (clés publiques et pseudonymes) ;
- les 200 derniers messages ;
- vos réglages.
Désinstaller Mesh126 efface l'ensemble. Votre clé privée ne quitte jamais le téléphone : si vous réinstallez l'application, vous aurez une nouvelle identité, et vos correspondants devront réapprendre votre clé.
12. Limites connues
- Pas de commande de PTT ni de CAT : l'émission repose sur le VOX.
- Modem DATAC3 uniquement pour les messages (126 octets par trame, environ 3,4 s d'émission par trame). Les accusés de réception utilisent DATAC0.
- Messages publics identiques : deux messages publics identiques envoyés à peu d'intervalle (par exemple « 73 » deux fois) peuvent n'être affichés qu'une fois chez le correspondant, car le second est pris pour un relais du premier.
- Pseudonyme : il occupe quelques octets dans chaque trame, ce qui réduit un peu la place pour le texte.