Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   BluetoothLE mit WinRT (https://www.delphipraxis.net/203792-bluetoothle-mit-winrt.html)

dnullr 24. Mär 2020 17:37

BluetoothLE mit WinRT
 
Hallo zusammen,

nachdem ich nun diverse Probleme beim Versuch hatte, mit der TBluetoothLE Komponente ein Messgerät auszulesen, habe ich in div. Foreneinträgen anderer User den Rat gelesen, auf die WinRT API direkt zuzugreifen.

Aber wie? Ich konnte leider keinen Einstieg in das Thema in Bezug auf Delphi finden. Gibt es hier vielleicht jemanden, der Code-Snippets hat, um den Einstieg hinzubekommen?

Vielen Dank im Voraus für Eure Unterstützung!
dnullr

dnullr 25. Mär 2020 17:40

AW: BluetoothLE mit WinRT
 
Hallo zusammen, kleiner Nachtrag, vielleicht ist mein Problem doch ein anderes.

Ich verwende eine TBluetoothLE Komponente in meinem Testprojekt. Per Buttonclick suche ich Geräte...

Code:
BluetoothLE1.DiscoverDevices(3000, [cSERVICE_UUID])
... und suche anschließend nach Services und Characteristics:

Code:
    BluetoothLE1.DiscoverServices(btDevice); //btDevice wurde im OnDiscoverLEDevice zugewiesen und ist das korrekte Gerät
    btService := BluetoothLE1.GetService(btDevice, cSERVICE_UUID);
    if btService <> nil then
    begin
      BluetoothLE1.GetCharacteristics(btService); //diese Zeile führt zum permanent Connect..Disconnect
      btChar := BluetoothLE1.GetCharacteristic(btService, cCHAR_UUID);
      if btChar <> nil then
      begin
        BluetoothLE1.SubscribeToCharacteristic(btDevice, btChar);
      end;
    end;
Mit der kommentierten markierten Zeile (GetCharacteristics) beginnt mein Problem: es feuert permanent das OnConnect und OnDisconnect Event. Es scheint keine echte Verbindung zustande zu kommen.

Das Gerät habe ich zuvor (Windows 10) gekoppelt, muss man ja wohl unter Windows 10 auch bei LE Geräten tun. Wenn ich testweise versuche unter iOS auf das Gerät zuzugreifen, funktioniert es prima, da kommt eine "dauerhafte" Verbindung sofort hin mit dem Auslesen der Characteristics.

Vielleicht fehlt mir nur irgendein Aufruf, den ich in der Dokumentation / den Samples übersehen habe.

Vielen Dank und einen schönen Abend!

philipp.hofmann 25. Mär 2020 21:30

AW: BluetoothLE mit WinRT
 
Probiere es doch im BLEScanner aus den Beispiel-Projekten aus und falls es dort geht, hast du auch die Code-Basis zum Vergleichen.
Und ja, unter Windows 10 musst du vorab die Devices pairen (mittlerweile speichert Win10 dies auch wieder, dies war für 12 Monate nicht der Fall).

C:\Users\Public\Documents\Embarcadero\Studio\20.0\ Samples\Object Pascal\Multi-Device Samples\Device Sensors and Services\Bluetooth\BLEScanner

Als Alternative kannst du noch die Windows-DLL von ipWorks testen (https://www.nsoftware.com/ipworks/ble/), kostet aber ein wenig, ist wirklich nur für Windows und ist auch nicht 100% stabil. Daher würde ich TBluetoothLE bevorzugen.

dnullr 25. Mär 2020 22:55

AW: BluetoothLE mit WinRT
 
Hi, der BLEScanner 'macht ja nichts'. Der findet das Gerät genau so wie mein Beispiel Code, allerdings passiert dort noch nichts mit den Services/Characteristics. Deswegen hilft mir das leider nicht.

"ExploreDevicesLE" geht ja ein Stück weiter, funktioniert bei mir aber überhaupt nicht, was ich auf das "OnDiscoveryEnd" zurückführe, was ja lt. Doku sofort triggert und unter BLE nicht so funktioniert (warum dann das Beispiel damit aufgebaut ist, ist eine andere Frage).

philipp.hofmann 26. Mär 2020 12:08

AW: BluetoothLE mit WinRT
 
Ich habe es jetzt nicht neu ausprobiert, aber wenn ich mich recht entsinne, musst du ein Device im BLEScanner anklicken und dann wird discoverServices aufgerufen. Sieht auch im Code schwer danach aus, siehe:
- TForm6.BluetoothLE1ServicesDiscovered
- TForm6.ListBox1ItemClick

Er listet dann laut Code auch die Characteristics aus und in deinem Beispiel, ist dies ja die problematische Stelle.

dnullr 26. Mär 2020 13:52

AW: BluetoothLE mit WinRT
 
Ja, das BLEScanner Beispiel führt genau zu dem gleichen Verhalten. D.h. wenn ich im OnConnect / OnDisconnect der TBluetoothLE Komponente Logging hinzufüge (im Beispiel ist sind die Events nicht zugewiesen), sieht man, dass nach dem Zugriff auf die Characteristics ein Connect .. Disconnect .. permanent läuft.

Hintergrund meines Problems ist, dass ich trotz Subscription/Notification eines Characteristics keine Daten empfange, sobald eine Messung erfolgt ist. Daher bin ich erst auf Spurensuche gegangen und über das permanente Connect/Disconnect gestolpert.

Das Gerät zeigt auch eigtl. ein Bluetooth Symbol im Display an, sobald die Verbindung hergestellt ist (mit dem iOS Testprogramm geprüft).

dnullr 27. Mär 2020 14:52

AW: BluetoothLE mit WinRT
 
Noch ein kleiner Nachtrag nach weiteren Tests: mit dem Bluetooth LE Explorer aus dem Windows Store kann ich problemlos (ohne vorher zu koppeln) das Gerät verbinden und die Characteristics auslesen bzw. subscriben.

rabatscher 16. Jul 2021 13:54

AW: BluetoothLE mit WinRT
 
Ich hab mir erlaubt ein file ins Delphi Bug Tracking System hochzuladen,

https://quality.embarcadero.com/browse/RSP-21711

das so die schlimmsten Dinge fixen sollte:
* OnEndDiscoverDevices wird nie aufgerufen. (+ memory leak)
* Erlaubt nun Geräte zu finden, die nicht vorher gebonded wurden


Ich hab das File immer benutz, indem ich es ins Projekt direkt hinzugefügt habe und das Projekt
ohne Runtime Packages gebuilded habe. Ich bin mir nicht sicher ob das auch mit Packages geht...

hoffe es hilf.

lg
Mike


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:21 Uhr.

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