Download Latest Version rocs-en.zip (4.3 MB)
Home
Name Modified Size InfoDownloads / Week
ROCS_en.apk < 17 hours ago 28.7 MB
ROCS_fr.apk < 17 hours ago 31.8 MB
rocs-en.zip < 18 hours ago 4.3 MB
rocs-fr.zip < 18 hours ago 4.3 MB
README.md < 18 hours ago 28.9 kB
LICENSE < 18 hours ago 35.1 kB
SOURCEFORGE.md 2026-10-10 8.2 kB
Totals: 7 Items   69.3 MB 9

ROCS

ROCS — Resilient Organization and Communication System

Conscience situationnelle partagée pour le civil, sans serveur. Une carte hors ligne, la position de chaque équipier, des points d'intérêt, des messages et des alertes, transportés indifféremment par radio LoRa, Wi-Fi local ou Internet. Pas de compte, pas de serveur à installer, pas de plugin.

English summary — ROCS is a serverless, TAK-inspired situational-awareness system for civilian teams (search & rescue, outdoor events, amateur radio emergency groups). An Android app and a PC node share positions, points of interest, messages and alerts over LoRa (Heltec V3 or XIAO ESP32S3 + Wio-SX1262 as a plain radio modem, legal regional presets: EU 868/433, US 915…), local Wi-Fi multicast or all public MQTT brokers at once (TLS, TCP or WebSocket, probed automatically). Group encryption (ChaCha20-Poly1305), end-to-end private messages (X25519 from Ed25519 identities). Offline raster and vector maps (MBTiles, PMTiles) plus cached online tiles. Country groups on first launch, SOS repeated with precise position, optional position sharing, detailed crash logs. Rust core, Kotlin/Compose app, ESP32-S3 firmware. Licensed under GPL-3.0-or-later. Documentation is in French.


Pourquoi ROCS ?

Les outils de type TAK (ATAK, WinTAK…) sont puissants mais lourds : serveur, plugins, cartes à préparer, configuration longue. ROCS garde l'esprit — qui est où, que se passe-t-il, prévenir tout le monde — et vise la simplicité pour des équipes civiles : on scanne un QR code et on est dans le groupe.

  • Sans infrastructure : chaque appareil est un nœud complet ; le premier lien disponible sert (LoRa, Wi-Fi, Internet), et un appareil qui en a plusieurs relaie entre eux.
  • Résilient : la radio LoRa fonctionne sans réseau mobile, à plusieurs kilomètres, avec relais automatique (maillage) ; la carte est sur le téléphone.
  • Chiffré : tout le contenu est chiffré et authentifié avec la clé du groupe, sur tous les supports ; les messages privés le sont en plus de bout en bout (lisibles des deux seuls interlocuteurs).
  • Matériel courant : un module LoRa à une vingtaine d'euros sert de radio, branché en USB ou en Bluetooth ; l'appli installe elle-même son firmware.

Fonctionnalités

Carte Hors ligne : raster (MBTiles, ex. Plan IGN) ou vectorielle (PMTiles / MBTiles OpenStreetMap, quelques Go pour un pays) ; tuiles en ligne gardées automatiquement ; mode sombre ; coordonnées décimal, DMS, DM, UTM et MGRS (une ligne par format, copie séparée), saisie de coordonnées ; mesure : un appui trace une droite depuis ma position avec la distance et le cap, un second appui ouvre le point
Rejoindre Sur un POI, un équipier ou un point : boussole en temps réel (cap de l'appareil, nord vrai), distance, durée estimée ; suit un équipier qui bouge
Parcours Enregistrement du tracé GPS (continue écran éteint, rien de perdu si l'appli s'arrête), rangé en FIT (Garmin, Strava…), import de fichiers FIT ; partage avec le groupe par LoRa (forme compacte, 3–4 trames pour 6 km) ou Internet, ou en fichier ; exécuter le tracé, rejoindre le tracé, remonter le tracé (fil d'Ariane), avec la boussole et l'écart au tracé
Équipe Positions en direct, ancienneté, liaison utilisée, distance et azimut, RSSI radio
POI Appui long pour poser un point (8 types), partagé avec le groupe, modifiable
Messages Un fil par groupe et par équipier, pastille de non-lus ; privés chiffrés de bout en bout ; accusé de réception court sur LoRa (5 octets) « ✓✓ reçu », coche « ✓ relayé » quand un relais a répété mon message
Images Au groupe ou en privé (chiffrée de bout en bout), photo de la galerie ou de l'appareil, format VC (.vhq) : taille et résolution (8 à 16 bits) au choix avec aperçu, coût LoRa affiché ; trames autonomes : l'image s'affiche dès les premiers morceaux, une trame perdue ne laisse qu'un trou bouché, les manquants sont redemandés ; relayées sur LoRa (envoi par rafales de 3 laissant le relais travailler) ; enregistrement en PNG, JPG ou .vhq
Alertes SOS, blessé, danger, demande d'aide, fin d'alerte — dans tous les groupes, réémises toutes les 1–2 min avec la position précise
Groupes Groupes du pays (public-fr, test-fr) au premier lancement ; création en un geste, QR code ; plusieurs groupes à la fois
Discrétion Visibilité de la position par groupe : précise, approximative (≈ 10 km) ou masquée ; goutte de couleur en haut de l'écran ; position exacte partout pendant une alerte
Liaisons Toutes à la fois, sans réglage : LoRa (préréglage légal par région : EU 868, EU 433, US 915…, relais automatique quand un autre voisin en a besoin, rien à deux), Wi-Fi local, Internet (tous les courtiers MQTT à la fois, TLS/TCP/WebSocket sondés ; courtiers annoncés entre équipiers si des serveurs tombent)
Modem Flash du firmware depuis le téléphone ou le PC, import de firmwares sans recompiler, fréquence réglée depuis l'appli
Diagnostic Journal détaillé, rapports de plantage (Java, natif, Rust), envoi en un geste
PC Nœud complet en console (Linux, Windows) : relais sur point haut, passerelle LoRa ↔ Internet

Matériel pris en charge

Modem LoRa Liaison Remarques
Heltec WiFi LoRa 32 V3 (ESP32-S3 + SX1262) USB (CP2102) ou Bluetooth écran d'état OLED
Seeed XIAO ESP32S3 + Wio-SX1262 (kit « Meshtastic ») USB natif ou Bluetooth sans écran
Heltec WiFi LoRa 32 V4 (amplificateur 28 dBm, GNSS) — expérimental USB natif ou Bluetooth écran OLED ; position GNSS envoyée à l'hôte (docs/HELTEC-V4.md)

Téléphone ou tablette Android 8.0+ (câble USB OTG pour le modem filaire). PC Linux ou Windows.

Le modem n'est qu'une interface radio : il ne connaît ni la clé du groupe ni le routage. Sa fréquence et sa puissance suivent le préréglage régional choisi dans l'appli (firmware ≥ 4, docs/PRESETS.md). Une équipe peut aussi utiliser d'autres paramètres LoRa (fréquence, BW, SF, CR ; firmware ≥ 13) : ils sont annoncés avec leur zone et appliqués automatiquement par les équipiers qui y arrivent (docs/SPEC.md §6.4.1).

Démarrage rapide

  1. Compiler et installer l'appli (voir plus bas), autoriser la localisation et les notifications.
  2. Choisir son pays : l'appli crée public-xx (tous les utilisateurs du pays) et test-xx (vos essais) et règle la radio. Pour une équipe : Groupe › Créer un nouveau groupe, puis faire scanner le QR code aux équipiers.
  3. Brancher le modem LoRa (câble OTG) : Réglages › Firmware du modem › Installer la première fois.
  4. C'est tout : les équipiers apparaissent sur la carte dès qu'un lien (LoRa, Wi-Fi ou Internet) passe.

Compilation (Linux)

Prérequis

# Android Studio (SDK + JDK 17), puis SDK Manager > SDK Tools > « NDK (Side by side) »
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
rustup target add aarch64-linux-android armv7-linux-androideabi x86_64-linux-android
cargo install cargo-ndk
sudo usermod -aG dialout $USER          # accès aux ports série (se reconnecter ensuite)

Application Android

cd android
echo "sdk.dir=$HOME/Android/Sdk" > local.properties    # Android Studio le fait tout seul
./gradlew assembleDebug
adb install -r app/build/outputs/apk/debug/app-debug.apk

./gradlew compile aussi le cœur Rust (rust/rocs-jni → librocs_jni.so) par cargo-ndk. Par défaut pour arm64-v8a, armeabi-v7a (téléphones 32 bits) et x86_64 : un APK qui ne contient pas l'architecture du téléphone ne peut pas démarrer. Options : -PrustAbis=arm64-v8a pour une compilation rapide de mise au point, -PskipRust pour ne pas relancer cargo.

Diagnostic d'un plantage

L'appli tient un journal détaillé dans Android/data/fr.rocs.app/files/logs/ (visible en USB depuis un PC) : rocs.log (étapes du démarrage, appareil, erreurs), rocs-rust.log (paniques du cœur avec trace), crash-*.txt (chaque plantage, trace complète et logcat), sortie-* (traces système des arrêts précédents, Android 11+). Après un plantage, l'appli propose au lancement suivant d'envoyer le rapport ; à tout moment : Réglages › icône Journal › « Envoyer le fichier » (.zip). Sans l'appli : adb logcat -s ROCS AndroidRuntime DEBUG.

Outil PC

cd rust
cargo build --release                   # → target/release/rocs (rocs.exe sous Windows)
rocs group new "Exercice"                               # crée un groupe, affiche son code rocs:1:…
rocs ports                                              # ports série et modem reconnu
rocs node --group 'rocs:1:…' --name PC --port /dev/ttyACM0 --pos 47.06,3.66
rocs node --group 'rocs:1:…' --group 'rocs:1:…' --name PC        # plusieurs groupes : --group répété
rocs node --pays fr --name PC --port /dev/ttyACM0                # groupes public-fr et test-fr, préréglage EU 868
rocs presets fr                                                  # préréglages radio du pays

La console du nœud : texte libre → tout le groupe, /msg NOM texte, /pos LAT LON, /poi LAT LON TYPE libellé, /alerte sos|blesse|danger|aide|fin texte, /equipe, /pois, /groupe [N] (liste les groupes, choisit celui où vous écrivez), /flou [M|non] (position imprécise), /position [oui|non] (partage de position), /e2e [oui|non] (messages privés de bout en bout), /image [@NOM] FICHIER [BITS] [LxH] [légende] (photo JPEG/PNG réduite et codée en VC, ou fichier .vhq envoyé tel quel ; @NOM : image privée ; par défaut 320×240 à 8 bits avec LoRa, 800×600 à 12 bits sinon), /images, /enregistrer N [png|jpg|vhq], /redemander N, /quit. Les images reçues en entier sont enregistrées d'office en PNG et .vhq dans ~/.rocs/images/. Options : --flou [M] pour démarrer en position imprécise (zone de M mètres, 10 000 par défaut), --preset CODE (préréglage radio), --sans-position, --sans-e2e, --broker (voir rocs sans argument). Journal de diagnostic : ~/.rocs/rocs-rust.log. Sans --port, le nœud passe seulement par le Wi-Fi local et Internet.

Firmware du modem

Des images prêtes à flasher sont fournies dans firmware/bin/ et intégrées à l'appli.

rocs flash --port /dev/ttyUSB0          # Heltec V3 (la carte est reconnue à son USB)
rocs flash --port /dev/ttyACM0          # XIAO ESP32S3 + Wio-SX1262

Un seul hôte à la fois (firmware ≥ 6) : quand l'outil PC ou un téléphone utilise le modem par le port série (USB), le Bluetooth du modem est coupé ; il se rallume tout seul 25 s après la libération du port (ou aussitôt le câble débranché sur le XIAO).

Relais autonome : un modem alimenté seul (batterie, chargeur USB), sans téléphone ni PC en USB ou Bluetooth, devient au bout de 45 s un relais pur : il réémet les trames ROCS qu'il entend (TTL − 1, délai aléatoire), sans jamais réémettre une trame déjà vue. Il ne connaît aucune clé et ne lit rien ; il suffit de le poser sur un point haut. Dès qu'un téléphone ou un PC se connecte, il redevient un simple modem (l'appli et l'outil PC lui envoient un signe de vie toutes les 10 s). L'écran du Heltec affiche alors « RELAIS » et le nombre de trames relayées (R). L'écran s'éteint au bout de 30 s ; un appui sur le petit bouton PRG le rallume pour 30 s.

Depuis le téléphone : Réglages › Firmware du modem › Installer (ou Importer un firmware (.bin) pour une version plus récente que celle de l'appli). Si une carte ne passe pas seule en programmation : maintenir BOOT (XIAO) ou PRG (Heltec) en la branchant, puis rocs flash --port … --no-reset.

Recompiler le firmware (après modification de firmware/src/main.cpp, augmenter firmware/version.txt) :

sudo apt install pipx && pipx install platformio && pipx ensurepath
cd firmware && pio run                  # les trois cartes → firmware/bin/ et appli Android

Cartes hors ligne

Ouvrir tools/cartes.html dans un navigateur, toucher les cases à emporter, choisir les zooms, puis Créer les fichiers .mbtiles : les tuiles du Plan IGN (ou des photos aériennes IGN) sont téléchargées et assemblées dans le navigateur, un fichier par case, nommé d'après ses coins haut-gauche et bas-droite (rocs-plan_47.2792N-2.8125E_47.0402N-3.1641E.mbtiles). Pour de grandes zones, le script équivalent :

python3 tools/make_mbtiles.py --preset ign-plan --bbox 2.84,46.65,4.23,47.59 --zoom 8-14 -o nievre.mbtiles

Dans l'appli : Réglages › Cartes › Gérer les cartes, un écran dédié : ajout de plusieurs fichiers à la fois, recherche par nom ou coordonnées, sélection et suppression groupées, « Voir » pour centrer la carte sur l'une d'elles. Les cartes s'ajoutent et s'affichent ensemble ; là où elles se recouvrent, la plus détaillée l'emporte ; un fichier de même nom remplace l'ancien. Pour une carte préchargée, copier un fichier en android/app/src/main/assets/map.mbtiles avant de compiler. Les serveurs de tuiles de la Fondation OpenStreetMap interdisent le téléchargement en masse ; les outils de ROCS les refusent. Respectez les conditions d'utilisation et l'attribution des fonds de carte.

Cartes vectorielles (bien plus compactes : quelques Go pour la France au lieu de plus de 20 Go en raster) : fichiers .pmtiles (extraits Protomaps) ou .mbtiles vectoriels (Planetiler), dessinés par l'appli et nets à tous les zooms — voir docs/CARTES-VECTORIELLES.md. Tuiles en ligne : avec du réseau, les tuiles vues (Plan IGN, photos IGN ou OpenStreetMap) sont gardées et restent visibles hors ligne ; préchargement autour de soi en Wi-Fi (sources IGN). Pour les donner à un équipier sans Internet : Gérer les cartes › Tuiles en ligne › « Ouvrir le dossier des tuiles » copie le cache en .mbtiles dans Téléchargements/ROCS et ouvre ce dossier ; envoyez le fichier comme vous voulez (Quick Share, Bluetooth, câble), il l'ajoute par Gérer les cartes › Ajouter…

Repartir de zéro

Effacer l'identité, les groupes, les messages et les journaux :

rm -rf ~/.rocs                                            # PC Linux (ou le dossier donné à --data)
Remove-Item -Recurse -Force "$env:USERPROFILE\.rocs"      # PC Windows (PowerShell)
adb shell pm clear fr.rocs.app                            # téléphone (ou Réglages › Applis › ROCS › Effacer les données)

Une nouvelle identité est créée au lancement suivant ; les groupes public-xx et test-xx se recréent à l'identique, mais les codes des groupes privés sont à rescanner. Le modem ne garde que son préréglage radio, que l'appli ou l'outil PC lui renvoie à chaque connexion.

Organisation du dépôt

rocs/
├── android/                appli Kotlin + Jetpack Compose (./gradlew compile aussi le Rust)
├── rust/
│   ├── rocs-core/          trame, chiffrement (groupe et bout en bout), routage multi-supports, état,
│   │                       MQTT (TLS/TCP/WebSocket), Wi-Fi, protocole modem (KISS), préréglages
│   │                       régionaux, journal de diagnostic, flasheur ESP32-S3
│   ├── rocs-jni/           pont JNI pour l'appli (librocs_jni.so)
│   └── rocs-cli/           outil PC `rocs` : nœud complet, flash du modem
├── firmware/               firmware du modem (PlatformIO / Arduino), images dans bin/
├── reference/rocs_ref.py   implémentation de référence indépendante (Python) + vecteurs de test
├── tools/                  cartes.html, make_mbtiles.py, logo_icon.py
└── docs/
    ├── SPEC.md             spécification du protocole v1
    ├── PRESETS.md          préréglages radio par région et par pays
    ├── HELTEC-V4.md        Heltec V4 (amplificateur, GNSS) : étude et firmware expérimental
    ├── CARTES-VECTORIELLES.md   cartes vectorielles (PMTiles, MBTiles) et tuiles en ligne
    └── SOURCEFORGE.md      publication du projet

Le même cœur Rust tourne dans le téléphone et sur le PC. La référence Python, écrite séparément, sert de contrôle : les trames produites par Rust doivent lui être identiques octet pour octet.

Protocole en bref

Trame unique sur tous les supports : en-tête de 9 octets en clair (version, type, TTL, ID court de l'émetteur, heure, séquence), corps chiffré par ChaCha20-Poly1305 (étiquette tronquée à 4 octets), avec position. Une position tient en 20 octets (≈ 0,3 s d'antenne en SF8 / BW 62,5 kHz). Les membres s'annoncent avec une clé publique Ed25519 et une signature. Déduplication, relais LoRa à délai aléatoire, passerelle entre supports et file à priorités (alerte d'abord). Détails : docs/SPEC.md.

Préréglages radio

Liste complète, pour information (copie de docs/PRESETS.md).

Tous les préréglages gardent les mêmes paramètres LoRa — BW 62,5 kHz, SF8, CR 4/8, préambule 12, mot de synchro 0x24, CRC — : seules la fréquence centrale et la puissance changent. Deux appareils ne s'entendent par radio que s'ils ont le même préréglage ; par Internet (MQTT) et Wi-Fi, tout le monde se voit, quel que soit le préréglage.

Le préréglage se choisit au premier lancement (avec le pays) ou dans Réglages › Région radio ; l'appli ou l'outil PC (--preset, --pays) le transmet au modem (commande KISS SETRADIO, firmware ≥ 4), qui le garde en mémoire flash. Liste à jour : rocs presets (ou rocs presets fr). Source unique : rust/rocs-core/src/region.rs.

Code Région Bande Fréquence utilisée Puissance programmée Limite de la région Occupation max. Remarque
EU_868 Europe 868 MHz 869.4–869.65 MHz 869.43125 MHz 22 dBm 27 dBm 10 % ERC/REC 70-03 annexe 1 (h1.6) : 500 mW PAR, 10 % d'occupation
EU_433 Europe 433 MHz 433.05–434.79 MHz 433.75000 MHz 10 dBm 10 dBm 10 % ERC/REC 70-03 annexe 1 (h1.4) : 10 mW PAR, 10 % d'occupation ; module 433 MHz requis
UA_868 Ukraine 868 MHz 868–868.6 MHz 868.30000 MHz 14 dBm 14 dBm 1 % 1 % d'occupation
UA_433 Ukraine 433 MHz 433–434.7 MHz 433.75000 MHz 10 dBm 10 dBm 10 % bande 433 MHz : module 433 MHz requis
RU_868 Russie 868 MHz 868.7–869.2 MHz 868.95000 MHz 20 dBm 20 dBm —
KZ_863 Kazakhstan 863 MHz 863–868 MHz 865.00000 MHz 22 dBm 30 dBm —
KZ_433 Kazakhstan 433 MHz 433.075–434.775 MHz 433.75000 MHz 10 dBm 10 dBm — bande 433 MHz : module 433 MHz requis
US_915 Amériques 915 MHz 902–928 MHz 906.87500 MHz 22 dBm 30 dBm — FCC 15.247 : 1 W pour l'étalement ou le saut de fréquence ; une émission à bande étroite fixe relève en toute rigueur de limites plus basses (valeur usuelle de la communauté)
BR_902 Brésil 902 MHz 902–907.5 MHz 904.37500 MHz 22 dBm 30 dBm —
ANZ_915 Australie / N.-Zélande 915 MHz 915–928 MHz 916.87500 MHz 22 dBm 30 dBm —
ANZ_433 Australie / N.-Zélande 433 MHz 433.05–434.79 MHz 433.75000 MHz 14 dBm 14 dBm — bande 433 MHz : module 433 MHz requis
NZ_865 Nouvelle-Zélande 865 MHz 864–868 MHz 866.00000 MHz 22 dBm 36 dBm —
IN_865 Inde 865 MHz 865–867 MHz 866.00000 MHz 22 dBm 30 dBm —
NP_865 Népal 865 MHz 865–868 MHz 866.50000 MHz 22 dBm 30 dBm —
CN_470 Chine 470 MHz 470–510 MHz 471.00000 MHz 19 dBm 19 dBm — module 470–510 MHz requis
JP_920 Japon 920 MHz 920.5–923.5 MHz 921.00000 MHz 13 dBm 13 dBm — ARIB STD-T108 : écoute avant émission exigée
KR_920 Corée du Sud 920 MHz 920–923 MHz 921.87500 MHz 22 dBm 23 dBm —
TW_920 Taïwan 920 MHz 920–925 MHz 922.00000 MHz 22 dBm 27 dBm —
TH_920 Thaïlande 920 MHz 920–925 MHz 922.00000 MHz 22 dBm 27 dBm 10 % 10 % d'occupation
MY_919 Malaisie 919 MHz 919–924 MHz 921.50000 MHz 22 dBm 27 dBm —
MY_433 Malaisie 433 MHz 433–435 MHz 433.75000 MHz 20 dBm 20 dBm — bande 433 MHz : module 433 MHz requis
SG_923 Singapour 923 MHz 917–925 MHz 921.00000 MHz 20 dBm 20 dBm —
PH_915 Philippines 915 MHz 915–918 MHz 916.50000 MHz 22 dBm 24 dBm —
PH_868 Philippines 868 MHz 868–869.4 MHz 868.70000 MHz 14 dBm 14 dBm —
PH_433 Philippines 433 MHz 433–434.7 MHz 433.75000 MHz 10 dBm 10 dBm — bande 433 MHz : module 433 MHz requis
  • Puissance programmée : la limite de la région, plafonnée à 22 dBm (maximum du SX1262). La limite porte en général sur la puissance rayonnée (PAR/PIRE) : une antenne à gain la dépasse plus vite.
  • Sources : bandes et puissances du tableau des régions de la communauté Meshtastic (firmware/src/mesh/RadioInterface.cpp), ERC/REC 70-03 pour l'Europe ; EU 433 centré sur 433,750 MHz. Ce sont des valeurs de référence communautaires, pas un avis juridique : la réglementation locale (puissance rayonnée, occupation, écoute avant émission, licences) reste de la responsabilité de l'utilisateur.
  • Matériel : le Heltec V3 « 868/915 » et le Wio-SX1262 sont adaptés pour 863–928 MHz. Les préréglages 433 MHz et 470 MHz demandent un module prévu pour ces bandes (Heltec V3 433/470, etc.).
  • États-Unis (FCC) : la limite de 1 W (§15.247) vise l'étalement de spectre ou le saut de fréquence ; une émission à bande étroite sur une fréquence fixe relève en toute rigueur de limites bien plus basses (§15.249). La valeur indiquée est celle qu'utilise la communauté.

Pays

Préréglages proposés (le premier est celui par défaut) :

Afrique du Sud (EU_868, EU_433), Albanie (EU_868, EU_433), Algérie (EU_868, EU_433), Allemagne (EU_868, EU_433), Andorre (EU_868, EU_433), Argentine (US_915), Australie (ANZ_915, ANZ_433), Autriche (EU_868, EU_433), Belgique (EU_868, EU_433), Bosnie-Herzégovine (EU_868, EU_433), Brésil (BR_902), Bulgarie (EU_868, EU_433), Canada (US_915), Chili (ANZ_915), Chine (CN_470), Chypre (EU_868, EU_433), Colombie (US_915), Corée du Sud (KR_920), Croatie (EU_868, EU_433), Côte d'Ivoire (EU_868, EU_433), Danemark (EU_868, EU_433), Espagne (EU_868, EU_433), Estonie (EU_868, EU_433), Finlande (EU_868, EU_433), France (métropole et outre-mer) (EU_868, EU_433), Grèce (EU_868, EU_433), Hongrie (EU_868, EU_433), Inde (IN_865), Irlande (EU_868, EU_433), Islande (EU_868, EU_433), Italie (EU_868, EU_433), Japon (JP_920), Kazakhstan (KZ_863, KZ_433), Lettonie (EU_868, EU_433), Liechtenstein (EU_868, EU_433), Lituanie (EU_868, EU_433), Luxembourg (EU_868, EU_433), Macédoine du Nord (EU_868, EU_433), Malaisie (MY_919, MY_433), Malte (EU_868, EU_433), Maroc (EU_868, EU_433), Mexique (US_915), Moldavie (EU_868, EU_433), Monaco (EU_868, EU_433), Monténégro (EU_868, EU_433), Norvège (EU_868, EU_433), Nouvelle-Zélande (ANZ_915, NZ_865, ANZ_433), Népal (NP_865), Pays-Bas (EU_868, EU_433), Philippines (PH_915, PH_868, PH_433), Pologne (EU_868, EU_433), Portugal (EU_868, EU_433), Pérou (ANZ_915), Roumanie (EU_868, EU_433), Royaume-Uni (EU_868, EU_433), Russie (RU_868), Saint-Marin (EU_868, EU_433), Serbie (EU_868, EU_433), Singapour (SG_923), Slovaquie (EU_868, EU_433), Slovénie (EU_868, EU_433), Suisse (EU_868, EU_433), Suède (EU_868, EU_433), Sénégal (EU_868, EU_433), Taïwan (TW_920), Tchéquie (EU_868, EU_433), Thaïlande (TH_920), Tunisie (EU_868, EU_433), Turquie (EU_868, EU_433), Ukraine (UA_868, UA_433), États-Unis (US_915).

Pays absent : « Autre pays » (groupes public-int et test-int), tous les préréglages proposés.

Groupes du pays

Au premier lancement, deux groupes sont créés : public-<pays> (ouvert à tous les utilisateurs du pays) et test-<pays>, le groupe d'essai, actif par défaut — on y fait ses tests sans encombrer le groupe public. Leur clé ne dépend que du nom (SPEC §5) : tous les appareils du pays les rejoignent d'office. Outil PC : rocs node --pays fr (les deux groupes et le préréglage par défaut du pays), rocs group pays fr.

Réglementation radio et responsabilité

  • Préréglages par région (docs/PRESETS.md) : mêmes paramètres LoRa partout, fréquence et puissance selon la région. Par défaut (EU 868) : 869,43125 MHz, BW 62,5 kHz, SF8, CR 4/8, 22 dBm conduits (maximum des modules). La sous-bande 869,400–869,650 MHz (ERC/REC 70-03, annexe 1, bande h1.6) autorise jusqu'à 500 mW PAR — 22 dBm restent en dessous avec une antenne de gain modeste — et un cycle d'utilisation de 10 %. Depuis le firmware 3, ce cycle est mesuré et affiché mais plus imposé : son respect est de la responsabilité de l'utilisateur (Réglages › Modem LoRa affiche le temps d'antenne de la dernière heure). Vérifiez la réglementation applicable dans votre pays.
  • ROCS n'est pas un système d'alerte ou de secours certifié. Il ne remplace pas les numéros d'urgence (112) ni les moyens officiels. Le logiciel est fourni sans aucune garantie (voir la licence).

État du projet

Version 0.4.12 — utilisable pour des essais.

Essayé en conditions réelles : appli Android sur téléphone ; nœud PC sous Windows avec un XIAO ESP32S3 + Wio-SX1262 sur port série ; liaison Internet (MQTT) entre PC et téléphone.

Vérifié par tests automatiques : trames identiques à la référence Python (signatures comprises) ; routage sur réseau simulé (LoRa 2 sauts ↔ Internet) ; nœuds PC de bout en bout par MQTT, multicast et LoRa simulé ; flasheur contre une ROM ESP32-S3 simulée validée avec esptool ; pont JNI ; firmware compilé pour les deux cartes.

Reste à éprouver : portée et maillage LoRa sur le terrain avec plusieurs modems, flash depuis le téléphone sur les deux cartes, liaison Bluetooth, longues durées d'utilisation.

Limites connues

  • Messages privés de bout en bout : l'émetteur doit avoir reçu l'annonce (clé publique) du destinataire ; sinon le message attend. Désactivé, un message privé redevient lisible de tout le groupe.
  • Les métadonnées (ID émetteur, heure, type de trame) circulent en clair ; un membre du groupe peut usurper un autre membre sur les trames non signées (SPEC §9).
  • Le bord inférieur du signal tombe sur 869,400 MHz : voir SPEC §8 pour décaler la porteuse.
  • Le Wi-Fi local exige un réseau qui laisse passer le multicast (point d'accès de téléphone, routeur de terrain).
  • Internet passe par des courtiers MQTT publics, sans garantie de service (liste modifiable dans Réglages › Courtiers Internet (avancé) ; les courtiers appris des équipiers s'y ajoutent seuls).

Tests

cd rust && cargo test --release                                     # cœur Rust, flasheur, interopérabilité
python3 reference/rocs_ref.py selftest                              # référence Python
rust/rocs-jni/jvm-test/run.sh                                       # pont JNI depuis Kotlin (kotlinc requis)
ROCS_MQTT_TEST=1 cargo test -p rocs-core --test mqtt_local          # deux courtiers locaux (amqtt), relais

Contribuer

Rapports de bogues, essais terrain (portée, matériel) et propositions sont les bienvenus : voir CONTRIBUTING.md. Historique des versions : CHANGELOG.md.

Licence

Copyright © 2026 Arnaud Trybou (F4NLJ) et les contributeurs de ROCS.

ROCS est un logiciel libre : vous pouvez le redistribuer et le modifier selon les termes de la GNU General Public License version 3, ou (à votre choix) toute version ultérieure, telle que publiée par la Free Software Foundation. Texte complet : LICENSE.

Composants tiers (bibliothèques, cœur Arduino du firmware, données de carte) et leurs licences : THIRD-PARTY.md.

Source: README.md, updated 2026-11-07