AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Bluetooth Geräte in der Näher erkennen
Thema durchsuchen
Ansicht
Themen-Optionen

Bluetooth Geräte in der Näher erkennen

Ein Thema von Cylence · begonnen am 7. Feb 2011 · letzter Beitrag vom 9. Feb 2011
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Cylence
Cylence

Registriert seit: 2. Sep 2004
Ort: Allgäu
246 Beiträge
 
Delphi 7 Enterprise
 
#1

Bluetooth Geräte in der Näher erkennen

  Alt 7. Feb 2011, 08:53
Hallo,

ich möchte Bluetooth Geräte in der Nähe erkennen. Ich habe dazu schon etwas gefunden, was an sich auch mehr oder weniger geht:

Delphi-Quellcode:

uses
  jwaBluetoothApis;
  

procedure TForm1.BitBtn1Click(Sender: TObject);
var
  hRadio,hDeviceFind : THANDLE;
  hfind : HBLUETOOTH_RADIO_FIND;
  btfrp : TBlueToothFindRadioParams;
  radioInfo : BLUETOOTH_RADIO_INFO;
  deviceInfo : BLUETOOTH_DEVICE_INFO;
  deviceSearchParams : BLUETOOTH_DEVICE_SEARCH_PARAMS;
  Err, x : integer;
begin
  Memo1.Lines.Clear;
  x := 0;
  RefreshBtDevices;
  try
   try
    btfrp.dwSize := sizeof(btfrp);
    hFind := BluetoothFindFirstRadio(@btfrp, hRadio);
    BluetoothEnableDiscovery(hRadio,True);
    if (hFind > 0) then begin
      repeat
        BluetoothEnableDiscovery(hRadio,True);
        radioInfo.dwSize := sizeof(radioInfo);
        if (ERROR_SUCCESS = BluetoothGetRadioInfo(hRadio, radioInfo))
         then Memo1.Lines.Add('Radio: '+ radioInfo.szName)
         else Memo1.Lines.Add('unknown error');
        deviceInfo.dwSize := sizeof(deviceInfo);
        deviceSearchParams.dwSize := sizeof(deviceSearchParams);
        deviceSearchParams.fReturnUnknown := true;
        deviceSearchParams.fReturnRemembered := true;
        deviceSearchParams.hRadio := hRadio;
        hDeviceFind := BluetoothFindFirstDevice(deviceSearchParams, deviceInfo);
        BluetoothUpdateDeviceRecord(deviceInfo);
        Memo1.Lines.Add('Device: '+deviceInfo.szName);
        if deviceInfo.fConnected then Memo1.Lines.Add('Device is connected')
         else Memo1.Lines.Add('Device is not connected');
        try
          Memo1.Lines.Add('Last seen: '+ DateTimeToStr(SystemTimeToDateTime(deviceInfo.stLastSeen)));
        except

        end;
        try
          Memo1.Lines.Add('Class of Device: ' + IntToStr(deviceInfo.ulClassofDevice));
        except

        end;
        if (hDeviceFind>0) then begin
           while(BluetoothFindNextDevice(hDeviceFind, deviceInfo))
           do begin
              BluetoothGetDeviceInfo(hRadio, deviceInfo);
              BluetoothUpdateDeviceRecord(deviceInfo);
              Memo1.Lines.Add('Device: '+deviceInfo.szName);
              if deviceInfo.fConnected then Memo1.Lines.Add('Device is connected')
               else Memo1.Lines.Add('Device is not connected');
              try
                Memo1.Lines.Add('Last seen: '+ DateTimeToStr(SystemTimeToDateTime(deviceInfo.stLastSeen)));
              except
              
              end;
              try
                Memo1.Lines.Add('Class of Device: ' + IntToStr(deviceInfo.ulClassofDevice));
              except

              end;
           end;
           BluetoothFindDeviceClose(hDeviceFind);
        end;
        x := x+1;
      until
        (BluetoothFindNextRadio(hFind, hRadio)) or (x > 0);
      BluetoothFindRadioClose(hFind);
    end
    else begin
      Err := GetLastError;
      Memo1.Lines.Add(SysErrorMessage(Err)+' ('+inttostr(Err)+')');
    end;
   except
    on E:Exception do Memo1.Lines.Add('error'+e.Message);
   end;
  finally

  end;
end;
hier hab ich aber das Problem dann das nur die zuletzt gefundeenn geräte angezeigt werden, er aktualisiert diese nicht. Also wenn ich bei meinem Handy Bluetooth anschalte, muß ich erstmal in der windows bluetooth geräte suchen funktion kurz mal reinschaun und erst dann findet mein prog das gerät auch.
Dann habe ich das hier noch gefunden/bzw zusammengebastelt:

Delphi-Quellcode:
procedure TForm1.RefreshBtDevices;
var
  ASelParams: BLUETOOTH_SELECT_DEVICE_PARAMS;
  ASelParamsSize: dword;
begin
  ASelParamsSize := SizeOf(BLUETOOTH_SELECT_DEVICE_PARAMS);
  FillChar(ASelParams, ASelParamsSize, 0);
  with ASelParams do begin
    dwSize := ASelParamsSize;
    hwndParent := handle;
    fShowRemembered := False;
    fAddNewDeviceWizard := False;
    fShowUnknown := True;
    fShowAuthenticated := True;
    fSkipServicesPage := True;
    fForceAuthentication := False;
    cNumOfClasses := 0;
    cNumDevices := 0;
  end;
  XCounter := 0;
  fAbort := False;
  tHideBTWIndow.Create(False);
  BluetoothSelectDevices(@ASelParams);
  BluetoothSelectDevicesFree(@ASelParams);
  fAbort := True;
end;

procedure tHideBTWIndow.Execute;
var
 TheWindowHandle: THandle;
begin
  priority := tpHigher;
  try
    while not Form1.fAbort do begin
     TheWindowHandle := FindAWindow('Bluetooth-Gerät auswählen', '');
     if TheWindowHandle<>0 then ShowWindow(TheWindowHandle,sw_Hide);
     if TheWindowHandle<>0 then PostMessage(TheWindowHandle,WM_CLOSE, 0, 0);
    end;
  except

  end;
end;
damit kann ich nun die Geräte aktualisieren, es erscheint dann immer das Windows BT Geräte suchen fenster, was ich mit einem Thread Schleisse. .... Sehr unschön so würd ich mal sagen. Kann ich irgendwie anders Windows sagen das es JETZT SOFORT nach neuen Bluetoot Geräten suchen soll? Wäre toll wenn mir jemand einen Tipp geben könnte.

Gruß tom
Tom
Just DO it

Geändert von Cylence ( 7. Feb 2011 um 09:04 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Deep-Sea
Deep-Sea

Registriert seit: 17. Jan 2007
907 Beiträge
 
Delphi XE2 Professional
 
#2

AW: Bluetooth Geräte in der Näher erkennen

  Alt 7. Feb 2011, 09:31
  1. until (BluetoothFindNextRadio(hFind, hRadio)) or (x > 0); Du brichst die Schleife ab, wenn du ein weiteres Radio findest (oder wenn x größer 0 ist) aber machst weiter, wenn du KEINS findest? Sicher, dass du das so wolltest?
  2. Nutze doch auch für die Devices eine repeat-Schleife, dann musst du den kompletten Block mit dem Hinzufügen zum Memo nicht zwei mal schreiben: DRY.
  3. Vlt. solltest du bei deviceSearchParams den Wert fIssueInquiry auf true setzen (Und dir ggf. auch mal die anderen Werte ansehen, die es da noch so gibt.)
Chris
Die Erfahrung ist ein strenger Schulmeister: Sie prüft uns, bevor sie uns lehrt.

Geändert von Deep-Sea ( 7. Feb 2011 um 09:33 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Cylence
Cylence

Registriert seit: 2. Sep 2004
Ort: Allgäu
246 Beiträge
 
Delphi 7 Enterprise
 
#3

AW: Bluetooth Geräte in der Näher erkennen

  Alt 7. Feb 2011, 10:09
Hi,

ja das mit dem Abbrechen aus der Schleife kommt, weil er sonst unendlich oft immer das selbe radio netzt wieder einliest, warum auch immer...
das is jetzt auch nur so ein First Test Code
naja mit dem Inqiry True hab ich keine Änderung bemerkt, geht immer noch nur wenn ich vorher das Selectdevices mache, erst dann wird aktualisiert. Aber da erscheint a das Windows Fenster wegen den geräten kurz und das taugt mir nicht, das geflacker kurz...
Die anderen Werte hab ich schon ausprobiert, auch beim SelectDevices, da gibts zb fAddNewDeviceWizard := False; usw.
Tom
Just DO it
  Mit Zitat antworten Zitat
Benutzerbild von Deep-Sea
Deep-Sea

Registriert seit: 17. Jan 2007
907 Beiträge
 
Delphi XE2 Professional
 
#4

AW: Bluetooth Geräte in der Näher erkennen

  Alt 7. Feb 2011, 10:24
Ich habe in einem Testprogramm folgendes gefunden:
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var
  hDeviceFind:THANDLE;
  deviceInfo:BLUETOOTH_DEVICE_INFO;
  deviceSearchParams:BLUETOOTH_DEVICE_SEARCH_PARAMS;
begin
  deviceInfo.dwSize := SizeOf(deviceInfo);
  With deviceSearchParams do
  begin
    dwSize := SizeOf(deviceSearchParams);
    fReturnAuthenticated := true;
    fReturnRemembered := true;
    fReturnUnknown := true;
    fReturnConnected := true;
    fIssueInquiry := true;
    cTimeoutMultiplier := 2;
    hRadio := 0;
  end;
  hDeviceFind := BluetoothFindFirstDevice(deviceSearchParams, deviceInfo);
  If hDeviceFind = 0 then RaiseLastOSError
  else try
    repeat
      ShowMessage('Device: ' + deviceInfo.szName);
      //BluetoothDisplayDeviceProperties(0, deviceInfo);
    until not BluetoothFindNextDevice(hDeviceFind, deviceInfo);
  finally
    BluetoothFindDeviceClose(hDeviceFind);
  end;
end;
Leider kann ich dir nicht viel dazu sagen, da es schon einige Zeit her ist und auch testen kann ich es nicht mehr, weil ich kein Bluetooth-Gerät hier habe.
Chris
Die Erfahrung ist ein strenger Schulmeister: Sie prüft uns, bevor sie uns lehrt.
  Mit Zitat antworten Zitat
Benutzerbild von Cylence
Cylence

Registriert seit: 2. Sep 2004
Ort: Allgäu
246 Beiträge
 
Delphi 7 Enterprise
 
#5

AW: Bluetooth Geräte in der Näher erkennen

  Alt 7. Feb 2011, 10:53
Hi,

danke für den code, ist aber ausser dem timeout ist das fast gleich wie das was ich probiere, ich werds mal testen, aber ich denke das ich da immer noch das selbe problem hab das ich erst nach windows neue BT geräte suchen, dann richtige ergebnisse bekomme.

Danke schonmal, ich werds mal checken, vielleicht macht das timeout ja den unterschied
Tom
Just DO it
  Mit Zitat antworten Zitat
Benutzerbild von Deep-Sea
Deep-Sea

Registriert seit: 17. Jan 2007
907 Beiträge
 
Delphi XE2 Professional
 
#6

AW: Bluetooth Geräte in der Näher erkennen

  Alt 7. Feb 2011, 10:56
[...] aber ausser dem timeout ist das fast gleich wie das was ich probiere [...]
Und das dort nicht explizit nach Radios gesucht wird
Chris
Die Erfahrung ist ein strenger Schulmeister: Sie prüft uns, bevor sie uns lehrt.
  Mit Zitat antworten Zitat
Benutzerbild von Cylence
Cylence

Registriert seit: 2. Sep 2004
Ort: Allgäu
246 Beiträge
 
Delphi 7 Enterprise
 
#7

AW: Bluetooth Geräte in der Näher erkennen

  Alt 7. Feb 2011, 18:24
Hi nochmal,

also ich hab das jetzt so ausprobiert, und es geht nicht, es findet zwar erstmal so die Geräte, aber wenn ich dann beim Handy BT ausschalt, bleibt das Gerät trotzdem in Reichweite laut pc, und auch das Lastseen Datum/Zeit aktualisiert sich. Nur wenn ich eben vorher kurz den nach geräte suchen wizard aufmache und sofort wieder weghau, dann gehts, dann aktualisiert es wirklich was für geräte da sind und welche nicht. Aber da hab ich eben immer kurz das geflacker, wenn das fenster vom wizard aufgeht und ich es mit dem thread schliesse. Hat keiner eine Idee wie man das Bluetooth geräte suchen auch starten kann, ohne das das fenster aufgeht?

schönen Abend noch an alle

tom
Tom
Just DO it
  Mit Zitat antworten Zitat
Benutzerbild von Cylence
Cylence

Registriert seit: 2. Sep 2004
Ort: Allgäu
246 Beiträge
 
Delphi 7 Enterprise
 
#8

AW: Bluetooth Geräte in der Näher erkennen

  Alt 8. Feb 2011, 08:19
Hier mal das test project was ich zusammen gebaut habe...
Angehängte Dateien
Dateityp: rar Bluetooth.rar (527,4 KB, 96x aufgerufen)
Tom
Just DO it
  Mit Zitat antworten Zitat
hathor
(Gast)

n/a Beiträge
 
#9

AW: Bluetooth Geräte in der Näher erkennen

  Alt 8. Feb 2011, 09:47
Fehler:

Warum wird der Cursor bewegt?
Programm lässt sich nur mit ALT-F4 beenden.

Ursache:
- das creierte Window ist unsichtbar,
- ein Button(OK) ist deaktiviert, bekommt aber trotzdem den Focus,
- die Prioritätserhöhung ist überflüssig!

Delphi-Quellcode:
procedure tHideBTWIndow.Execute;
var
 TheWindowHandle: THandle;
begin
  priority := tpHigher; // wozu ???
  try
    while not Form1.fAbort do begin
     TheWindowHandle := FindAWindow('Bluetooth-Gerät auswählen', '');
// if TheWindowHandle<>0 then ShowWindow(TheWindowHandle,sw_Hide);
// if TheWindowHandle<>0 then PostMessage(TheWindowHandle,WM_CLOSE, 0, 0);
    end;
  except

  end;
end;

Geändert von hathor ( 8. Feb 2011 um 10:04 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#10

AW: Bluetooth Geräte in der Nähe erkennen

  Alt 8. Feb 2011, 10:05
Keine konkrete Lösung zu deinem Problem aber vielleicht doch ein nützlicher Hinweis:
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var
  hDeviceFind:THANDLE;
  deviceInfo:BLUETOOTH_DEVICE_INFO;
  deviceSearchParams:BLUETOOTH_DEVICE_SEARCH_PARAMS;
begin
  deviceInfo.dwSize := SizeOf(deviceInfo);
In obigem Code wird der Low-Level-Code (das Blutoothzeug) direkt mit High-Level-Code (Events) vermischt.
Das ist nicht gut, denn es fehlt eine Abstraktionsebene bzw. es verstösst gegen das Prinzip Single Level of Abstraction.
Hier fehlt schlichtweg eine Klasse, um die Zugiffe auf die Bluetooth-API zu kapseln.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 16:18 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