docs: add spec for client BLE OTA via broker server
This commit is contained in:
parent
ec310c1bcb
commit
b3d449342f
1 changed files with 86 additions and 0 deletions
86
docs/superpowers/specs/2026-08-04-client-ble-ota-spec.md
Normal file
86
docs/superpowers/specs/2026-08-04-client-ble-ota-spec.md
Normal file
|
|
@ -0,0 +1,86 @@
|
|||
# Spec: Client BLE OTA via Broker Server
|
||||
|
||||
**Status:** Draft
|
||||
**Datum:** 2026-08-04
|
||||
**Auteur:** opencore (AI Agent)
|
||||
|
||||
## 1. Introductie
|
||||
Dit document beschrijft de architectuur en het protocol voor het uitvoeren van een Firmware Over-The-Air (OTA) update op de SylDa_Client (ESP32) via de SylDa_Server (ESP32) als broker.
|
||||
|
||||
## 2. Architectuur
|
||||
Het systeem bestaat uit drie componenten:
|
||||
1. **Android App:** Initiator van de update, bevat de nieuwe firmware binary.
|
||||
2. **SylDa_Server (Central/Server):** Fungeert als informatiepunt (broker) tussen App en Client.
|
||||
3. **SylDa_Client (Central/Client):** Ontvanger van de update. Gaat in een "Dual-Role" (Central + Server) tijdens de update procedure.
|
||||
|
||||
## 3. BLE Interface (SylDa_Server)
|
||||
De Server breidt zijn bestaande service (`4fafc201-1fb5-459e-8fcc-c5c9c331914b`) uit met de volgende characteristics:
|
||||
|
||||
### 3.1 CLIENT_REGISTRY (`beb5483e-36e1-4688-b7f5-ea07361f26dd`)
|
||||
* **Eigenschappen:** Read, Notify
|
||||
* **Beveiliging:** AES/GCM encrypted
|
||||
* **Payload (37 bytes totaal):**
|
||||
* `[0:3]` Seq (4 bytes)
|
||||
* `[4:11]` Nonce Random (8 bytes)
|
||||
* `[12]` Ciphertext: `[UUID (16b) | Version (2b) | Status (1b)]`
|
||||
* `[13:28]` Auth Tag (16 bytes)
|
||||
* **Status codes:**
|
||||
* `0x00`: Normaal / Idle
|
||||
* `0x01`: Ready for OTA (Advertising)
|
||||
* `0x02`: Updating (Transfer bezig)
|
||||
|
||||
### 3.2 CLIENT_CONTROL (`beb5483e-36e1-4688-b7f5-ea07361f26de`)
|
||||
* **Eigenschappen:** Write, Notify
|
||||
* **Beveiliging:** AES/GCM encrypted
|
||||
* **Payload (37 bytes totaal):**
|
||||
* `[0:3]` Seq (4 bytes)
|
||||
* `[4:11]` Nonce Random (8 bytes)
|
||||
* `[12]` Ciphertext: `[TargetUUID (16b) | Action (1b)]`
|
||||
* `[13:28]` Auth Tag (16 bytes)
|
||||
* **Action codes:**
|
||||
* `0x10`: `NOTIFY_UPDATE_AVAILABLE` (Server -> Client)
|
||||
* `0x20`: `CLIENT_READY_FOR_OTA` (Client -> Server -> App)
|
||||
|
||||
## 4. BLE Interface (SylDa_Client OTA Mode)
|
||||
Wanneer de Client in OTA-modus gaat, start hij een eigen BLE Server met de volgende gegevens:
|
||||
* **Device Name:** `SylDa_Client_OTA_[Last-4-chars-UUID]`
|
||||
* **Service UUID:** `4fafc201-1fb5-459e-8fcc-c5c9c331914b` (Gelijk aan Server)
|
||||
* **OTA Characteristic:** `beb5483e-36e1-4688-b7f5-ea07361f26da` (Gelijk aan Server)
|
||||
* **UUID Characteristic:** `beb5483e-36e1-4688-b7f5-ea07361f26d9` (Bevat eigen UUID ter verificatie)
|
||||
|
||||
## 5. Sequence Diagram
|
||||
|
||||
1. **Bootstrapping:**
|
||||
* Client verbindt met Server.
|
||||
* Client schrijft zijn UUID en Versie naar `CLIENT_REGISTRY` op de Server.
|
||||
2. **Update Detectie:**
|
||||
* App verbindt met Server.
|
||||
* App leest `CLIENT_REGISTRY` en ziet dat Client v5 draait (App heeft v6).
|
||||
3. **Update Trigger:**
|
||||
* App stuurt `0x10` (Update Available) naar `CLIENT_CONTROL` (Target: Client UUID).
|
||||
* Server stuurt Notify naar Client.
|
||||
4. **Client Voorbereiding:**
|
||||
* Client ontvangt notificatie.
|
||||
* Client start `NimBLEServer` en begint te adverteren.
|
||||
* Client schrijft `0x20` (Ready) naar `CLIENT_CONTROL` op de Server.
|
||||
5. **App Verbinding naar Client:**
|
||||
* App ontvangt `0x20` notificatie van de Server.
|
||||
* App (na gebruikersbevestiging) scant naar `SylDa_Client_OTA` met de juiste UUID.
|
||||
* App verbindt direct met de Client.
|
||||
6. **OTA Transfer:**
|
||||
* App voert de standaard OTA-procedure uit (Start command, chunks, SHA256 verify, End confirm).
|
||||
* Client verwerkt de OTA en voert zijn relais-taken uit zolang de transfer niet is gestart.
|
||||
7. **Finalisatie:**
|
||||
* Client herstart na succesvolle OTA.
|
||||
* Client verbindt opnieuw met Server en rapporteert de nieuwe versie.
|
||||
|
||||
## 6. Beveiliging en Foutafhandeling
|
||||
* **Encryptie:** Alle "Broker" communicatie op de Server verloopt via de bestaande AES/GCM laag met de gedeelde PSK.
|
||||
* **UUID Pinning:** De App MOET de UUID van de Client verifiëren via de `UUID_CHAR_UUID` voordat de OTA start.
|
||||
* **Timeouts:** De Client stopt de OTA-modus (Server-rol) na een succesvolle update of een handmatige reset. (Gebruiker behoudt controle via de App).
|
||||
* **Relais:** De Client blijft operationeel tot het moment dat de OTA-transfer daadwerkelijk begint.
|
||||
|
||||
## 7. Rollen en Verantwoordelijkheden
|
||||
* **Server:** Passief doorgeefluik van status en notificaties. Slaat geen firmware op.
|
||||
* **Client:** Verantwoordelijk voor het veilig flashen van de eigen firmware en het rapporteren van de status.
|
||||
* **App:** Verantwoordelijk voor het orkestreren van het proces en het leveren van de firmware.
|
||||
Loading…
Reference in a new issue