Projekt

Allgemein

Profil

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"). 

Zurück