2009-10-06 2 views
10

Nel mio programma Delphi (su Windows Xp) mi piacerebbe controllare le reti WiFi disponibili. Hai qualche idea su come farlo? La cosa migliore è probabilmente usare la funzione API di MS WlanScan ma non ho trovato un esempio. Qualcuno può aiutarmi?Voglio lavorare con Wifi con Delphi. Come?

+0

È possibile che si desideri pubblicare la versione di Delphi che si sta utilizzando. – TrueWill

risposta

21

È possibile utilizzare Native Wifi API, disponibile da Windows Vista e Windows XP. Le versioni precedenti di Windows non sono supportate.

In questo link è possibile trovare una traduzione molto bella delle intestazioni.

Ho scritto questo codice utilizzando queste intestazioni. Testato in Delphi 2007 e 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

Il collegamento al download di WlanAPI.zip è rotto. Ecco un link di lavoro: http://www.delphibasics.info/home/delphibasicsprojects/wifiscanner – kobik

4

È possibile arrivare a questo anche eseguendo una query WMI:

SELECT * FROM MSNdis_80211_ServiceSetIdentifier 

Se state specificamente alla ricerca di un'implementazione Delphi, v'è una biblioteca di WMI disponibili da Magenta Systems che comprende fonte completa e può essere liberamente utilizzato . Il download disponibile include un eseguibile compilato in cui puoi provare questa query per vedere se contiene tutti i dati che stai cercando. L'unico svantaggio di questo approccio è che il servizio WMI deve essere in esecuzione (in genere non è un grosso problema).