| Name | Modified | Size | Downloads / Week |
|---|---|---|---|
| ROCS_en.apk | < 17 hours ago | 28.7 MB | |
| ROCS_fr.apk | < 17 hours ago | 31.8 MB | |
| rocs-en.zip | < 17 hours ago | 4.3 MB | |
| rocs-fr.zip | < 17 hours ago | 4.3 MB | |
| README.md | < 17 hours ago | 28.9 kB | |
| LICENSE | < 17 hours ago | 35.1 kB | |
| SOURCEFORGE.md | 2026-10-10 | 8.2 kB | |
| Totals: 7 Items | 69.3 MB | 9 |

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
- Compiler et installer l'appli (voir plus bas), autoriser la localisation et les notifications.
- Choisir son pays : l'appli crée
public-xx(tous les utilisateurs du pays) ettest-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. - Brancher le modem LoRa (câble OTG) : Réglages › Firmware du modem › Installer la première fois.
- 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.