杨吉山 發表於 2025-12-18 09:39:28

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

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li>一、核心功能实现</li><li>二、关键功能说明</li><ul class="second_class_ul"><li>1. 信号强度检测</li><li>2. 距离估算算法</li><li>3. 实时监控界面(WinForm示例)</li></ul><li>三、工程实践要点</li><ul class="second_class_ul"><li>1. 权限配置</li><li>2. 性能优化</li><li>3. 高级功能扩展</li></ul><li>四、部署与使用</li><ul class="second_class_ul"><li>1. NuGet依赖</li><li>2. 运行示例</li></ul><li>五、调试与校准</li><ul class="second_class_ul"><li>1. 日志记录</li><li>2. 精度校准</li></ul><li>六、界面增强建议</li><ul class="second_class_ul"></ul></ul></div><p>基于C#实现的WiFi信号强度扫描程序,信号强度检测、距离估算和实时监控功能:</p>
<p class="maodian"></p><h2>一、核心功能实现</h2>
<div class="jb51code"><pre class="brush:csharp;">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&lt;string, (int rssi, double distance)&gt; _scanResults = new();

    public event EventHandler&lt;ScanResultsUpdatedEventArgs&gt; ResultsUpdated;

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

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

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

            foreach (var ap in accessPoints)
            {
                if (ap.SignalStrength &gt; -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 =&gt; x.SSID, x =&gt; (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 &gt;= 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&lt;ScanResult&gt; Results { get; }

    public ScanResultsUpdatedEventArgs(List&lt;ScanResult&gt; results)
    {
      Results = results;
    }
}
</pre></div>
<p class="maodian"></p><h2>二、关键功能说明</h2>
<p class="maodian"></p><h3>1. 信号强度检测</h3>
<div class="jb51code"><pre class="brush:csharp;">// 获取所有可用网络
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);
}
</pre></div>
<p class="maodian"></p><h3>2. 距离估算算法</h3>
<div class="jb51code"><pre class="brush:csharp;">// 改进型距离估算(考虑环境因素)
private double CalculateDistance(int rssi)
{
    const double txPower = -59; // 发射功率(dBm)
    const double n = 2.7;       // 路径损耗指数

    double ratio = rssi * 1.0 / txPower;
    if (ratio &lt; 1) return Math.Pow(ratio, 10);
    else return 0.89976 * Math.Pow(ratio, 7.7095) + 0.111;
}
</pre></div>
<p class="maodian"></p><h3>3. 实时监控界面(WinForm示例)</h3>
<div class="jb51code"><pre class="brush:csharp;">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;
      });
    }
}
</pre></div>
<p class="maodian"></p><h2>三、工程实践要点</h2>
<p class="maodian"></p><h3>1. 权限配置</h3>
<div class="jb51code"><pre class="brush:xml;">&lt;!-- app.manifest --&gt;
&lt;requestedExecutionLevel level="requireAdministrator" uiAccess="false" /&gt;
</pre></div>
<p class="maodian"></p><h3>2. 性能优化</h3>
<ul><li><strong>批量扫描</strong>:合并多个扫描结果减少系统调用</li><li><strong>数据缓存</strong>:使用<code>ConcurrentDictionary</code>存储历史数据</li><li><strong>异步处理</strong>:采用<code>async/await</code>避免界面卡顿</li></ul>
<p class="maodian"></p><h3>3. 高级功能扩展</h3>
<div class="jb51code"><pre class="brush:csharp;">// 信道干扰分析
public Dictionary&lt;int, int&gt; GetChannelUtilization()
{
    return _scanResults.Values
      .GroupBy(x =&gt; x.Channel)
      .ToDictionary(g =&gt; g.Key, g =&gt; g.Count());
}

// 热力图生成
public Bitmap GenerateHeatmap()
{
    // 使用GDI+绘制信号强度分布
}
</pre></div>
<p class="maodian"></p><h2>四、部署与使用</h2>
<p class="maodian"></p><h3>1. NuGet依赖</h3>
<div class="jb51code"><pre class="brush:bash;">Install-Package SimpleWifi.netstandard.Lsh
Install-Package LiveCharts.WinForms
</pre></div>
<p class="maodian"></p><h3>2. 运行示例</h3>
<div class="jb51code"><pre class="brush:csharp;">var scanner = new WifiScanner();
scanner.ResultsUpdated += (s, e) =&gt;
{
    Console.WriteLine($"检测到 {e.Results.Count} 个网络");
    e.Results.OrderByDescending(r =&gt; r.SignalStrength).Take(3).ToList().ForEach(r =&gt;
      Console.WriteLine($"最强信号: {r.SSID} ({r.SignalStrength}dBm)"));
};
scanner.StartContinuousScan();
</pre></div>
<p class="maodian"></p><h2>五、调试与校准</h2>
<p class="maodian"></p><h3>1. 日志记录</h3>
<div class="jb51code"><pre class="brush:csharp;">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");
    }
}
</pre></div>
<p class="maodian"></p><h3>2. 精度校准</h3>
<div class="jb51code"><pre class="brush:csharp;">// 校准参数
private static double _calibrationFactor = 1.2;

// 带校准的距离计算
public double CalibratedDistance(int rssi)
{
    double rawDistance = CalculateDistance(rssi);
    return rawDistance * _calibrationFactor;
}
</pre></div>
<p>参考代码 WIFI Distance(Wifi信号强弱扫描程序) www.youwenfan.com/contentcsn/93530.html</p>
<p class="maodian"></p><h2>六、界面增强建议</h2>
<p><strong>信号强度可视化</strong></p>
<div class="jb51code"><pre class="brush:csharp;">// 使用LiveCharts绘制实时波形
var chart = new CartesianChart();
chart.Series = new SeriesCollection
{
    new LineSeries
    {
      Values = new ChartValues&lt;double&gt;(_scanResults.Values.Select(x =&gt; x.SignalStrength))
    }
};
</pre></div>
<p><strong>设备定位功能</strong></p>
<div class="jb51code"><pre class="brush:csharp;">public Point CalculatePosition()
{
    // 三角定位算法实现
    var accessPoints = _scanResults.Values.ToList();
    if (accessPoints.Count &lt; 3) return Point.Empty;

    // 实现三边测量算法...
}
</pre></div>
<p>到此这篇关于基于C#实现的WiFi信号强度扫描程序的文章就介绍到这了,更多相关C# WiFi信号强度扫描内容请搜索琼殿技术社区以前的文章或继续浏览下面的相关文章希望大家以后多多支持琼殿技术社区!</p>
                           
                            <div class="art_xg">
                              <b>您可能感兴趣的文章:</b><ul><li>c#使用ManagedWifi查看当前Wifi信号并选择wifi的示例</li><li>C#中调用命令行cmd开启wifi热点的实例代码</li><li>C#常用多线程(线程同步,事件触发,信号量,互斥锁,共享内存,消息队列)</li><li>聚星C#数字信号处理工具包频谱分析的用法</li><li>C#并行编程之信号量</li></ul>
                            </div>

                        </div>
                        <!--endmain-->
頁: [1]
查看完整版本: 基于C#实现的WiFi信号强度扫描程序