02/10/2018, 00:02

Viết chương trình kiểm tra tín hiệu mạng, lấy địa chỉ MAC wifi bằng C#

Hôm nay, mình xin viết bài hướng dẫn các bạn viết một ứng dụng bằng ngôn ngữ C# quét các bạn xung quanh, lấy địa chỉ MAC và kiểm tra tín hiệu của các mạng wifi xung quanh mình. Giao diện chương trình như hình bên dưới: Thực ra, bài viết này sử ...

Hôm nay, mình xin viết bài hướng dẫn các bạn viết một ứng dụng bằng ngôn ngữ C# quét các bạn xung quanh, lấy địa chỉ MAC và kiểm tra tín hiệu của các mạng wifi xung quanh mình.

Giao diện chương trình như hình bên dưới: 

Dò tìm mạng địa chỉ MAC và tín hiệu wifi bằng C#

Thực ra, bài viết này sử dụng câu lệnh của MS-DOS: lệnh Netsh, để liệt kê và thấy các thông tin như: địa chỉ Mac, tín hiệu wifi ....

wlan show networks mode=bssid

Các bạn có thể vào chương trình CMD: (Windows +R => cmd =>enter)

Bạn gõ vào lệnh sau: bạn sẽ thấy kết quả trả về các tín hiệu wifi như hình dưới đây:

Sử dụng lệnh MS-DOS NETSH để liệt kê wifi

- Đầu tiên các bạn cần imports thư viện vào:

using System.IO;
using System.Media;

- Sau đó các bạn viết một function scan sau: để get dữ liệu vào list box:

 private void Scan()
        {
            string output;
            string line;
            int BSSIDNumber = 0;
            int NetworkIndex = -1;
            string[,] Networks = new string[100, 9];

            listView1.SmallImageList = imageSignalLevel;

            Process proc = new Process();
            proc.StartInfo.CreateNoWindow = true;
            proc.StartInfo.FileName = "netsh";
            proc.StartInfo.Arguments = "wlan show networks mode=bssid";
            proc.StartInfo.RedirectStandardOutput = true;
            proc.StartInfo.UseShellExecute = false; // required for the Redirect setting above Process.Start(proc);
            proc.Start();
            output = proc.StandardOutput.ReadToEnd();
            proc.WaitForExit();
            StringReader sr = new StringReader(output.ToString());
            line = null;
       
            while ((line = sr.ReadLine()) != null)
            {
                if (line.StartsWith("General Failure"))
                {
                    // Wifi disconnected or not installed
                    break;
                }
                if (line.StartsWith("SSID"))
                {
                    NetworkIndex++;
                    for (int i = 0; i < 9; i++)
                    {
                        Networks[NetworkIndex, i] = " "; // prevent exception finding null on search 
                    }
                    Networks[NetworkIndex, 3] = "0%"; // prevent exception for trim
                    BSSIDNumber = 0;// reset the BSSID number
                    Networks[NetworkIndex, 1] = line.Substring(line.IndexOf(":") + 1).TrimEnd(' ').TrimStart(' ');
                    continue;
                }

                if (line.IndexOf("Network type") > 0)
                {
                    if (line.EndsWith("Infrastructure"))
                    {
                        Networks[NetworkIndex, 7] = "AP";
                        continue;
                    }
                    else
                    {
                        Networks[NetworkIndex, 7] = line.Substring(line.IndexOf(":") + 1); //"Ad-hoc";
                    }
                }
                if (line.IndexOf("Authentication") > 0)
                {
                    Networks[NetworkIndex, 4] = line.Substring(line.IndexOf(":") + 1).TrimStart(' ').TrimEnd(' ');
                    continue;
                }
                if (line.IndexOf("Encryption") > 0)
                {
                    Networks[NetworkIndex, 5] = line.Substring(line.IndexOf(":") + 1).TrimStart(' ').TrimEnd(' ');
                    continue;
                }
                if (line.IndexOf("BSSID") > 0)
                {
                    if ((Convert.ToInt32(line.IndexOf("BSSID" + 6)) > BSSIDNumber))
                    {
                        BSSIDNumber = Convert.ToInt32(line.IndexOf("BSSID" + 6));
                        NetworkIndex++;
                        Networks[NetworkIndex, 1] = Networks[NetworkIndex - 1, 1]; // same SSID 
                        Networks[NetworkIndex, 7] = Networks[NetworkIndex - 1, 7]; // same Network Type
                        Networks[NetworkIndex, 4] = Networks[NetworkIndex - 1, 4]; // Same authorization
                        Networks[NetworkIndex, 5] = Networks[NetworkIndex - 1, 5]; // same encryption
                    }
                    Networks[NetworkIndex, 0] = line.Substring(line.IndexOf(":") + 1);
                    continue;
                }
                if (line.IndexOf("Signal") > 0)
                {
                    Networks[NetworkIndex, 3] = line.Substring(line.IndexOf(":") + 1);
                    continue;
                }
                if (line.IndexOf("Radio Type") > 0)
                {
                    Networks[NetworkIndex, 6] = line.Substring(line.IndexOf(":") + 1);
                    continue;
                }
                if (line.IndexOf("Channel") > 0)
                {
                    Networks[NetworkIndex, 2] = line.Substring(line.IndexOf(":") + 1);
                    continue;
                }
                if (line.IndexOf("Basic Rates") > 0)
                {
                    //Networks[NetworkIndex, 8] = line.Substring(line.Length - 2, 2);
                    Networks[NetworkIndex, 8] = line.Substring(line.IndexOf(":"));
                    if (Networks[NetworkIndex, 8] == ":") { Networks[NetworkIndex, 8] = "not shown"; continue; }
                    Networks[NetworkIndex, 8] = Networks[NetworkIndex, 8].TrimStart(':').TrimStart(' ').TrimEnd(' ');
                    for (int i = Networks[NetworkIndex, 8].Length - 1; i > 0; i--)
                    {
                        if (Networks[NetworkIndex, 8].Substring(i, 1) == " ")
                        {
                            Networks[NetworkIndex, 8] = Networks[NetworkIndex, 8].Substring(i + 1, Networks[NetworkIndex, 8].Length - 1 - i);
                            break;
                        }
                    }
                }
                if (line.IndexOf("Other Rates") > 0)
                {
                    // overwrite the basic rates if this entry is present
                    Networks[NetworkIndex, 8] = line.Substring(line.IndexOf(":"));
                    if (Networks[NetworkIndex, 8] == ":") { Networks[NetworkIndex, 8] = "not shown"; continue; }
                    Networks[NetworkIndex, 8] = Networks[NetworkIndex, 8].TrimStart(':').TrimStart(' ').TrimEnd(' ');
                    for (int i = Networks[NetworkIndex, 8].Length - 1; i >= 0; i--)
                    {
                        if (Networks[NetworkIndex, 8].Substring(i, 1) == " ")
                        {
                            Networks[NetworkIndex, 8] = Networks[NetworkIndex, 8].Substring(i + 1, Networks[NetworkIndex, 8].Length - 1 - i);
                            break;
                        }
                    }
                }
            }

            for (int i = 0; i < listView1.Items.Count; i++)
            {
                // set signal to zero on all items in list
                listView1.Items[i].SubItems[3].Text = "0%";
                listView1.Items[i].ImageIndex = 5;
            }
    
            for (int i = 0; i < NetworkIndex + 1; i++)
            {
                ListViewItem SearchItem = new ListViewItem();
                if (Networks[i, 0] == " ") continue; // don't search if no valid MAC Address !
                SearchItem = listView1.FindItemWithText(Networks[i, 0]);
                if (SearchItem == null)
                {
                    // New discovery - add it to the list

                    SystemSounds.Hand.Play();
               
                    listView1.Items.Add(Networks[i,0]);                                          // MAC Address
                    listView1.Items[listView1.Items.Count-1].SubItems.Add( Networks[i, 1]);      // SSID
                    listView1.Items[listView1.Items.Count-1].SubItems.Add( Networks[i, 2]);      // Channel
                    listView1.Items[listView1.Items.Count-1].SubItems.Add( Networks[i, 3]);      // Signal
                    listView1.Items[listView1.Items.Count-1].SubItems.Add( Networks[i, 4]);      // Authenticatiopn
                    listView1.Items[listView1.Items.Count-1].SubItems.Add( Networks[i, 5]);      // Encryption
                    listView1.Items[listView1.Items.Count-1].SubItems.Add( Networks[i, 6]);      // Radio Type
                    listView1.Items[listView1.Items.Count-1].SubItems.Add( Networks[i, 7]);      // Network Type
                    listView1.Items[listView1.Items.Count-1].SubItems.Add( Networks[i, 8]);      // Speed
                
                    int SignalInt = Convert.ToInt32(Networks[i, 3].TrimEnd(' ').TrimEnd('%'));
                    if (SignalInt > 50) listView1.Items[listView1.Items.Count - 1].ImageIndex = 0;
                    else if (SignalInt > 40) listView1.Items[listView1.Items.Count - 1].ImageIndex = 1;
                    else if (SignalInt > 30) listView1.Items[listView1.Items.Count - 1].ImageIndex = 2;
                    else if (SignalInt > 20) listView1.Items[listView1.Items.Count - 1].ImageIndex = 3;
                    else if (SignalInt > 0) listView1.Items[listView1.Items.Count - 1].ImageIndex = 4;

                    if ((Networks[i, 4] == "Open") & (Networks[i, 5] == "None")) listView1.Items[listView1.Items.Count - 1].BackColor = Color.PaleGreen;
                    listView1.Items[listView1.Items.Count - 1].EnsureVisible();
                }
                else
                {
                    //  Already in list - update Signal and other details that may change

                    listView1.Items[SearchItem.Index].SubItems[3].Text = Networks[i, 3];      // Signal

                    // Don't change any details if blank 
                    if (Networks[i,1] != null) listView1.Items[SearchItem.Index].SubItems[1].Text = Networks[i, 1];      // SSID
                    if (Networks[i, 4] != null) listView1.Items[SearchItem.Index].SubItems[4].Text = Networks[i, 4];      // Authenticatiopn
                    if (Networks[i, 5] != null) listView1.Items[SearchItem.Index].SubItems[5].Text = Networks[i, 5];      // Encryption
                    if (Networks[i, 6] != null) listView1.Items[SearchItem.Index].SubItems[6].Text = Networks[i, 6];      // Radio Type
                    if (Networks[i, 7] != null) listView1.Items[SearchItem.Index].SubItems[7].Text = Networks[i, 7];      // Network Type
                    if (Networks[i, 8] != null) listView1.Items[SearchItem.Index].SubItems[8].Text = Networks[i, 8];      // Speed
  
                    int SignalInt = Convert.ToInt32(Networks[i, 3].TrimEnd(' ').TrimEnd('%'));
                    if (SignalInt > 50) listView1.Items[SearchItem.Index].ImageIndex = 0;
                    else if (SignalInt > 40) listView1.Items[SearchItem.Index].ImageIndex = 1;
                    else if (SignalInt > 30) listView1.Items[SearchItem.Index].ImageIndex = 2;
                    else if (SignalInt > 20) listView1.Items[SearchItem.Index].ImageIndex = 3;
                    else if (SignalInt > 0 ) listView1.Items[SearchItem.Index].ImageIndex = 4;
                    else if (SignalInt == 0) listView1.Items[SearchItem.Index].ImageIndex = 5;
                } 
            }
        }

- Sau đó các bạn gọi hàm Scan(), khi nhấn vào button dò tìm:

private void btnScan_Click(object sender, EventArgs e)
{
             Scan();
}

Chúc các bạn thành công!

Nếu thấy hay xin các bạn hãy like và share để ủng hộ chúng mình. Xin cảm ơn các bạn

Download scan_wifi with c#

Tags: treeviewlistviewlập trình socket
0