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?
Odpowiedz
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.
Link do pliku WlanAPI.zip jest uszkodzony. Oto działający link: http://www.delphibasics.info/home/delphibasicsprojects/wifiscanner – kobik
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).
- 1. Jak pracować z kolekcjami
- 2. Jak pracować z hierarchiami typów w Neo4j?
- 3. Jak pracować z zastępczymi parami w Pythonie?
- 4. Jaki jest właściwy sposób korzystania z PushSharp?
- 5. Sails.js: Jak pracować z i18n w bootstrapie
- 6. Getting requirejs pracować z Jasmine
- 7. jQueryMobile: jak pracować z wydarzeniami z suwakiem?
- 8. Jak pracować z wątkami w pygtk
- 9. Jaki jest akceptowany sposób używania ramek w Delphi?
- 10. Jak pracować z treecombo w ExtJS 4,1
- 11. W jaki sposób aplikacja Delphi może wykryć ustawienia sieciowego serwera proxy na komputerze z systemem Windows?
- 12. Jak pracować z niedeterministyczną liczbą obietnic jQuery?
- 13. Jak pracować z wieloma kluczami ssh
- 14. W jaki sposób jedna obietnica z sinonem?
- 15. W jaki sposób mój program może powiedzieć, czy działa Delphi?
- 16. W jaki sposób powinienem ponownie przejąć wyjątek Delphi po zalogowaniu?
- 17. Jak pracować z wiodącymi zerami w liczbach całkowitych
- 18. Jak pracować z "FIFO" w C# .NET?
- 19. Jak pracować z dużymi liczbami w PHP?
- 20. Jak pracować z ssh w PhpStorm?
- 21. jak pracować z południem w django
- 22. Jak pracować w trybie offline z TFS
- 23. Jak pracować z bitami w bajcie
- 24. Jak pracować z pikselami za pomocą Direct2D
- 25. Jaki jest najlepszy sposób na rozwiązanie konfliktu drzewa z TortoiseSVN, jeśli chcę zachować moje lokalne zmiany?
- 26. Skojarzenie mojego komputera z Windows z AP wifi z Pythonem
- 27. Delphi 2009: W jaki sposób zapobiec wyciekaniu krytycznej sekcji z aplikacji sieciowej?
- 28. Scapy - pobieranie RSSI z pakietów WiFi
- 29. Jak pracować z NopCommerce MVC jako zespołem
- 30. W jaki sposób przekazujesz parametry z xaml?
Możesz opublikować wersję Delphi, z której korzystasz. – TrueWill