Application Android qui fournit un accès hors-ligne à Wikipedia via des radios LoRa Meshtastic. Les utilisateurs envoient des questions par radio, l'application effectue une recherche sémantique (RAG) dans une base vectorielle Wikipedia locale, génère une réponse via un LLM embarqué, et la renvoie par radio -- le tout sans connexion internet.
Cas d'usage : accès fiable à l'information pendant les coupures internet (cyclones, zones blanches, catastrophes naturelles).
[Radio Meshtastic] ←──BLE/USB──→ [Transport]
│
▼
[MeshtasticService]
│
┌───────────┼───────────┐
▼ ▼ ▼
[RateLimiter] [RagEngine] [MessageChunker]
│
┌──────────────┼──────────────┐
▼ ▼ ▼
[KiwixSearch] [Embedding] [LlmEngine]
(ZIM/libkiwix) (ONNX) (llama.cpp)
▼
[VectorStore]
(Room+FTS5)
| Module | Rôle |
|---|---|
core/MessageChunker |
Découpe les réponses en paquets ≤220 octets UTF-8 numérotés [1/N] |
core/RateLimiter |
Fenêtre glissante par noeud Meshtastic (10 req / 10 min) |
core/Config |
Préférences DataStore typées |
llm/LlmEngine |
Inférence LLM via llama.cpp (JNI natif) |
rag/BpeTokenizer |
Tokenizer HuggingFace (BPE + Unigram/SentencePiece avec Viterbi) |
rag/EmbeddingEngine |
Encodage vectoriel ONNX Runtime (BAAI/bge-m3 int8, 1024 dim) |
rag/VectorStore |
Room + SQLite FTS5, recherche hybride keyword + similarité cosinus |
rag/RagEngine |
Orchestration : recherche Kiwix assistée LLM → embedding → recherche vectorielle → LLM |
transport/BleTransport |
Connexion GATT BLE vers radio Meshtastic |
transport/UsbSerialTransport |
Connexion série USB OTG (CP210x, CH340, FTDI, ESP32-S3) |
transport/MeshtasticProtocol |
Encodage/décodage protobuf Meshtastic (text, config, node_info) |
wikipedia/ZimReader |
Lecture de fichiers ZIM (Kiwix/libzim) |
wikipedia/KiwixSearch |
Recherche ZIM deux étapes (suggestions + full-text Xapian), multi-expressions |
wikipedia/WikipediaIndexer |
Chunking + embedding des articles Wikipedia |
wikipedia/WikipediaUpdateWorker |
Téléchargement ZIM en arrière-plan (WorkManager) |
wikipedia/IndexImporter |
Import d'une base pré-indexée depuis le PC |
service/MeshtasticService |
Service foreground : écoute radio, pipeline RAG, réponses |
service/ServiceState |
État partagé du service (StateFlow) |
service/DownloadState |
Suivi de progression des téléchargements |
service/DownloadWorker |
Téléchargement en arrière-plan (WorkManager) |
ui/MainViewModel |
ViewModel principal, téléchargements, gestion de l'état UI |
ui/PermissionHelper |
Gestion des permissions Android runtime |
di/AppModule |
Injection de dépendances Hilt |
- Android Studio Hedgehog (2023.1) ou plus récent
- JDK 17+
- Android SDK API 35
- NDK + CMake (optionnel, pour la compilation native llama.cpp)
# Build debug
./gradlew assembleDebug
# Lancer les tests unitaires
./gradlew testDebugUnitTest
# Build release
./gradlew assembleReleaseLa compilation native est désactivée par défaut. Pour l'activer :
- Installer NDK et CMake via Android Studio > SDK Manager > SDK Tools
- Décommenter le bloc
externalNativeBuilddansapp/build.gradle.kts - Le submodule
app/src/main/cpp/llama.cppdoit être initialisé :git submodule update --init --recursive
Sans NDK, un stub JNI est compilé et le LLM retourne [LLM non disponible].
Toutes les préférences sont modifiables depuis l'écran Paramètres de l'application.
| Catégorie | Paramètre | Défaut | Description |
|---|---|---|---|
| Meshtastic | Connexion | BLE | BLE ou USB série |
| Meshtastic | Préfixe déclencheur | ? |
Caractère qui déclenche une requête |
| Meshtastic | Délai inter-paquets | 2500 ms | Pause entre chaque chunk envoyé |
| Meshtastic | Chunks max | 5 | Nombre max de paquets par réponse |
| Rate Limit | Requêtes max | 10 | Par fenêtre glissante |
| Rate Limit | Fenêtre | 600 s | Durée de la fenêtre |
| LLM | Température | 0.1 | Faible = factuel |
| LLM | Tokens max | 300 | Longueur max de la réponse |
| RAG | Top-K | 5 | Nombre de chunks contextuels |
| RAG | Contexte max (chars) | 1000 | Taille max des extraits Kiwix envoyés au LLM |
| RAG | Recherche Kiwix assistée LLM | Non | Génère des expressions de recherche via LLM avant la recherche vectorielle |
| Wikipedia | Mise à jour auto | Oui | Vérification périodique des MAJ Kiwix |
| Wikipedia | Intervalle MAJ | 30 jours | Fréquence de vérification |
| Bibliothèque | Version | Usage |
|---|---|---|
| Jetpack Compose (BOM) | 2024.12.01 | UI Material 3 |
| Hilt | 2.54 | Injection de dépendances |
| Room | 2.6.1 | Base de données + FTS4 |
| ONNX Runtime | 1.17.0 | Inférence embeddings |
| llama.cpp | submodule | Inférence LLM (JNI) |
| Nordic BLE KTX | 2.6.1 | Transport Bluetooth |
| usb-serial-for-android | 3.7.3 | Transport USB série |
| Kiwix libkiwix | 2.4.1 | Lecture fichiers ZIM |
| OkHttp | 4.12.0 | Téléchargement ZIM |
| WorkManager | 2.10.0 | Tâches arrière-plan |
| DataStore | 1.1.1 | Préférences persistantes |
| Protobuf Java Lite | 3.21.12 | Sérialisation Meshtastic |
Via USB OTG :
- LILYGO T-Beam (CP210x)
- LILYGO T-Beam Supreme (ESP32-S3 USB natif)
- Heltec V3 (ESP32-S3 USB natif)
- RAK WisBlock (USB CDC)
Via BLE :
- Toute radio Meshtastic avec firmware standard
- Android 9+ (API 28)
- Architecture arm64 (arm64-v8a)
- Recommandé : 8 Go RAM minimum pour le modèle d'embedding + LLM
# Tous les tests
./gradlew testDebugUnitTest
# Un fichier spécifique
./gradlew testDebugUnitTest --tests "com.meshwiki.core.MessageChunkerTest"
# Tests instrumentés (nécessite un device/émulateur)
./gradlew connectedDebugAndroidTestTests existants :
MessageChunkerTest— Découpe UTF-8, troncature, numérotationRateLimiterTest— Fenêtre glissante, messages de refus, nettoyageVectorStoreTest— FTS5 pre-filtering, similarité cosinusMeshtasticProtocolTest— Encodage/décodage protobuf, framing série
app/src/main/java/com/meshwiki/
├── MeshWikiApplication.kt
├── MainActivity.kt
├── core/
│ ├── Config.kt
│ ├── MessageChunker.kt
│ └── RateLimiter.kt
├── llm/
│ ├── LlmEngine.kt
│ └── LlamaJni.kt
├── rag/
│ ├── BpeTokenizer.kt
│ ├── EmbeddingEngine.kt
│ ├── RagEngine.kt
│ └── VectorStore.kt
├── transport/
│ ├── MeshtasticTransport.kt
│ ├── BleTransport.kt
│ ├── UsbSerialTransport.kt
│ ├── MeshtasticProtocol.kt
│ └── ConnectionManager.kt
├── wikipedia/
│ ├── ZimReader.kt
│ ├── KiwixSearch.kt
│ ├── WikipediaIndexer.kt
│ ├── WikipediaUpdateWorker.kt
│ └── IndexImporter.kt
├── service/
│ ├── MeshtasticService.kt
│ ├── ServiceState.kt
│ ├── DownloadState.kt
│ └── DownloadWorker.kt
├── ui/
│ ├── MainViewModel.kt
│ ├── PermissionHelper.kt
│ ├── theme/Theme.kt
│ └── screens/
│ ├── DashboardScreen.kt
│ ├── SettingsScreen.kt
│ └── SetupScreen.kt
└── di/
└── AppModule.kt
Projet personnel -- non publié.