Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Bluetooth Serieller Port Status-Abfrage (https://www.delphipraxis.net/212753-bluetooth-serieller-port-status-abfrage.html)

TERWI 26. Mär 2023 12:34

Bluetooth Serieller Port Status-Abfrage
 
Ich habe hier div. BT-Teile, welche nach dem Pairing 2 serielle Ports erzeugen.
(Bspw. OBD-II Adapter für's Auto, ESP32, ...)
Auslesen, erkennen & Abfrage der "richtigen Ports" (In/Out) ist soweit nicht das Problem.

Störend / verwirrend ist, das die COMs für BT nach dem Pairing "immer" vorhanden sind.
D.h., es ist egal, ob das entsprechende BT-Gerät eingesteckt, aktiv oder "in Rechweite" ist oder eben nicht.

Falls nicht, geht das bei dem Versuch den Port zu öffnen immer in einen Timeout.
Das fange ich zwar ab / kann das prüfen, aber es dauert immer eine Weile .... ca. 5 Sek. je Port.

Es nervt auf etwas zu warten, was eh nicht da ist.
Gibt es vielleicht eine Möglichkeit zum Scannen / testen wie bei der WLAN-API, ob ein BT-Gerät überhaupt "ansprechbar" ist oder nicht ?
Oder kann man sich da noch irgendwo etwas aus der Registry pfriemeln ?

himitsu 26. Mär 2023 12:37

AW: Bluetooth Serieller Port Status-Abfrage
 
Prüfst du immer ALLE Ports?

Wenn du zu etwas Bestimmten dich verbinden willst, dann vorher einfach im BT nachsehen, ob es da ist.

TERWI 26. Mär 2023 13:02

AW: Bluetooth Serieller Port Status-Abfrage
 
Ja, ich prüfe zunächst alle verfügbaren COM's in der REG unter '\HARDWARE\DEVICEMAP\SERIALCOMM\'.
Je nach dem, was da sonst noch mittels USB verfügbar ist, sehe ich IMMER (oder nur) die "ge-Pairten" BT-COM's.
Hier aktuell COM 3/7 und 8/9 für die OBD-II BT-Adapter.


Hab schon in den BT-Demos rumhestöbert, aber nicht wirklich was brauchbares gefunden.
Ich weiss / hab ja 2 Geräte als Paired drin .... aber woher bekomme ich die Info, das es auch "Funk-Kontakt" gibt ?

Die Idee ist, vor evtl. Comport.Open nachzusehen, ob überhaupt was da ist.

Für WLAN hab ich da schon entsprechendes und suche für einen Connect vorhandene SSID's nach gewünschtem Namen, bzw. scanne da explizit noch mal sofern nicht(s) vorhanden.

... das gleiche hätte ich auch gerne für BT.

himitsu 26. Mär 2023 13:55

AW: Bluetooth Serieller Port Status-Abfrage
 
Auch ein realer Comport ist immer da, egal ob etwas am anderen Ende des Kabels hängt. (OK, dort gibt es beim Öffnen keinen Timeout, weil der Port ja da ist)

Hmmm....

Ob ein BT-Gerät einen Comport hat, findet man in den Profilen.

Welche gräte gerade da sind ... sollten bei der Suche nicht nur die Aktiven gefunden werden?
OK, ob das Gerät dann selber in sich den Port wirklich grade aktiv hat .... joar

TERWI 26. Mär 2023 14:32

AW: Bluetooth Serieller Port Status-Abfrage
 
Damit wir uns nicht miss-verstehen:
Was da real (von WinDoof aktuell [online] gemeldet wird, ist ja bekannt.
D.h., was z.Zt. an COM's verfügbar ist, kann man ja wie o.g. per Registry mit dem Key '\HARDWARE\DEVICEMAP\SERIALCOMM\' auslesen.
Und wie ich bereits sagte, ist die "Ansprache" und oder Nutzung der verfügbaren COM's auch nicht das Problem.

Hier geht es explizit und dezidiert darum, das einmal "ge-PAIR'te" COMS's per BLUETOOTH eben IMMER "DA" sind.
Bumms-Täterä egal, ob aktiv / vorhanden / in Rechweite des jeweiligen Rechners !

Meine Frage / das Problem / mein Ansinnen war & ist:
-> Wie ermittle ich, ob ein BT-Gerät wirklich "Funktechnisch" erreichbar und überhaupt ansprechbar ist ?

... weil: Wenn nicht, dann kann ich mir den Versuch, zugehörigen COM-Port zu öffnen ohnehin sparen.

Also nochmal:
Für WLAn hab ich das (fast perfekt) implementiert:
- Nach gewünschter SSID suchen ...
- Falls nicht vorhanden, explizit noch (mehrmals) scannen.,
- Connecten ...

... und eben das gleiche für den BlauZahn in grün. :shock:

TERWI 27. Mär 2023 20:13

AW: Bluetooth Serieller Port Status-Abfrage
 
Zwischenmeldung:
Ich hab mir mal von den JEDIs die Bluetooth-API gezockt und minimalistisch geschrumpft.
Funzt zumindestens anscheinend besser (?) & schneller (!) als System.Bluetooth.
Ich sehe, was:
- ge-pairt ist ... oder eben nicht mittels Scan
- die Stati
-> AUTHENTICATED (wenn Paired immer true, sonst nicht)
-> REMEBERED (dito ...)
-> CONNECTED (immer false, ausser ich öffne "auf gut Glück" erfolgeich einen Serial-Port)

Leider fehlt (NICHT NUR MIR ?) irgendwie die Möglichkeit zu erkennen, ob:
- sich ein BT-Gerät "in Reichweite" befindet.
- geschweige denn, das es sich "zu weit entfernt"
D.h., ein erkennbarer Status ala "ist ansprechbar"
oder mittels einer CallBack-Proc "OnArrive" / "OnLeave" wie es das für USB-Geräte gibt ?

Muss man das wirklich "old-fashioned" im Polling abfragen ?

Bin ich nur zu doof da was zu finden ?
Oder gibbet dat garnich ?

TurboMagic 28. Mär 2023 20:16

AW: Bluetooth Serieller Port Status-Abfrage
 
Hast du schon mal die in Delphi enthaltenen BT Komponenten getestet?
Evtl. bieten die was?

TERWI 29. Mär 2023 09:33

AW: Bluetooth Serieller Port Status-Abfrage
 
Ja, hab ich.
Aus dem Demo's zu Bluetooth Classic und BT-Chat hab ich mir elementares in eigenen BT-Wrapper gebaut.

Hatte vor einiger Zeit auch mal einen WLAN-Wrapper gebastelt. Dort gibt es vom System her eine Ereignis-Routine, welch alle möglichen Events zurückliefert (Gerät connected/disconnected, Scan startet/end, Level changed, ...).
Damit kann man ganz wunderbar ermitteln, welches "Funkgerät" in der Nähe ist und wie gut / dünn dessen Signal ist.

In der System.Bluetooth oder auch JwaBluetoothAPIs.pas gibt es nur so etwas wie "Discover", was auch nur Geräte listed, die noch NICHT ge-pairt sind.

Bereits ge-pairte Geräte sind und bleiben vorhanden - ob diese ansprechbar / erreichbar sind oder nicht.
.... und genau das hätte ich gerne gewusst.

Die aus den "Devices" auslesbaren Stati sind auch nicht wirklich hilfreich.

Das ist echte KI: KEINE INTELLIGENZ !

TERWI 29. Mär 2023 18:58

AW: Bluetooth Serieller Port Status-Abfrage
 
... ich bin jetzt minimal weiter gekommen ...
Hier mal 2 Proceduren die ich zum testen nutze:
Delphi-Quellcode:
procedure TBT.Check_Devs_WinAPI();
var
  i, ii             : integer;
  RadioHandle,
  DeviceHandle      : THandle;
  FindHandle        : HBLUETOOTH_RADIO_FIND;
  BtFrp             : TBlueToothFindRadioParams;
  RadioInfo         : BLUETOOTH_RADIO_INFO;
  DeviceInfo        : BLUETOOTH_DEVICE_INFO;
  DeviceSearchParams : BLUETOOTH_DEVICE_SEARCH_PARAMS;
  numServices       : DWORD;
  GUIDList          : array[0..31] of TGUID;
begin
  Log('Check_Devs', '===== ... by WinAPI / Jedi =====');
  BtFrp.dwSize     := SizeOf(BtFrp);
  DeviceInfo.dwSize := SizeOf(DeviceInfo);
  RadioInfo.dwSize := SizeOf(RadioInfo);
  FindHandle := BluetoothFindFirstRadio(@BtFrp, RadioHandle);
  if (FindHandle = 0) then
  begin
    LOG('Check_Devs', ' --- NO BT-RADIO FOUND');
    exit;
  end;
  repeat
    BluetoothEnableDiscovery(RadioHandle, True);
    with DeviceSearchParams do
    begin
      dwSize := SizeOf(DeviceSearchParams);
      fReturnAuthenticated := false;
      fReturnRemembered := true;
      fReturnUnknown := true; // false;
      fReturnConnected := false;
      fIssueInquiry := false;
      hRadio := RadioHandle;
    end;
    DeviceHandle := BluetoothFindFirstDevice(DeviceSearchParams, DeviceInfo);
    if DeviceHandle = 0 then continue;
    repeat
      if BluetoothGetDeviceInfo(RadioHandle, DeviceInfo) = ERROR_SUCCESS then
      begin
        BluetoothUpdateDeviceRecord(DeviceInfo);
        LOG('Check_Devs', ' -> ' + DeviceInfo.szName + ' | ' +
                          'CON: ' + booltostr(DeviceInfo.fConnected, true) + ' | ' +
                          'REM: ' + booltostr(DeviceInfo.fRemembered, true) + ' | ' +
                          'AUTH: ' + booltostr(DeviceInfo.fAuthenticated, true));
        numServices := 32;
        if (BluetoothEnumerateInstalledServices(RadioHandle,
                                            @DeviceInfo,
                                            numServices,
                                            @GUIDList) = ERROR_SUCCESS) then
        begin
          LOG('Check_Devs', 'Num. GUIDs: ' + inttostr(numServices));
          for i := 1 to numServices do
          begin
            LOG('Check_Devs', GUIDtoString(GUIDList[i-1]));
            if IsEqualGUID(GUIDList[i-1], GUID_SerialPort) then
            begin
              LOG('Check_Devs', '... HAS SERIAL-PORT !');
            end;
          end;
        end;
      end;
    until not BluetoothFindNextDevice(DeviceHandle, DeviceInfo);
    BluetoothFindDeviceClose(DeviceHandle)
  until not (BluetoothFindNextRadio(FindHandle, RadioHandle));
  BluetoothFindRadioClose(FindHandle);
end;
Delphi-Quellcode:
procedure TBT.Check_Devs_SysBTH();
var
  i, ii  : integer;
  Device : TBluetoothDevice;
  SrvList : TBluetoothServiceList;
  Srv    : TBluetoothService;
begin
  Log('Check_Devs', '===== ... by System.Bluetooth =====');
  FPairedDevices := FManager.GetPairedDevices;
  for i := 1 to FPairedDevices.Count do
  begin
    Device := FPairedDevices[i - 1];
    Log('Check_Devs', '-> ' + Device.DeviceName + ' | State: ' +
                      inttostr(ord(Device.State)));
    Application.ProcessMessages;
    inttostr(ord(Device.State));
    SrvList := Device.GetServices;
    LOG('Check_Devs', 'Num. GUIDs: ' + inttostr(SrvList.Count));
    for ii := 1 to SrvList.Count do
    begin
      Srv := SrvList[ii - 1];
      LOG('Check_Devs', GUIDtoString(Srv.UUID));
      if IsEqualGUID(Srv.UUID, GUID_SerialPort) then
      begin
        LOG('Check_Devs', '... HAS SERIAL-PORT !');
      end;
    end;
  end;
end;
Der Auszug aus dem LOG sieht dann so aus:
Zitat:

[19:32:50:059] [BT - Check_Devs]: ===== ... by WinAPI / Jedi =====
[19:32:50:074] [BT - Check_Devs]: -> OBDII | CON: False | REM: True | AUTH: True
[19:32:50:074] [BT - Check_Devs]: Num. GUIDs: 2
[19:32:50:074] [BT - Check_Devs]: {00001101-0000-1000-8000-00805F9B34FB}
[19:32:50:074] [BT - Check_Devs]: ... HAS SERIAL-PORT !
[19:32:50:074] [BT - Check_Devs]: {0000110E-0000-1000-8000-00805F9B34FB}
[19:32:50:074] [BT - Check_Devs]: -> OBDII | CON: False | REM: True | AUTH: True
[19:32:50:074] [BT - Check_Devs]: Num. GUIDs: 2
[19:32:50:074] [BT - Check_Devs]: {00001101-0000-1000-8000-00805F9B34FB}
[19:32:50:074] [BT - Check_Devs]: ... HAS SERIAL-PORT !
[19:32:50:074] [BT - Check_Devs]: {00001200-0000-1000-8000-00805F9B34FB}
[19:32:50:074] [BT - Check_Devs]: -> Galaxy J7 | CON: False | REM: True | AUTH: True
[19:32:50:074] [BT - Check_Devs]: Num. GUIDs: 12
[19:32:50:074] [BT - Check_Devs]: {00001105-0000-1000-8000-00805F9B34FB}
[19:32:50:074] [BT - Check_Devs]: {0000110A-0000-1000-8000-00805F9B34FB}
[19:32:50:074] [BT - Check_Devs]: {0000110C-0000-1000-8000-00805F9B34FB}
[19:32:50:074] [BT - Check_Devs]: {0000110E-0000-1000-8000-00805F9B34FB}
[19:32:50:074] [BT - Check_Devs]: {00001112-0000-1000-8000-00805F9B34FB}
[19:32:50:074] [BT - Check_Devs]: {00001115-0000-1000-8000-00805F9B34FB}
[19:32:50:074] [BT - Check_Devs]: {00001116-0000-1000-8000-00805F9B34FB}
[19:32:50:074] [BT - Check_Devs]: {0000111F-0000-1000-8000-00805F9B34FB}
[19:32:50:074] [BT - Check_Devs]: {0000112F-0000-1000-8000-00805F9B34FB}
[19:32:50:074] [BT - Check_Devs]: {00001132-0000-1000-8000-00805F9B34FB}
[19:32:50:074] [BT - Check_Devs]: {00001800-0000-1000-8000-00805F9B34FB}
[19:32:50:074] [BT - Check_Devs]: {00001801-0000-1000-8000-00805F9B34FB}
[19:32:50:074] [BT - Check_Devs]: -> EP650 | CON: True | REM: True | AUTH: True
[19:32:50:074] [BT - Check_Devs]: Num. GUIDs: 4
[19:32:50:074] [BT - Check_Devs]: {0000110B-0000-1000-8000-00805F9B34FB}
[19:32:50:074] [BT - Check_Devs]: {0000110C-0000-1000-8000-00805F9B34FB}
[19:32:50:074] [BT - Check_Devs]: {0000110E-0000-1000-8000-00805F9B34FB}
[19:32:50:074] [BT - Check_Devs]: {0000111E-0000-1000-8000-00805F9B34FB}

[19:32:50:074] [BT - Check_Devs]: ===== ... by System.Bluetooth =====
[19:32:50:074] [BT - Check_Devs]: -> OBDII | State: 1
[19:32:55:255] [BT - Check_Devs]: Num. GUIDs: 0
[19:32:55:255] [BT - Check_Devs]: -> OBDII | State: 1
[19:33:00:396] [BT - Check_Devs]: Num. GUIDs: 0
[19:33:00:396] [BT - Check_Devs]: -> Galaxy J7 | State: 1
[19:33:01:230] [BT - Check_Devs]: Num. GUIDs: 12
[19:33:01:230] [BT - Check_Devs]: {00001801-0000-1000-8000-00805F9B34FB}
[19:33:01:230] [BT - Check_Devs]: {00001800-0000-1000-8000-00805F9B34FB}
[19:33:01:230] [BT - Check_Devs]: {00001112-0000-1000-8000-00805F9B34FB}
[19:33:01:230] [BT - Check_Devs]: {0000111F-0000-1000-8000-00805F9B34FB}
[19:33:01:230] [BT - Check_Devs]: {0000110C-0000-1000-8000-00805F9B34FB}
[19:33:01:230] [BT - Check_Devs]: {0000110A-0000-1000-8000-00805F9B34FB}
[19:33:01:230] [BT - Check_Devs]: {0000110E-0000-1000-8000-00805F9B34FB}
[19:33:01:230] [BT - Check_Devs]: {00001116-0000-1000-8000-00805F9B34FB}
[19:33:01:230] [BT - Check_Devs]: {00001115-0000-1000-8000-00805F9B34FB}
[19:33:01:230] [BT - Check_Devs]: {0000112F-0000-1000-8000-00805F9B34FB}
[19:33:01:230] [BT - Check_Devs]: {00001132-0000-1000-8000-00805F9B34FB}
[19:33:01:230] [BT - Check_Devs]: {00001105-0000-1000-8000-00805F9B34FB}
[19:33:01:230] [BT - Check_Devs]: -> EP650 | State: 2
[19:33:03:068] [BT - Check_Devs]: Num. GUIDs: 5
[19:33:03:068] [BT - Check_Devs]: {0000111E-0000-1000-8000-00805F9B34FB}
[19:33:03:068] [BT - Check_Devs]: {00001108-0000-1000-8000-00805F9B34FB}
[19:33:03:068] [BT - Check_Devs]: {0000110B-0000-1000-8000-00805F9B34FB}
[19:33:03:068] [BT - Check_Devs]: {0000110E-0000-1000-8000-00805F9B34FB}
[19:33:03:068] [BT - Check_Devs]: {0000110C-0000-1000-8000-00805F9B34FB}
Die beiden "OBDII" sind KTZ-Adapter - nicht in Reichweite (bzw. nicht in Betrieb).
"Galaxy J7" ist mein Handy - BT ist EIN, aber anscheinend nicht connected --- ABER ANSCHEINEND LESBAR IN REICHWEITE !.
"EP650" ist mein BT-Kopfhörer - ist EIN und anscheinend connected (er spielt den Sound vom Schleppi)
Alle Geräte sind ge-PAIRED !

Man beachte die Zeiten im LOG !
- via WinAPI ist das i.d.R: < 20 ms fertig,es wird alles (bekannte) gelistet.
- via System.Bluetooth braucht's:
-- ca. 1 Sek. um die GUIDs zu lesen / anzuzeigen (WENN GERÄT IN RECHWEITE UND "ON")
-- ca. 5 Sek. zum Timeout, wenn Gerät aus / nicht erreichbar - ES WERDEN KEINE GUIDs ANGEZEIGT !

So weit so gut .....
als KRÜCKE sicherlich nutzbar & hilfreich !
Aber das kann doch kein "Industrie-Standard" sein ???
Oder haben die Schergen um Billy Boy Gates da wieder (immer noch) was vergessen ?

Mein FAZIT bisher:
Da kann ich auch genau so gut für die ermittelten Ser-COMs für BT aus der REGISTRY "mal eben schnell" ein "OPEN" versuchen.
.... das dauert auch jeweils ca. 5 Sekunden.
D.h.: Kein Zeitvorteil, aber mehr Aufwand mit dem Blauzahn.

TERWI 29. Mär 2023 19:14

AW: Bluetooth Serieller Port Status-Abfrage
 
Nachtrag:
Wenn ich beim Handy BT abschalte und den Kopfhörer ausschalte, dann kommt erstaunlicherweise sehr zeitnah folgendes LOG:
Zitat:

[20:09:07:556] [BT - Check_Devs]: ===== ... by System.Bluetooth =====
[20:09:07:556] [BT - Check_Devs]: -> OBDII | State: 1
[20:09:12:737] [BT - Check_Devs]: Num. GUIDs: 0
[20:09:12:737] [BT - Check_Devs]: -> OBDII | State: 1
[20:09:17:893] [BT - Check_Devs]: Num. GUIDs: 0
[20:09:17:893] [BT - Check_Devs]: -> Galaxy J7 | State: 1
[20:09:23:017] [BT - Check_Devs]: Num. GUIDs: 0
[20:09:23:017] [BT - Check_Devs]: -> EP650 | State: 1
[20:09:28:151] [BT - Check_Devs]: Num. GUIDs: 0


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:45 Uhr.
Seite 1 von 2  1 2      

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