在F#中扫描可用的WiFi网络

时间:2013-06-15 22:48:16

标签: networking f# wifi network-scan

我试图找到一种方法来扫描F#中的可用WiFi网络并打印出它们的名称和信号强度,但我找不到任何有用的东西。 我找到了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 个答案:

答案 0 :(得分:2)

从您的消息中不清楚您的大学作业是否规定了纯F#解决方案,或者您可以将其基于现有的开源.NET库。根据这个因素,您的里程可能会有所不同......

尽管如此,如果您被允许使用现有的.NET库,那么正如Jack P已经指出的那样,您可以将您的方法建立在Managed Wifi API上。它由2个C#类组成:Wlan,它是通过Native WiFi API的pInvoke互操作包装器,以及WlanClient,它代表用于操作WiFi的本身托管的.Net API。如果您能够从CodePlex C#源构建名为Managed Wifi APIinterop.dll DLL,然后使用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#的精彩互操作能力。现在你身边的任务有点容易了,但是你仍然应该准备好向你的教授解释为什么以及如何使用这种互操作机器来完成你的大学任务。祝好运! (c8