Как мне узнать доступные точки доступа Wi-Fi и уровень их сигнала в .net?

Есть ли способ получить доступ ко всем точкам доступа WiFi и их соответствующим значениям RSSI с помощью .NET? Было бы здорово, если бы я мог делать это без использования неуправляемого кода или даже лучше, если бы он работал как в моно, так и в .NET.

Если возможно, я бы порекомендовал образец кода. Спасибо


Вот несколько похожих вопросов о stackoverflow, которые я нашел:

- Получить SSID беспроводной сети, к которой я подключен с помощью C # .Net в Windows Vista

- Управление беспроводным сетевым подключением на C #

- Получить BSSID (MAC-адрес) точки беспроводного доступа от C #


person LDomagala    schedule 30.01.2009    source источник


Ответы (7)


Это проект-оболочка с управляемым кодом на 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 );
            }
        }
    }
}
person Jirapong    schedule 31.01.2009
comment
Спасибо тебе за это. Но у меня это не работает. Я использую Windows 8.1 и получаю это исключение. Необработанное исключение типа System.ComponentModel.Win32Exception произошло в ManagedWifi.dll. Любая идея? - person mr.b; 06.04.2015
comment
Я тоже получаю эту ошибку на одной из моих машин, хотя я запускаю ее на Windows 10 и VS 2015. Есть какие-нибудь подсказки? Вы смогли разобраться? - person Apoorv; 15.02.2016

Если используется платформа Windows10, вы можете использовать пакет Microsoft.Windows.SDK.Contracts для доступа ко всем доступным Wi-Fi.

Сначала установите пакет Microsoft.Windows.SDK.Contracts из nuget.

Затем вы можете использовать следующий код, чтобы получить ssid и силу сигнала.

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}");
    }
}
person wangch    schedule 11.09.2020

Используйте собственные API-интерфейсы Wi-Fi, присутствующие во всех системах Vista и XP SP3. XP SP2 имеет другой API, с которым вы можете делать то же самое.

Как подсчитывать сети

Как узнать мощность сигнала

person Nick    schedule 31.01.2009
comment
мощность сигнала не может использоваться в Windows XP. даже не с каждым SP :( - person LDomagala; 18.02.2009

Я делаю это с помощью команды netsh wlan show networks mode=bssid из кода C #.

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;

namespace ConsoleApp2
{
    class AccessPoint
    {
        public string SSID { get; set; }
        public string BSSID { get; set; }
        public byte Signal { get; set; }
    }

    class Program
    {
        private static async Task Main(string[] args)
        {
            var apList = await GetSignalOfNetworks();

            foreach (var ap in apList)
            {
                WriteLine($"{ap.BSSID} - {ap.Signal} - {ap.SSID}");
            }

            Console.ReadKey();
        }

        private static async Task<AccessPoint[]> GetSignalOfNetworks()
        {
            string result = await ExecuteProcessAsync(@"C:\Windows\System32\netsh.exe", "wlan show networks mode=bssid");

            return Regex.Split(result, @"[^B]SSID \d+").Skip(1).SelectMany(network => GetAccessPointFromNetwork(network)).ToArray();
        }

        private static AccessPoint[] GetAccessPointFromNetwork(string network)
        {
            string withoutLineBreaks = Regex.Replace(network, @"[\r\n]+", " ").Trim();
            string ssid = Regex.Replace(withoutLineBreaks, @"^:\s+(\S+).*$", "$1").Trim();

            return Regex.Split(withoutLineBreaks, @"\s{4}BSSID \d+").Skip(1).Select(ap => GetAccessPoint(ssid, ap)).ToArray();
        }

        private static AccessPoint GetAccessPoint(string ssid, string ap)
        {
            string withoutLineBreaks = Regex.Replace(ap, @"[\r\n]+", " ").Trim();
            string bssid = Regex.Replace(withoutLineBreaks, @"^:\s+([a-f0-9]{2}(:[a-f0-9]{2}){5}).*$", "$1").Trim();
            byte signal = byte.Parse(Regex.Replace(withoutLineBreaks, @"^.*(Signal|Sinal)\s+:\s+(\d+)%.*$", "$2").Trim());

            return new AccessPoint
            {
                SSID = ssid,
                BSSID = bssid,
                Signal = signal,
            };
        }

        private static async Task<string> ExecuteProcessAsync(string cmd, string args = null)
        {
            var process = new Process()
            {
                StartInfo = new ProcessStartInfo
                {
                    FileName = cmd,
                    Arguments = args,
                    RedirectStandardInput = false,
                    RedirectStandardOutput = true,
                    RedirectStandardError = true,
                    UseShellExecute = false,
                    CreateNoWindow = true,
                    StandardOutputEncoding = Encoding.UTF8,
                }
            };

            process.Start();

            string result = await process.StandardOutput.ReadToEndAsync();

            process.WaitForExit();

#if DEBUG
            if (result.Trim().Contains("The Wireless AutoConfig Service (wlansvc) is not running."))
            {
                return await GetFakeData();
            }
#endif

            return result;
        }

        private static async Task<string> GetFakeData()
        {
            var assembly = Assembly.GetExecutingAssembly();
            var resourceName = "ConsoleApp2.FakeData.txt";

            using (Stream stream = assembly.GetManifestResourceStream(resourceName))
            using (StreamReader reader = new StreamReader(stream))
            {
                return await reader.ReadToEndAsync();
            }
        }

        private static void WriteLine(string str)
        {
            Console.WriteLine(str);
        }
    }
}
person lmcarreiro    schedule 21.02.2019

Вы можете добиться этого с помощью запросов WMI. Взгляните на этот ветка.

person andynormancx    schedule 30.01.2009

Если вы используете Vista, wmi не работает со всеми сетевыми адаптерами, другой альтернативой для Vista является использование команды netsh. Прочтите эту статью о проекте кода.

person Lee Treveil    schedule 30.01.2009
comment
спасибо за ссылку. проблема с netsh в том, что он не дает мне всю необходимую информацию (rssi) и иногда глючит - person LDomagala; 31.01.2009

Я нашел другой способ сделать это, хотя он стоит денег.

На rawether.net имеется библиотека .NET, которая позволяет вам получить доступ к драйверам Ethernet.

person LDomagala    schedule 01.02.2009