Сканирование доступных сетей WiFi в F#
Я пытался найти способ сканировать доступные сети WiFi в F# и распечатать их имена и уровень сигнала, но я не смог найти ничего полезного. Я нашел NativeWifi API и попытался его использовать, но мне не повезло, поэтому я не знаю, правильный ли это путь. Я новичок в F#, это колледж, поэтому, пожалуйста, помогите мне, если вы знаете, как программировать это.
У меня есть это сейчас, но я не думаю, что это хорошо, я не знаю, что я делаю на самом деле.
let mutable dwVersion : uint32 = 0u
let mutable hClient : nativeint = 0n
let handle = NativeWifi.Wlan.WlanOpenHandle(1u, 0n, &dwVersion, &hClient)
let mutable pInterface : nativeint = 0n
let result = NativeWifi.Wlan.WlanEnumInterfaces(hClient, 0n, &pInterface)
1 ответ
Из вашего сообщения неясно, предписывает ли ваше учебное заведение решение на чистом F# или вы можете основывать его на существующих библиотеках.NET с открытым исходным кодом. В зависимости от этого фактора ваш пробег может варьироваться...
Тем не менее, если вам разрешено использовать существующие библиотеки.NET, то, как уже заметил Jack P., вы можете основывать свой подход на API-интерфейсе Managed Wifi. Он состоит из 2 классов C#: Wlan
, который является pInvoke-упаковщиком взаимодействия через Native WiFi API, и WlanClient
, который представляет собой управляемый.Net API для управления WiFi. Если бы вы смогли создать DLL-библиотеку Managed Wifi API с именем, скажем, interop.dll
из источников CodePlex C#, а затем использовать его из F# для просмотра списка доступных сетей WiFi, и уровень их сигнала почти тривиален:
#if INTERACTIVE
System.Environment.CurrentDirectory <- __SOURCE_DIRECTORY__
#r @"..\Interop\bin\debug\interop.dll"
#endif
open NativeWifi
let getName (network: Wlan.WlanAvailableNetwork) =
System.Text.Encoding.ASCII.GetString(
network.dot11Ssid.SSID, 0, (int network.dot11Ssid.SSIDLength))
WlanClient().Interfaces.[0].GetAvailableNetworkList(
Wlan.WlanGetAvailableNetworkFlags.IncludeAllAdhocProfiles)
|> Array.iter (fun network ->
printfn "WiFi SSID %s with strength %i" (getName network) network.wlanSignalQuality)
Запустив это дома в FSI, я получил следующий тизер в качестве доказательства концепции:
--> Referenced 'c:\...\..\Interop\bin\debug\interop.dll'
WiFi SSID ASUS_2G with strength 68
WiFi SSID MrDarkAngel with strength 31
WiFi SSID E0C95 with strength 30
WiFi SSID B4C0 with strength 25
val getName : network:NativeWifi.Wlan.WlanAvailableNetwork -> string
val it : unit = ()
Это было очень легко собрать вместе, благодаря замечательным способностям взаимодействия F#. Теперь задача на вашей стороне несколько проще, но все же вы должны быть готовы объяснить своему профессору, почему и как работает этот механизм взаимодействия, чтобы преуспеть в вашем задании в колледже. Удачи! (с8