基于C#实现的WiFi信号强度扫描程序

 更新时间:2025年12月18日 09:39:28   作者:yugi987838  
这篇文章主要介绍了基于C#实现的WiFi信号强度扫描程序,包括信号强度检测、距离估算和实时监控功能,它详细说明了核心功能实现、工程实践要点、高级功能扩展、部署与使用、调试与校准以及界面增强建议,需要的朋友可以参考下

基于C#实现的WiFi信号强度扫描程序,信号强度检测、距离估算和实时监控功能:

一、核心功能实现

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.NetworkInformation;
using System.Runtime.InteropServices;
using System.Timers;
using SimpleWifi;

public class WifiScanner : IDisposable
{
    private Wifi _wifi;
    private Timer _scanTimer;
    private Dictionary<string, (int rssi, double distance)> _scanResults = new();

    public event EventHandler<ScanResultsUpdatedEventArgs> ResultsUpdated;

    public WifiScanner()
    {
        _wifi = new Wifi();
        InitializeScanTimer(5000); // 每5秒扫描一次
    }

    // 初始化定时扫描
    private void InitializeScanTimer(int interval)
    {
        _scanTimer = new Timer(interval);
        _scanTimer.Elapsed += async (s, e) => await ScanNetworks();
    }

    // 执行扫描操作
    private async Task ScanNetworks()
    {
        try
        {
            var accessPoints = await _wifi.GetAccessPointsAsync();
            var results = new List<ScanResult>();

            foreach (var ap in accessPoints)
            {
                if (ap.SignalStrength > -100) // 过滤无效信号
                {
                    double distance = CalculateDistance(ap.SignalStrength);
                    results.Add(new ScanResult
                    {
                        SSID = ap.Name,
                        RSSI = ap.SignalStrength,
                        Distance = distance,
                        Channel = ap.Channel,
                        Security = ap.IsSecure
                    });
                }
            }

            _scanResults = results.ToDictionary(x => x.SSID, x => (x.RSSI, x.Distance));
            ResultsUpdated?.Invoke(this, new ScanResultsUpdatedEventArgs(_scanResults.Values.ToList()));
        }
        catch (Exception ex)
        {
            HandleScanError(ex);
        }
    }

    // 信号强度转距离估算(经验公式)
    private double CalculateDistance(int rssi)
    {
        const double referenceDistance = 1.0; // 参考距离(米)
        const int referenceRSSI = -30;        // 参考信号强度

        if (rssi >= referenceRSSI) return 0.1; // 过近时返回固定值

        double pathLoss = referenceRSSI - rssi;
        return Math.Pow(10, pathLoss / 20) * referenceDistance;
    }

    // 显示结果
    public void DisplayResults()
    {
        Console.WriteLine("WiFi信号扫描结果:");
        foreach (var result in _scanResults.Values)
        {
            Console.WriteLine($"SSID: {result.SSID,-15} " +
                              $"信号强度: {result.RSSI}dBm " +
                              $"估算距离: {result.Distance.ToString("0.1f")}m " +
                              $"信道: {result.Channel} " +
                              $"加密: {(result.Security ? "是" : "否")}");
        }
    }

    // 释放资源
    public void Dispose()
    {
        _scanTimer?.Dispose();
        _wifi?.Dispose();
    }
}

public class ScanResult
{
    public string SSID { get; set; }
    public int RSSI { get; set; }
    public double Distance { get; set; }
    public int Channel { get; set; }
    public bool Security { get; set; }
}

public class ScanResultsUpdatedEventArgs : EventArgs
{
    public List<ScanResult> Results { get; }

    public ScanResultsUpdatedEventArgs(List<ScanResult> results)
    {
        Results = results;
    }
}

二、关键功能说明

1. 信号强度检测

// 获取所有可用网络
var accessPoints = await _wifi.GetAccessPointsAsync();

// 解析关键信息
foreach (var ap in accessPoints)
{
    Console.WriteLine($"SSID: {ap.Name}");
    Console.WriteLine($"信号强度: {ap.SignalStrength}%"); // 百分比强度
    Console.WriteLine($"实际dBm值: {ConvertToDbm(ap.SignalStrength)}dBm");
}

// 百分比转dBm转换方法
private int ConvertToDbm(int percentage)
{
    return (int)((percentage / 2.0) - 100);
}

2. 距离估算算法

// 改进型距离估算(考虑环境因素)
private double CalculateDistance(int rssi)
{
    const double txPower = -59; // 发射功率(dBm)
    const double n = 2.7;       // 路径损耗指数

    double ratio = rssi * 1.0 / txPower;
    if (ratio < 1) return Math.Pow(ratio, 10);
    else return 0.89976 * Math.Pow(ratio, 7.7095) + 0.111;
}

3. 实时监控界面(WinForm示例)

public partial class MainForm : Form
{
    private WifiScanner _scanner;
    private DataGridView _dataGridView;

    public MainForm()
    {
        InitializeComponent();
        InitializeComponents();
        _scanner = new WifiScanner();
        _scanner.ResultsUpdated += OnResultsUpdated;
    }

    private void InitializeComponents()
    {
        _dataGridView = new DataGridView { Dock = DockStyle.Fill };
        _dataGridView.Columns.AddRange(
            new DataGridViewTextBoxColumn { Name = "SSID", HeaderText = "网络名称" },
            new DataGridViewTextBoxColumn { Name = "SignalStrength", HeaderText = "信号强度(dBm)" },
            new DataGridViewTextBoxColumn { Name = "Distance", HeaderText = "估算距离(m)" }
        );
        Controls.Add(_dataGridView);
    }

    private void OnResultsUpdated(object sender, ScanResultsUpdatedEventArgs e)
    {
        _dataGridView.Invoke((MethodInvoker)delegate {
            _dataGridView.DataSource = e.Results;
        });
    }
}

三、工程实践要点

1. 权限配置

<!-- app.manifest -->
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

2. 性能优化

  • 批量扫描:合并多个扫描结果减少系统调用
  • 数据缓存:使用ConcurrentDictionary存储历史数据
  • 异步处理:采用async/await避免界面卡顿

3. 高级功能扩展

// 信道干扰分析
public Dictionary<int, int> GetChannelUtilization()
{
    return _scanResults.Values
        .GroupBy(x => x.Channel)
        .ToDictionary(g => g.Key, g => g.Count());
}

// 热力图生成
public Bitmap GenerateHeatmap()
{
    // 使用GDI+绘制信号强度分布
}

四、部署与使用

1. NuGet依赖

Install-Package SimpleWifi.netstandard.Lsh
Install-Package LiveCharts.WinForms

2. 运行示例

var scanner = new WifiScanner();
scanner.ResultsUpdated += (s, e) => 
{
    Console.WriteLine($"检测到 {e.Results.Count} 个网络");
    e.Results.OrderByDescending(r => r.SignalStrength).Take(3).ToList().ForEach(r => 
        Console.WriteLine($"最强信号: {r.SSID} ({r.SignalStrength}dBm)"));
};
scanner.StartContinuousScan();

五、调试与校准

1. 日志记录

public static class Logger
{
    public static void LogSignalData(int rssi, double distance)
    {
        File.AppendAllText("wifi_log.txt", 
            $"{DateTime.Now:yyyy-MM-dd HH:mm:ss} | RSSI:{rssi} | Distance:{distance}m\n");
    }
}

2. 精度校准

// 校准参数
private static double _calibrationFactor = 1.2;

// 带校准的距离计算
public double CalibratedDistance(int rssi)
{
    double rawDistance = CalculateDistance(rssi);
    return rawDistance * _calibrationFactor;
}

参考代码 WIFI Distance(Wifi信号强弱扫描程序) www.youwenfan.com/contentcsn/93530.html

六、界面增强建议

信号强度可视化

// 使用LiveCharts绘制实时波形
var chart = new CartesianChart();
chart.Series = new SeriesCollection
{
    new LineSeries
    {
        Values = new ChartValues<double>(_scanResults.Values.Select(x => x.SignalStrength))
    }
};

设备定位功能

public Point CalculatePosition()
{
    // 三角定位算法实现
    var accessPoints = _scanResults.Values.ToList();
    if (accessPoints.Count < 3) return Point.Empty;

    // 实现三边测量算法...
}

到此这篇关于基于C#实现的WiFi信号强度扫描程序的文章就介绍到这了,更多相关C# WiFi信号强度扫描内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • winform实现限制及解除鼠标移动范围的方法

    winform实现限制及解除鼠标移动范围的方法

    这篇文章主要介绍了winform实现限制及解除鼠标移动范围的方法,涉及C#控制WinForm鼠标事件属性的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-09-09
  • C# NLua Winform实现热更新的项目实践

    C# NLua Winform实现热更新的项目实践

    本文介绍了在.NET应用中使用NLua库嵌入Lua脚本,实现动态逻辑和热更新功能,包括创建项目、设置公共数据、Lua脚本交互以及热更新的具体实现步骤,感兴趣的可以了解一下
    2025-11-11
  • c# winform读取xml文件创建菜单的代码

    c# winform读取xml文件创建菜单的代码

    动态创建菜单使得程序灵活性大大增加,本文根据读取xml文件中的配置菜单项来动态创建菜单,代码如下
    2013-09-09
  • Visual Studio 中自定义代码片段的方法

    Visual Studio 中自定义代码片段的方法

    这篇文章主要介绍了Visual Studio 中自定义代码片段的方法,本文分步骤通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-03-03
  • C#实现SHP文件读取与地图显示的完整教程

    C#实现SHP文件读取与地图显示的完整教程

    在地理信息系统(GIS)开发中,SHP文件是一种常见的矢量数据格式,本文将详细介绍如何使用C#读取SHP文件并实现地图显示功能,包括坐标转换、图形渲染、平移缩放操作以及属性表展示,需要的朋友可以参考下
    2025-09-09
  • WPF仿LiveCharts实现饼图的绘制

    WPF仿LiveCharts实现饼图的绘制

    这篇文章主要介绍了如何利用WPF仿LiveCharts实现饼图的绘制,文中的示例代码讲解详细,对我们学习或工作有一定帮助,需要的可以参考一下
    2022-07-07
  • 解析C#的扩展方法

    解析C#的扩展方法

    在本文中,主要对扩展方法进行了一些规则说明、声明方式,使用方式,以及对扩展方法的意义和扩展方法的原理进行了简单的解答。并在本文的最后给了一个枚举的扩展方法代码。
    2016-12-12
  • c#调用c++的DLL的实现方法

    c#调用c++的DLL的实现方法

    本文主要介绍了c#调用c++的DLL的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • DataGridView控件常用属性介绍

    DataGridView控件常用属性介绍

    这篇文章介绍了DataGridView控件的常用属性,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-02-02
  • C#中new的几种用法详解

    C#中new的几种用法详解

    本文主要介绍了C#中new的几种用法,具有很好的参考价值,下面跟着小编一起来看下吧
    2017-02-02

最新评论