从您的消息中不清楚您的大学作业是否规定了纯 F# 解决方案,或者您可以将其基于现有的开源 .NET 库。根据这个因素,您的里程可能会有所不同......
尽管如此,如果您被允许使用现有的 .NET 库,那么正如Jack P已经指出的那样,您可以将您的方法基于Managed Wifi API。它由 2 个 C# 类组成:Wlan
,它是原生 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