1

我试图找到一种方法来扫描 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)
4

1 回答 1

2

从您的消息中不清楚您的大学作业是否规定了纯 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

于 2013-06-16T07:00:29.117 回答