Also un-ignores docs/ directory so project documentation (specs, plans) is tracked in git. Individual research files remain gitignored.
2.3 KiB
2.3 KiB
Device UUID Pairing — Design
Datum: 2026-07-29 Status: goedgekeurd
Doel
Voorkomen dat twee ESP-telefoon paren in dezelfde ruimte met elkaars ESP verbinden. Elk ESP-telefoon paar deelt een unieke UUID die tijdens key exchange wordt uitgewisseld.
Flow
Verse ESP (geen UUID, geen HMAC key)
- ESP boot, genereert random UUID (16 bytes via
esp_random()), slaat op in NVS - ESP start BLE advertising als
"SylDa_Server"(UUID nog onbekend bij app) - App opent Settings → Key Exchange
- App stuurt
KEY?over USB CDC, ESP antwoordtNO_KEY - App genereert random 32-byte HMAC key + 16-byte UUID
- App stuurt
SET_KEY:<64 hex>→ ESP slaat op →OK - App stuurt
SET_ID:<32 hex>→ ESP slaat op →OK - App slaat beide op in EncryptedSharedPreferences
- App keert terug naar main, start scan
Bestaand paar (beide hebben UUID + HMAC key)
- App stuurt
KEY?, ESP antwoordtDEVICE_ID:<32 hex>\nHMAC_KEY:<64 hex> - App slaat beide op
- Klaar
BLE connectie
- App scant op BLE service UUID
4fafc201-...(niet op naam) - Bij elke gevonden device: connect, discover services
- Lees UUID characteristic (READ-only)
- UUID match → zet relay knoppen actief
- UUID mismatch → disconnect, voeg address toe aan
triedAddresses, herstart scan - Relay commands blijven HMAC-beveiligd zoals voorheen
Componenten
Firmware (src/main.cpp)
| Item | Details |
|---|---|
NVS key "uuid" |
16 bytes, namespace "hmac" |
| UUID generatie | esp_random() per byte, alleen bij eerste boot |
| BLE naam | "SylDa_Server" |
| UUID characteristic | Nieuwe READ-only characteristic, los UUID |
KEY? response |
DEVICE_ID:32HEX\nHMAC_KEY:64HEX of NO_KEY |
SET_ID:32HEX |
Nieuw commando, slaat UUID in NVS |
Android — PrefsHelper
PREF_UUID = "device_uuid"(EncryptedSharedPreferences)
Android — SettingsActivity
readKeyFromEsp(): parseDEVICE_ID:lijnKeyResult.SuccesskrijgtdeviceUuidveld- Bij
NO_KEY: app genereert UUID + stuurtSET_KEYenSET_ID
Android — MainActivity
loadState(): laadt UUIDstartScan():ScanFilterop service UUIDonScanResult: connect bij elke match (naam genegeerd)gattCallback.onMtuChanged: lees UUID characteristic, verify- UUID mismatch: disconnect,
triedAddresses.add(address), herstart scan