Kühlbox: Einstellungsblock in 20-Byte-Stücken schreiben

Die Ursache, belegt statt vermutet. Im Referenzprojekt gibt es einen
Bericht von genau dieser Box - einer Maentum/Plug-in Festival IceCube Dual
(Gruni22/alpicool_ha_ble#20). Dort galt: Solltemperatur ändern geht,
Ein- und Ausschalten nicht. Genau unser Bild.

Der Grund ist nicht das Paket, sondern der Schreibvorgang. Die Box nimmt
nur die 20 Nutzbytes der Standard-MTU je Schreibvorgang an. Der kurze
Temperaturbefehl hat sieben Byte und geht durch, der Einstellungsblock hat
31 und wird abgelehnt. Wir haben bisher nach der ausgehandelten MTU
aufgeteilt - und die ist unter iOS weit grösser als 20, also wurde nie
aufgeteilt. Jetzt gilt für die Kühlbox die Grenze der Box, nicht die der
Verbindung: 31 Byte gehen als 20 und 11 raus, mit der üblichen Pause
dazwischen.

Das mitgeschnittene Paket aus dem Bericht steht als Prüfung im Testlauf.
Unsere Erzeugung trifft es byteweise - Längenbyte, Datenblock, rechte
Zone, Prüfsumme -, es scheiterte also wirklich nur am Schreiben.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
BiasF
2026-08-30 23:58:47 +02:00
co-authored by Claude Opus 5
parent 568662fd5e
commit 58de005fa7
3 changed files with 68 additions and 5 deletions
+14 -5
View File
@@ -399,11 +399,7 @@ final class BMSSession: NSObject {
sentFrameCount += 1
lastSendAt = Date()
// Was in einen Schreibvorgang passt, hängt an der ausgehandelten MTU.
// Längeres muss aufgeteilt werden, sonst verwirft das Gerät es
// wortlos der Einstellungsblock einer Kühlbox ist so ein Fall.
let limit = peripheral.maximumWriteValueLength(for: endpoint.writeType)
let pieces = AlpicoolProtocol.chunks(data, limit: limit)
let pieces = AlpicoolProtocol.chunks(data, limit: writeLimit(for: endpoint))
for (index, piece) in pieces.enumerated() {
guard index > 0 else {
@@ -424,6 +420,19 @@ final class BMSSession: NSObject {
publishDiagnostics()
}
/// Wieviel je Schreibvorgang rausgeht.
///
/// Grundsätzlich das, was die Verbindung hergibt. Die Kühlboxen nehmen
/// aber nur die 20 Byte der Standard-MTU an, auch wenn iOS eine grössere
/// aushandelt und damit weit mehr erlauben würde. Ohne diese Grenze ginge
/// der Einstellungsblock als ein Schreibvorgang raus und die Box würde
/// ihn ablehnen, während die kurzen Befehle durchgehen.
private func writeLimit(for endpoint: Endpoint) -> Int {
let negotiated = peripheral.maximumWriteValueLength(for: endpoint.writeType)
guard dialect == .alpicool else { return negotiated }
return min(negotiated, AlpicoolProtocol.maxWriteSize)
}
// MARK: - Steuern
/// Schickt einen Stellbefehl und fragt kurz darauf den Zustand ab, damit