如何在.net中获得可用的无线接入点及其信号强度?

问题描述:

有什么办法可以使用.NET访问所有WiFi接入点及其各自的RSSI值?如果我可以在不使用非托管代码的情况下实现它,或者如果它在单声道以及.NET中运行,那将会非常好。如何在.net中获得可用的无线接入点及其信号强度?

如果有可能我会appriciate代码示例。 感谢


这里有几个similiar计算器的问题,我发现:

- Get SSID of the wireless network I am connected to with C# .Net on Windows Vista

- Managing wireless network connection in C#

- Get BSSID (MAC address) of wireless access point from C#

这是在C#托管代码的包装项目在http://www.codeplex.com/managedwifi

它支持Windows Vista和XP SP2(或更高版本)。

示例代码:

using NativeWifi; 
using System; 
using System.Text; 

namespace WifiExample 
{ 
    class Program 
    { 
     /// <summary> 
     /// Converts a 802.11 SSID to a string. 
     /// </summary> 
     static string GetStringForSSID(Wlan.Dot11Ssid ssid) 
     { 
      return Encoding.ASCII.GetString(ssid.SSID, 0, (int) ssid.SSIDLength); 
     } 

     static void Main(string[] args) 
     { 
      WlanClient client = new WlanClient(); 
      foreach (WlanClient.WlanInterface wlanIface in client.Interfaces) 
      { 
       // Lists all networks with WEP security 
       Wlan.WlanAvailableNetwork[] networks = wlanIface.GetAvailableNetworkList(0); 
       foreach (Wlan.WlanAvailableNetwork network in networks) 
       { 
        if (network.dot11DefaultCipherAlgorithm == Wlan.Dot11CipherAlgorithm.WEP) 
        { 
         Console.WriteLine("Found WEP network with SSID {0}.", GetStringForSSID(network.dot11Ssid)); 
        } 
       } 

       // Retrieves XML configurations of existing profiles. 
       // This can assist you in constructing your own XML configuration 
       // (that is, it will give you an example to follow). 
       foreach (Wlan.WlanProfileInfo profileInfo in wlanIface.GetProfiles()) 
       { 
        string name = profileInfo.profileName; // this is typically the network's SSID 

        string xml = wlanIface.GetProfileXml(profileInfo.profileName); 
       } 

       // Connects to a known network with WEP security 
       string profileName = "Cheesecake"; // this is also the SSID 
       string mac = "52544131303235572D454137443638"; 
       string key = "hello"; 
       string profileXml = string.Format("<?xml version=\"1.0\"?><WLANProfile xmlns=\"http://www.microsoft.com/networking/WLAN/profile/v1\"><name>{0}</name><SSIDConfig><SSID><hex>{1}</hex><name>{0}</name></SSID></SSIDConfig><connectionType>ESS</connectionType><MSM><security><authEncryption><authentication>open</authentication><encryption>WEP</encryption><useOneX>false</useOneX></authEncryption><sharedKey><keyType>networkKey</keyType><protected>false</protected><keyMaterial>{2}</keyMaterial></sharedKey><keyIndex>0</keyIndex></security></MSM></WLANProfile>", profileName, mac, key); 

       wlanIface.SetProfile(Wlan.WlanProfileFlags.AllUser, profileXml, true); 
       wlanIface.Connect(Wlan.WlanConnectionMode.Profile, Wlan.Dot11BssType.Any, profileName); 
      } 
     } 
    } 
} 
+0

谢谢你,但它不适合我。我正在使用Windows 8.1,我得到这个异常“ManagedWifi中发生未处理的'System.ComponentModel.Win32Exception'类型的异常。 dll“。任何想法? – 2015-04-06 00:12:56

可能能够实现它使用WMI查询。看看这个thread

如果您使用的是vista wmi不适用于所有网络适配器,vista的另一种替代方法是使用netsh命令。看看this codeproject article.

+1

thx为链接。 netsh的问题在于它不能提供我需要的所有信息(rssi),并且有时候会有bug。 – LDomagala 2009-01-31 16:40:14

使用本地Wifi API,出现在所有Vista和XP SP3系统上。 XP SP2有一个不同的API,你可以用它来做同样的事情。

How to enumerate networks

How to get signal strength

+0

信号强度无法在Windows XP中使用。甚至没有每个SP :( – LDomagala 2009-02-18 16:15:59

我找到了另一种方式来做到这一点,但它的成本一些钱。

有一个.NET库在rawether.net可用,让您获取以太网驱动程序。