Сканирование доступных сетей 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

Другие вопросы по тегам