BLE library for Electric Unicycles — real-device tested protocols
FR | EN
Bibliothèque Bluetooth Low Energy pour monocycles électriques (EUC) – pensée pour des applications Android modernes, avec une couche protocole testée sur de vraies roues et un backend BLE modulaire.
GroupId:
io.github.tritbool
ArtifactId:euc-ble-library
Module:euc-ble-core
La plupart des libs BLE EUC se contentent de quelques trames “faites à la main” et d’un moteur BLE monolithique. Ici, l’objectif est différent :
Flow Kotlin et coroutines pour le streaming de télémétrie.Prise en charge multi‑constructeurs
KingSong, Gotway/Begode, InMotion, Ninebot (standard + Z‑series), Leaperkim/Veteran, Nosfet.
API client simple
Entrée unique EucBleClient avec callbacks ConnectionCallback, DataCallback, ErrorCallback côté app.
BLEManager : cœur BLE.BleBackend + FrameworkBleBackend + LegacyBleBackend + SwitchableBleBackend : adaptation progressive depuis un moteur existant (par ex. WheelLog).EUCData expose vitesse, tension, courant, température, niveau de batterie, distance, puissance, état de charge, temps de ride, etc.flowchart LR
App[Android App / UI] -->|scan, connect, commands| EucBleClient
subgraph Core BLE
EucBleClient --> BLEManager
BLEManager --> BleBackend
BleBackend --> FrameworkBleBackend
BleBackend --> LegacyBleBackend
end
subgraph Protocols
BLEManager --> KingsongProtocol
BLEManager --> GotwayProtocol
BLEManager --> InMotionProtocol
BLEManager --> NinebotProtocol
BLEManager --> NinebotZProtocol
BLEManager --> LeaperkimProtocol
BLEManager --> NosfetProtocol
end
Protocols -->|decoded frames| EUCData[(EUCData)]
EUCData --> App
EucBleClient ou au backend abstrait.EUCData et exposent les commandes supportées.EucBleClient sont invoqués depuis des contextes de fond, jamais garantis sur le main thread – à toi de Dispatchers.Main pour l’UI.Flow<EUCData> pour la télémétrie décodée.Flow<ByteArray> (rawFrameFlow) pour les trames brutes (utile pour logger / debug).Exemple d’utilisation côté app :
val client = EucBleClient(context)
client.setConnectionCallback(object : ConnectionCallback() {
override fun onDeviceDiscovered(device: EUCDevice) {
client.connect(device)
}
})
client.setDataCallback(object : DataCallback {
override fun onDataReceived(data: EUCData) {
// traiter la télémétrie sur un dispatcher adapté
}
})
client.setErrorCallback(object : ErrorCallback {
override fun onError(error: BLEException) {
// gestion fine des erreurs
}
})
client.initialize()
client.startScan()
protocols, models, frames pour refléter la partie critique de décodage.Les rapports HTML de couverture sont publiés sous :
/test-coverage/full/ – vue globale./test-coverage/focused/ – uniquement protocole / modèles / frames.(Voir plus bas la section “Test coverage reports”.)
Les protocoles sont testés avec de vraies captures BLE :
RAWWHEELLOG) pour chaque marque.WheelLogKingsongTest, WheelLogGotwayTest, etc.) qui valident le pipeline complet de décodage.En plus :
NoDropTest) : aucune trame décodée ne doit être silencieusement ignorée.ProtocolParityContractTest) pour garantir une sémantique cohérente des champs.BleFrequencyAnalysisTest).Ces rapports sont copiés dans le dossier site/test-coverage/ puis publiés via GitHub Pages:
dependencies {
implementation("io.github.tritbool:euc-ble-library:0.0.1")
}
Le BLE Android impose :
BLUETOOTH_SCAN / BLUETOOTH_CONNECT (et parfois localisation).La lib expose des erreurs structurées via BLEException et ErrorCallback pour couvrir ces cas.
Home (cette page) :
https://tritbool.github.io/euc_ble_library/
Référence API Kotlin (Dokka) :
https://tritbool.github.io/euc_ble_library/api/
La référence Dokka est regénérée automatiquement à chaque push sur main et publiée sous /api/ via GitHub Actions.
BLEManager, EucBleClient, backend abstrait).Toute issue, PR ou capture WheelLog supplémentaire (nouvelle roue, nouveau firmware, edge case) est la bienvenue.
Voir le dépôt : https://github.com/Tritbool/euc_ble_library.