Skip to content

ohuet/MeshWiki-Android

Repository files navigation

MeshWiki Android

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).

Architecture

[Radio Meshtastic] ←──BLE/USB──→ [Transport]
                                      │
                                      ▼
                               [MeshtasticService]
                                      │
                          ┌───────────┼───────────┐
                          ▼           ▼           ▼
                    [RateLimiter] [RagEngine] [MessageChunker]
                                      │
                       ┌──────────────┼──────────────┐
                       ▼              ▼              ▼
                 [KiwixSearch]  [Embedding]     [LlmEngine]
                 (ZIM/libkiwix) (ONNX)         (llama.cpp)
                                    ▼
                              [VectorStore]
                              (Room+FTS5)

Modules

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

Prérequis

  • 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

# Build debug
./gradlew assembleDebug

# Lancer les tests unitaires
./gradlew testDebugUnitTest

# Build release
./gradlew assembleRelease

Compilation native (llama.cpp)

La compilation native est désactivée par défaut. Pour l'activer :

  1. Installer NDK et CMake via Android Studio > SDK Manager > SDK Tools
  2. Décommenter le bloc externalNativeBuild dans app/build.gradle.kts
  3. Le submodule app/src/main/cpp/llama.cpp doit être initialisé :
    git submodule update --init --recursive

Sans NDK, un stub JNI est compilé et le LLM retourne [LLM non disponible].

Configuration

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

Dépendances principales

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

Matériel compatible

Radios Meshtastic (testées)

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

Smartphones

  • Android 9+ (API 28)
  • Architecture arm64 (arm64-v8a)
  • Recommandé : 8 Go RAM minimum pour le modèle d'embedding + LLM

Tests

# 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 connectedDebugAndroidTest

Tests existants :

  • MessageChunkerTest — Découpe UTF-8, troncature, numérotation
  • RateLimiterTest — Fenêtre glissante, messages de refus, nettoyage
  • VectorStoreTest — FTS5 pre-filtering, similarité cosinus
  • MeshtasticProtocolTest — Encodage/décodage protobuf, framing série

Structure du projet

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

Licence

Projet personnel -- non publié.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors