【问题标题】:Scan for available WiFi networks in F#在 F# 中扫描可用的 WiFi 网络
【发布时间】:2013-06-15 22:48:16
【问题描述】:

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

【问题讨论】:

  • 那么你的代码有什么问题?是否存在编译错误或不良运行时行为?
  • 您可以尝试在 CodePlex 上使用Managed Wifi API 项目——它只是原生 Wifi API 的一个非常简单的包装器,但它只是一个开始。包含一些 C# 示例代码,移植到 F# 应该非常简单。

标签: networking f# wifi network-scan


【解决方案1】:

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

尽管如此,如果允许您使用现有的 .NET 库,那么正如 Jack P 已经指出的那样,您可以将您的方法基于 Managed Wifi API。它由 2 个 C# 类组成:Wlan,它是原生 WiFi API 上的 pInvoke 互操作包装器,以及 WlanClient,它本身代表用于操作 WiFi 的托管 .Net API。如果您能够从 CodePlex C# 源构建名为 interop.dllManaged Wifi API 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

【讨论】:

  • 感谢 Jack 提供的 Managed WiFi API 提示,因此使用您的代码 Gene,我设法让它工作了,现在我只需要用更多的功能对其进行一些扩展,但现在很容易照顾好其余的 :) 谢谢!
最近更新 更多