Commit Graph
2 Commits
Author SHA1 Message Date
BiasFandClaude Opus 5 866fce9711 Android: Bluetooth-Schicht und Ablage
Damit steht der erste Teil vollständig: Protokoll, Funk und Ablage
übersetzen sich, die 50 Prüfungen laufen.

Die Funkschicht folgt der iOS-Fassung samt allem, was wir uns dort erst
erarbeiten mussten. Ein eigener Thread für alles, was Bluetooth anfasst;
Android ruft Scan- und GATT-Rückmeldungen auf Binder-Threads auf. Die
Wartesperre nach Fehlschlägen, die zwischen einem Abbruch einer stehenden
Verbindung und einem echten Fehlschlag unterscheidet. Stellbefehle, die
aufgehoben statt verworfen werden, wenn die Kühlbox gerade weg ist. Die
Zwanzig-Byte-Grenze beim Schreiben an die Kühlbox. Die stabile Reihenfolge
der Kandidaten, damit nicht der Zufall die Schreibart bestimmt.

Vier Dinge sind auf Android anders und im Quelltext vermerkt:

Die Herstellerdaten kommen ohne die zwei Bytes der Company-ID - die steht
im Schlüssel der Tabelle. Sie werden wieder davorgesetzt, damit derselbe
Rahmen ankommt wie unter iOS und dieselben Prüfungen gelten.

Notify muss über einen Deskriptor eingeschaltet werden; das Einschalten auf
unserer Seite allein genügt nicht.

Geräte werden über ihre MAC-Adresse angesprochen statt über eine
systemvergebene Kennung - iOS gibt die Adresse gar nicht heraus.

Die Victron-Schlüssel liegen in app-privater Ablage statt im
Schlüsselbund. Das schützt gegen andere Apps, ist aber nicht
hardwaregestützt. Ohne zusätzliche Bibliothek gibt es unter Android kein
gleichwertiges Gegenstück.

Als Nächstes die Oberfläche.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-31 10:28:53 +02:00
BiasFandClaude Opus 5 0cf8448f34 Android: Protokollschicht portiert und geprüft
Erster Teil der Android-Fassung. Portiert ist die Schicht, in der die
ganze Erfahrung aus unseren Fehlersuchen steckt: Victron-Entschlüsselung,
Daly klassisch und Modbus, JBD, WattCycle, Alpicool, der Neigungsmesser
samt Einbaulage, Ausrichtungs-Assistent und Keilrechner.

Sie liegt in einem eigenen Gradle-Modul aus reinem Kotlin, ohne
Android-Abhängigkeiten. Das ist keine Förmlichkeit: nur so laufen ihre
Prüfungen auf der Kommandozeile, ohne Emulator und ohne Android SDK -
genau wie das run-tests.sh der iOS-Fassung. 50 Prüfungen, alle grün.

Dieselben Vektoren wie unter iOS, darunter die, die uns Tage gekostet
haben: der AES-Vektor aus NIST SP 800-38A, der echte Orion-XS-Rahmen aus
der Diagnoseansicht, das mitgeschnittene Ausschaltpaket der IceCube Dual
und die 30-Byte-Antwort der Box im Fahrzeug, an der sich zeigt, dass ein
Fühlerplatzhalter von -128 keine zweite Zone ist.

Zwei Dinge weichen bewusst ab. AES-CTR kommt aus der JVM statt aus
CommonCrypto - der Zähler wird dort ebenso big-endian gezählt. Und
Zeitstempel sind Millisekunden statt Date-Objekten: das läuft ohne
Rücksicht auf die Android-Version und lässt sich in Prüfungen vorgeben,
statt von der Uhr abzuhängen.

Die Werkzeugkette steht in Android/env.sh: JDK 17, Gradle 8.11.1 über den
Wrapper, Android SDK 35.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-31 10:20:01 +02:00