2009-10-06 26 views
10

Trong chương trình Delphi (trên Windows Xp) của tôi, tôi muốn kiểm tra các mạng WiFi có sẵn. Bạn có bất kỳ ý tưởng làm thế nào để làm điều đó? Tốt nhất là có thể sử dụng chức năng MS WlanScan API nhưng tôi không tìm thấy một ví dụ. Ai đó có thể giúp tôi?Tôi muốn làm việc với Wifi với Delphi. Làm sao?

+0

Bạn có thể muốn đăng phiên bản Delphi nào bạn đang sử dụng. – TrueWill

Trả lời

21

Bạn có thể sử dụng Native Wifi API, có sẵn từ Windows Vista và Windows XP. Các phiên bản Windows cũ hơn không được hỗ trợ.

Trong số này link bạn có thể tìm thấy bản dịch rất đẹp của tiêu đề.

Tôi đã viết mã này bằng cách sử dụng các tiêu đề này. Thử nghiệm trong Delphi 2007 và 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

Liên kết đến WlanAPI.zip tải xuống bị hỏng. Đây là một liên kết hoạt động: http://www.delphibasics.info/home/delphibasicsprojects/wifiscanner – kobik

4

Bạn có thể tới này cũng bằng cách thực hiện một truy vấn WMI:

SELECT * FROM MSNdis_80211_ServiceSetIdentifier 

Nếu bạn đang tìm kiếm đặc biệt cho việc thực hiện delphi, có một thư viện WMI sẵn từ Magenta Systems trong đó bao gồm nguồn đầy đủ và có thể được sử dụng một cách tự do . Bản tải xuống có sẵn bao gồm tệp thực thi được biên dịch nơi bạn có thể thử truy vấn này để xem nó có chứa tất cả dữ liệu mà bạn đang tìm kiếm hay không. Nhược điểm duy nhất của phương pháp này là dịch vụ WMI phải đang chạy (thông thường đây không phải là vấn đề lớn).

Các vấn đề liên quan