AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

BluetoothLE mit WinRT

Ein Thema von dnullr · begonnen am 24. Mär 2020 · letzter Beitrag vom 16. Jul 2021
Antwort Antwort
dnullr

Registriert seit: 5. Apr 2013
5 Beiträge
 
#1

BluetoothLE mit WinRT

  Alt 24. Mär 2020, 17:37
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
  Mit Zitat antworten Zitat
dnullr

Registriert seit: 5. Apr 2013
5 Beiträge
 
#2

AW: BluetoothLE mit WinRT

  Alt 25. Mär 2020, 17:40
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!
  Mit Zitat antworten Zitat
philipp.hofmann

Registriert seit: 21. Mär 2012
Ort: Hannover
858 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: BluetoothLE mit WinRT

  Alt 25. Mär 2020, 21:30
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.
  Mit Zitat antworten Zitat
dnullr

Registriert seit: 5. Apr 2013
5 Beiträge
 
#4

AW: BluetoothLE mit WinRT

  Alt 25. Mär 2020, 22:55
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).
  Mit Zitat antworten Zitat
philipp.hofmann

Registriert seit: 21. Mär 2012
Ort: Hannover
858 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: BluetoothLE mit WinRT

  Alt 26. Mär 2020, 12:08
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.

Geändert von philipp.hofmann (26. Mär 2020 um 12:12 Uhr)
  Mit Zitat antworten Zitat
dnullr

Registriert seit: 5. Apr 2013
5 Beiträge
 
#6

AW: BluetoothLE mit WinRT

  Alt 26. Mär 2020, 13:52
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).
  Mit Zitat antworten Zitat
dnullr

Registriert seit: 5. Apr 2013
5 Beiträge
 
#7

AW: BluetoothLE mit WinRT

  Alt 27. Mär 2020, 14:52
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.
  Mit Zitat antworten Zitat
rabatscher

Registriert seit: 13. Dez 2007
Ort: Bruck an der Mur
61 Beiträge
 
#8

AW: BluetoothLE mit WinRT

  Alt 16. Jul 2021, 13:54
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
  Mit Zitat antworten Zitat
Antwort Antwort

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:32 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