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
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
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 21:18 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz