Fehler #133
Von Julius Haman vor 8 Tagen aktualisiert
### Problem Der BLE-Pulsmesser (Garmin Instinct 2X Solar, Herzfrequenz-Broadcast) muss in ErControl häufiger neu gekoppelt (neu ausgewählt) werden, obwohl die gespeicherte Geräteadresse unverändert bleibt (`FAD7BDDCB983`, statische Zufallsadresse). ### Ursache (bestätigt) Beobachtung im Code Windows liefert für ein Gerät mit Zufallsadresse - `Device.BleDeviceAddress` speichert nur dann eine Verbindung, wenn die Adresse, `BleDeviceName` dient nur der Anzeige. - `BlePulsmesser.EstablishConnectionAsync` ruft `BluetoothLEDevice.FromBluetoothAddressAsync(address)` ohne `BluetoothAddressType` auf. - Seit #29 gibt es das Gerät kürzlich in einem Advertisement gesehen hat. Nach einem Neustart für Pulsmesser keinen Wildcard-Scan mehr: Schlägt der Uhr (bzw. wenn Windows den Eintrag nicht mehr im Zwischenspeicher hat) lieferte `BluetoothLEDevice.FromBluetoothAddressAsync(address)` dauerhaft sofort `null` (3 bis 15 ms), obwohl die Uhr sendete. ErControl suchte nie selbst, daher half nur das Neukoppeln, dessen Aufruf fehl, kommt keine Verbindung zustande. - Beim Neukoppeln läuft `ScanForAllAsync`; dieser Scan macht das Gerät Windows offenbar wieder bekannt machte. bekannt. Nicht die Ursache: Die Adresse wechselt ### Vermutete Ursache (noch nicht (bleibt auch bei Neukopplung gleich). Eine Windows-Kopplung existiert für die Uhr nicht, die Verbindung läuft rein per BLE/GATT. Davon zu unterscheiden: Ist die Uhr zwar bekannt, aber noch bestätigt) Windows kennt das Gerät mit Zufallsadresse nicht verbindbar (Broadcast noch nicht aktiv oder belegt), meldet GATT `Unreachable` (ca. 7,7 s, 0 Services). Das behebt sich nach dem Start des Broadcasts durch die vorhandene Wiederholung von selbst. ### Umsetzung - Diagnose-Logging mehr (kein aktuelles Advertisement im Verbindungsaufbau von `BlePulsmesser` (Adresstyp, Dauer, ConnectionStatus, GATT-Status, ProtocolError je Schritt). - Fix: Vor Cache), `FromBluetoothAddressAsync` wartet `BlePulsmesser` bis zu 5 s auf ein Advertisement liefert dann `null` bzw. der GATT-Service wird nicht gefunden. Eine wechselnde Adresse (`BluetoothLEAdvertisementWatcher`) und übergibt dessen Adresstyp (Random/Public). Kommt keins, wird trotzdem verbunden. - Einheitliche Log-Meldungen: `BLE-Pulsmesser {Adresse}: <Aussage> (<Details>, <Dauer> ms)`. ist unwahrscheinlich, da sie bei Neukopplung gleich bleibt. ### Verifiziert (05.10.2026) Lösungsansatz - Ohne Fix, 1. Vor dem Verbinden kurz per `BluetoothLEAdvertisementWatcher` nach Neustart der Uhr: `FromBluetoothAddressAsync` liefert dauerhaft `null`. genau dieser Adresse scannen (Timeout ca. 5 s). - Mit Fix: "Advertisement gesehen, Typ Random" (2,5 s), danach "Verbunden, Notifications abonniert" (8,7 s) ohne Neukoppeln. 2. Bei Zufallsadressen (obere zwei Bits `11`) `FromBluetoothAddressAsync(address, BluetoothAddressType.Random)` verwenden. - Ein vorangegangener Lauf mit dem Fix macht die Uhr Windows bekannt, sodass auch die Version ohne Fix danach wieder verbindet (Zwischenspeicher). 3. Fehlerursache beim Verbindungsaufbau ausführlicher loggen (derzeit keine BLE-Einträge in den Logs). ### Hinweise Zum Verifizieren - Die Uhr nimmt nur einen Empfänger gleichzeitig an (Garmin-Verhalten); ein zweiter Empfänger (anderer Rechner, App) macht sie unerreichbar. - Wenn ein Advertisement "nicht gesehen" wird, sendet Beim nächsten erforderlichen Neukoppeln die Uhr angezeigte Meldung notieren („nicht erreichbar" vs. „Heart-Rate-Service nicht (Broadcast aktiv?) oder der PC empfängt sie nicht. gefunden").