How do I get the available wifi APs and their signal strength in .net?

后端 未结 7 1219
我寻月下人不归
我寻月下人不归 2020-11-28 05:00

Is there any way to access all WiFi access points and their respective RSSI values using .NET? It would be really nice if I could do it without using unmanaged code or even

相关标签:
7条回答
  • 2020-11-28 05:10

    It is a wrapper project with managed code in c# at http://www.codeplex.com/managedwifi

    It supports Windows Vista and XP SP2 (or later version).

    sample code:

    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 讨论(0)
  • 2020-11-28 05:12

    If you are using vista wmi does not work with all network adapters, another alternative for vista is to use the netsh command. Have a look at this codeproject article.

    0 讨论(0)
  • 2020-11-28 05:13

    Use Native Wifi APIs, present on all Vista and XP SP3 systems. XP SP2 has a different API with which you can do the same thing.

    How to enumerate networks

    How to get signal strength

    0 讨论(0)
  • 2020-11-28 05:20

    If the platform is Windows10, you can use Microsoft.Windows.SDK.Contracts package to access all available wifis.

    First, install Microsoft.Windows.SDK.Contracts package from nuget.

    Then, you can use next code to get ssid and signal strength.

    var adapters = await WiFiAdapter.FindAllAdaptersAsync();
    foreach (var adapter in adapters)
    {
        foreach (var network in adapter.NetworkReport.AvailableNetworks)
        {
            Console.WriteLine($"ssid: {network.Ssid}");
            Console.WriteLine($"signal strength: {network.SignalBars}");
        }
    }
    
    0 讨论(0)
  • 2020-11-28 05:22

    I found another way to do it, although it does cost some money.

    There is a .NET lib available at rawether.net that lets you get at the ethernet drivers.

    0 讨论(0)
  • 2020-11-28 05:28

    You might be able to achieve it using WMI queries. Take a look at this thread.

    0 讨论(0)
提交回复
热议问题