2009-10-06 26 views
10

Delphi (Windows Xp) programımda mevcut WiFi ağlarını kontrol etmek istiyorum. Nasıl yapılacağı hakkında bir fikrin var mı? En iyisi MS WlanScan API işlevini kullanmaktır ancak bir örnek bulamadım. Birisi bana yardım edebilir mi?Delphi ile Wifi ile çalışmak istiyorum. Nasıl?

+0

Kullandığınız Delphi sürümünü yüklemek isteyebilirsiniz. – TrueWill

cevap

21

Windows Vista ve Windows XP'den beri kullanılabilen Native Wifi API'u kullanabilirsiniz. Windows'un eski sürümleri desteklenmez.

Bu link içinde başlıkların çok güzel bir çevirisini bulabilirsiniz.

Bu kodları bu üstbilgileri kullanarak yazdım. Delphi 2007 ve Windows Vista'da test edildi.

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

güle.

+0

WlanAPI.zip indirme bağlantısı bozuk. İşte bir çalışma linki: http://www.delphibasics.info/home/delphibasicsprojects/wifiscanner – kobik

4

Ayrıca WMI sorgusu gerçekleştirerek bu alabilirsiniz: Özellikle bir Delphi uygulaması arıyorsanız

SELECT * FROM MSNdis_80211_ServiceSetIdentifier 

, tam bir kaynak içerir ve serbestçe kullanılabilir Magenta Systems edinilebilir bir WMI kütüphane bulunmaktadır . Mevcut yükleme, aradığınız tüm verileri içerip içermediğini görmek için bu sorguyu deneyebileceğiniz derlenmiş bir yürütülebilir dosya içerir. Bu yaklaşımın tek dezavantajı, WMI servisinin çalışması gerektiğidir (normalde öyle ki bu büyük bir problem değildir).

İlgili konular