Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

How can I get the BSSID / MAC (Media Access Control) address of the wireless access point my system is connected to using C#?

Note that I'm interested in the BSSID of the WAP. This is different from the MAC address of the networking portion of the WAP.

like image 210
Iain Avatar asked Oct 09 '08 15:10

Iain


2 Answers

The following needs to be executed programmatically:

netsh wlan show networks mode=Bssid | findstr "BSSID"

The above shows the access point's wireless MAC addresses which is different from:

arp -a | findstr 192.168.1.254

This is because the access point has 2 MAC addresses. One for the wireless device and one for the networking device. I want the wireless MAC but get the networking MAC using arp.

Using the Managed Wifi API:

var wlanClient = new WlanClient();
foreach (WlanClient.WlanInterface wlanInterface in wlanClient.Interfaces)
{
    Wlan.WlanBssEntry[] wlanBssEntries = wlanInterface.GetNetworkBssList();
    foreach (Wlan.WlanBssEntry wlanBssEntry in wlanBssEntries)
    {
        byte[] macAddr = wlanBssEntry.dot11Bssid;
        var macAddrLen = (uint) macAddr.Length;
        var str = new string[(int) macAddrLen];
        for (int i = 0; i < macAddrLen; i++)
        {
            str[i] = macAddr[i].ToString("x2");
        }
        string mac = string.Join("", str);
        Console.WriteLine(mac);
    }
}
like image 155
6 revs, 2 users 97% Avatar answered Sep 16 '22 17:09

6 revs, 2 users 97%


using System;
using System.Diagnostics;

class Program
{
    static void Main(string[] args)
    {       
        Process proc = new Process();
        proc.StartInfo.CreateNoWindow = true;
        proc.StartInfo.FileName = "cmd";

        proc.StartInfo.Arguments = @"/C ""netsh wlan show networks mode=bssid | findstr BSSID """;

        proc.StartInfo.RedirectStandardOutput = true;       
        proc.StartInfo.UseShellExecute = false;
        proc.Start();
        string output = proc.StandardOutput.ReadToEnd();
        proc.WaitForExit(); 

        Console.WriteLine(output); 
    }   
}

Beware of syntax error like curly braces all that. But the concept is here. You may create Scan function by periodically invoking this process. Correct me if something goes wrong.

like image 44
Lennard Avatar answered Sep 19 '22 17:09

Lennard