2009-10-06 11 views
10

W moim programie Delphi (na Windows Xp) chciałbym sprawdzić dostępne sieci WiFi. Czy masz jakiś pomysł, jak to zrobić? Najlepiej używać funkcji API MS WlanScan, ale nie znalazłem przykładu. Czy ktoś może mi pomóc?Chcę pracować z Wifi z Delphi. W jaki sposób?

+0

Możesz opublikować wersję Delphi, z której korzystasz. – TrueWill

Odpowiedz

21

Można użyć urządzenia Native Wifi API dostępnego od systemu Windows Vista i Windows XP. Starsze wersje systemu Windows nie są obsługiwane.

W tym link można znaleźć bardzo ładne tłumaczenie nagłówków.

Napisałem ten kod, używając tych nagłówków. Testowane w Delphi 2007 i Windows Vista.

program DetectWifiUsingDelphi; 

{$APPTYPE CONSOLE} 

uses 
    Windows, 
    SysUtils, 
    //TypInfo, 
    nduWlanAPI in 'nduWlanAPI.pas', 
    nduWlanTypes in 'nduWlanTypes.pas'; 


function DOT11_AUTH_ALGORITHM_To_String(Dummy :Tndu_DOT11_AUTH_ALGORITHM):String; 
begin 
    Result:=''; 
    case Dummy of 
     DOT11_AUTH_ALGO_80211_OPEN   : Result:= '80211_OPEN'; 
     DOT11_AUTH_ALGO_80211_SHARED_KEY : Result:= '80211_SHARED_KEY'; 
     DOT11_AUTH_ALGO_WPA     : Result:= 'WPA'; 
     DOT11_AUTH_ALGO_WPA_PSK    : Result:= 'WPA_PSK'; 
     DOT11_AUTH_ALGO_WPA_NONE   : Result:= 'WPA_NONE'; 
     DOT11_AUTH_ALGO_RSNA    : Result:= 'RSNA'; 
     DOT11_AUTH_ALGO_RSNA_PSK   : Result:= 'RSNA_PSK'; 
     DOT11_AUTH_ALGO_IHV_START   : Result:= 'IHV_START'; 
     DOT11_AUTH_ALGO_IHV_END    : Result:= 'IHV_END'; 
    end; 
End; 

function DOT11_CIPHER_ALGORITHM_To_String(Dummy :Tndu_DOT11_CIPHER_ALGORITHM):String; 
Begin 
    Result:=''; 
    case Dummy of 
    DOT11_CIPHER_ALGO_NONE  : Result:= 'NONE'; 
    DOT11_CIPHER_ALGO_WEP40  : Result:= 'WEP40'; 
    DOT11_CIPHER_ALGO_TKIP  : Result:= 'TKIP'; 
    DOT11_CIPHER_ALGO_CCMP  : Result:= 'CCMP'; 
    DOT11_CIPHER_ALGO_WEP104 : Result:= 'WEP104'; 
    DOT11_CIPHER_ALGO_WPA_USE_GROUP : Result:= 'WPA_USE_GROUP OR RSN_USE_GROUP'; 
    //DOT11_CIPHER_ALGO_RSN_USE_GROUP : Result:= 'RSN_USE_GROUP'; 
    DOT11_CIPHER_ALGO_WEP   : Result:= 'WEP'; 
    DOT11_CIPHER_ALGO_IHV_START  : Result:= 'IHV_START'; 
    DOT11_CIPHER_ALGO_IHV_END  : Result:= 'IHV_END'; 
    end; 
End; 

procedure Scan(); 
const 
WLAN_AVAILABLE_NETWORK_INCLUDE_ALL_ADHOC_PROFILES =$00000001; 
var 
    hClient    : THandle; 
    dwVersion   : DWORD; 
    ResultInt   : DWORD; 
    pInterface   : Pndu_WLAN_INTERFACE_INFO_LIST; 
    i     : Integer; 
    j     : Integer; 
    pAvailableNetworkList: Pndu_WLAN_AVAILABLE_NETWORK_LIST; 
    pInterfaceGuid  : PGUID; 
    SDummy    : string; 
begin 
    ResultInt:=WlanOpenHandle(1, nil, @dwVersion, @hClient); 
    if ResultInt<> ERROR_SUCCESS then 
    begin 
    WriteLn('Error Open CLient'+IntToStr(ResultInt)); 
    Exit; 
    end; 

    ResultInt:=WlanEnumInterfaces(hClient, nil, @pInterface); 
    if ResultInt<> ERROR_SUCCESS then 
    begin 
    WriteLn('Error Enum Interfaces '+IntToStr(ResultInt)); 
    exit; 
    end; 

    for i := 0 to pInterface^.dwNumberOfItems - 1 do 
    begin 
    Writeln('Interface  ' + pInterface^.InterfaceInfo[i].strInterfaceDescription); 
    WriteLn('GUID   ' + GUIDToString(pInterface^.InterfaceInfo[i].InterfaceGuid)); 
    Writeln(''); 
    pInterfaceGuid:= @pInterface^.InterfaceInfo[pInterface^.dwIndex].InterfaceGuid; 

     ResultInt:=WlanGetAvailableNetworkList(hClient,pInterfaceGuid,WLAN_AVAILABLE_NETWORK_INCLUDE_ALL_ADHOC_PROFILES,nil,pAvailableNetworkList); 
     if ResultInt<> ERROR_SUCCESS then 
     begin 
     WriteLn('Error WlanGetAvailableNetworkList '+IntToStr(ResultInt)); 
     Exit; 
     end; 

     for j := 0 to pAvailableNetworkList^.dwNumberOfItems - 1 do 
     Begin 
      WriteLn(Format('Profile   %s',[WideCharToString(pAvailableNetworkList^.Network[j].strProfileName)])); 
      SDummy:=PChar(@pAvailableNetworkList^.Network[j].dot11Ssid.ucSSID); 
      WriteLn(Format('NetworkName  %s',[SDummy])); 
      WriteLn(Format('Signal Quality %d ',[pAvailableNetworkList^.Network[j].wlanSignalQuality])+'%'); 
      //SDummy := GetEnumName(TypeInfo(Tndu_DOT11_AUTH_ALGORITHM),integer(pAvailableNetworkList^.Network[j].dot11DefaultAuthAlgorithm)) ; 
      SDummy:=DOT11_AUTH_ALGORITHM_To_String(pAvailableNetworkList^.Network[j].dot11DefaultAuthAlgorithm); 
      WriteLn(Format('Auth Algorithm %s ',[SDummy])); 
      SDummy:=DOT11_CIPHER_ALGORITHM_To_String(pAvailableNetworkList^.Network[j].dot11DefaultCipherAlgorithm); 
      WriteLn(Format('Auth Algorithm %s ',[SDummy])); 
      Writeln(''); 
     End; 
    end; 

    WlanCloseHandle(hClient, nil); 

end; 
begin 
    try 
    Scan(); 
    Readln; 
    except 
    on E:Exception do 
     Writeln(E.Classname, ': ', E.Message); 
    end; 
end. 

alt text http://i33.tinypic.com/2z83ubt.jpg

Bye.

+0

Link do pliku WlanAPI.zip jest uszkodzony. Oto działający link: http://www.delphibasics.info/home/delphibasicsprojects/wifiscanner – kobik

4

Można dostać się do tego również przeprowadzając kwerendę WMI:

SELECT * FROM MSNdis_80211_ServiceSetIdentifier 

Jeśli są specjalnie szuka realizacji Delphi, tam jest biblioteką WMI dostępny od Magenta Systems który zawiera kompletne źródło i może być swobodnie używany . Dostępne pobieranie zawiera skompilowany plik wykonywalny, w którym można wypróbować to zapytanie, aby sprawdzić, czy zawiera wszystkie poszukiwane dane. Jedyną wadą tego podejścia jest to, że usługa WMI musi być uruchomiona (zwykle tak jest, to nie jest tak duży problem).

Powiązane problemy