Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Cross-Platform-Entwicklung (https://www.delphipraxis.net/91-cross-platform-entwicklung/)
-   -   Delphi BluetoothLE: ein Device wird unter MacOS nicht gefunden (https://www.delphipraxis.net/207660-bluetoothle-ein-device-wird-unter-macos-nicht-gefunden.html)

philipp.hofmann 22. Apr 2021 15:36

AW: BluetoothLE: ein Device wird unter MacOS nicht gefunden
 
Ich benutze FBluetoothManagerLE.StartDiscovery.
Zitat:

(klar ich muss ja auch das 3500ms OnEndDiscoverDevices abwarten
Sind dies nicht 1.500ms? Ich warte immer 2.000ms damit dies passt. Dies scheint auch stabil zu sein.
Wie gesagt, ich mache jetzt auf dem Mac immer ein

BluetoothManagerLE.StartDiscovery(4000,Erste-Filter-UUID);
BluetoothManagerLE.StartDiscovery(4000,Zweite-Filter-UUID);
...
BluetoothManagerLE.StartDiscovery(4000);

und für den Fall ohne Filter prüfe ich in
BluetoothLEDiscoverLEDevice(const Sender: TObject; const ADevice: TBluetoothLEDevice; Rssi: Integer; const ScanResponse: TScanResponse);
ob ADevice.ScannedAdvertiseData.ContainsServiceUUID(E rste-Filter-UUID)
or ADevice.ScannedAdvertiseData.ContainsServiceUUID(Z weite-Filter-UUID)
...
gilt und nur dann wird das Device eingebunden.

Damit werden alle meine Devices stabil gefunden, auch der Wahoo KICKR V5. Unter allen anderen OS geht es bisher ohne die Suche ohne Filter.
Es ist jetzt aber so eingebaut, dass ich dies jederzeit einfach auf andere OS erweitern kann. Dies sind nur 3 {$IF defined(...)-Stellen im Code.

Rollo62 23. Apr 2021 07:40

AW: BluetoothLE: ein Device wird unter MacOS nicht gefunden
 
Zitat:

Zitat von philipp.hofmann (Beitrag 1487629)
Zitat:

(klar ich muss ja auch das 3500ms OnEndDiscoverDevices abwarten
Sind dies nicht 1.500ms? Ich warte immer 2.000ms damit dies passt.

Ja sorry, mein Typo.
Ich habe da generell 3500ms, um dem Phone etwas mehr Zeit zu geben.

Zitat:

Zitat von philipp.hofmann (Beitrag 1487629)
Wie gesagt, ich mache jetzt auf dem Mac immer ein

BluetoothManagerLE.StartDiscovery(4000,Erste-Filter-UUID);
BluetoothManagerLE.StartDiscovery(4000,Zweite-Filter-UUID);
...
BluetoothManagerLE.StartDiscovery(4000);

Ich habe gestern mit dem Demo 1:1 getestet, weil ich dachte das ging schon nicht.
Da war bei einem Filter aber Alles OK, er findet auch mehrere gleiche Geräte.
Gerade habe mit 2. Filter getestet, das geht dann nicht mehr, findet weder das eine noch das Andere.

Delphi-Quellcode:
 
  TRAINER_SERVICE_WAHOO:               TBluetoothUUID = '{0000FFB0-0000-1000-8000-00805F9B34FB}';
  TRAINER_SERVICE_OTHER:               TBluetoothUUID = '{00000020-0000-1000-8000-00805F9B34FB}';
  ...
  bluetoothLEDeviceTypeHelpList.add( TRAINER_SERVICE_WAHOO ); //<== stimmt ,es geht nur mit einem Service in der Liste
  bluetoothLEDeviceTypeHelpList.add( TRAINER_SERVICE_OTHER );
Ich denke genau deshalb hatte ich das schon vor Jahren zu den Akten gelegt.
Nur hatte ich damals auch Probleme auf iOS und Android, soweit ich noch sagen kann,
deshalb wundert es mich das es jetzt bei Dir damit funktioniert.

Analyse im OnDiscoverLEDevice:
Ich mache es im Prinzip auch so, nur es kommen im BluetoothLEDiscoverLEDevice gerne 4-5 mal das gleiche Device, deshalb speichere ich das Ergebnis nur EINMAL in ein Dictionary (oder Map), und werte das erst später im OnEndDiscoverDevices aus.
Die ganzen Uninteressanten, insbesondere z.B. die mit DeviceName = '', lade ich gar nicht erst ins Dictionary, und halte es dabei schön sauber.
Weil das Analysieren und Holen der Service UUID auch wieder mehr Zeit kostet.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:15 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz