基于C#實(shí)現(xiàn)的WiFi信號(hào)強(qiáng)度掃描程序
基于C#實(shí)現(xiàn)的WiFi信號(hào)強(qiáng)度掃描程序,信號(hào)強(qiáng)度檢測(cè)、距離估算和實(shí)時(shí)監(jiān)控功能:
一、核心功能實(shí)現(xiàn)
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秒掃描一次
}
// 初始化定時(shí)掃描
private void InitializeScanTimer(int interval)
{
_scanTimer = new Timer(interval);
_scanTimer.Elapsed += async (s, e) => await ScanNetworks();
}
// 執(zhí)行掃描操作
private async Task ScanNetworks()
{
try
{
var accessPoints = await _wifi.GetAccessPointsAsync();
var results = new List<ScanResult>();
foreach (var ap in accessPoints)
{
if (ap.SignalStrength > -100) // 過濾無效信號(hào)
{
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);
}
}
// 信號(hào)強(qiáng)度轉(zhuǎn)距離估算(經(jīng)驗(yàn)公式)
private double CalculateDistance(int rssi)
{
const double referenceDistance = 1.0; // 參考距離(米)
const int referenceRSSI = -30; // 參考信號(hào)強(qiáng)度
if (rssi >= referenceRSSI) return 0.1; // 過近時(shí)返回固定值
double pathLoss = referenceRSSI - rssi;
return Math.Pow(10, pathLoss / 20) * referenceDistance;
}
// 顯示結(jié)果
public void DisplayResults()
{
Console.WriteLine("WiFi信號(hào)掃描結(jié)果:");
foreach (var result in _scanResults.Values)
{
Console.WriteLine($"SSID: {result.SSID,-15} " +
$"信號(hào)強(qiáng)度: {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;
}
}
二、關(guān)鍵功能說明
1. 信號(hào)強(qiáng)度檢測(cè)
// 獲取所有可用網(wǎng)絡(luò)
var accessPoints = await _wifi.GetAccessPointsAsync();
// 解析關(guān)鍵信息
foreach (var ap in accessPoints)
{
Console.WriteLine($"SSID: {ap.Name}");
Console.WriteLine($"信號(hào)強(qiáng)度: {ap.SignalStrength}%"); // 百分比強(qiáng)度
Console.WriteLine($"實(shí)際dBm值: {ConvertToDbm(ap.SignalStrength)}dBm");
}
// 百分比轉(zhuǎn)dBm轉(zhuǎn)換方法
private int ConvertToDbm(int percentage)
{
return (int)((percentage / 2.0) - 100);
}
2. 距離估算算法
// 改進(jìn)型距離估算(考慮環(huán)境因素)
private double CalculateDistance(int rssi)
{
const double txPower = -59; // 發(fā)射功率(dBm)
const double n = 2.7; // 路徑損耗指數(shù)
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. 實(shí)時(shí)監(jiān)控界面(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 = "網(wǎng)絡(luò)名稱" },
new DataGridViewTextBoxColumn { Name = "SignalStrength", HeaderText = "信號(hào)強(qiáng)度(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;
});
}
}
三、工程實(shí)踐要點(diǎn)
1. 權(quán)限配置
<!-- app.manifest --> <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
2. 性能優(yōu)化
- 批量掃描:合并多個(gè)掃描結(jié)果減少系統(tǒng)調(diào)用
- 數(shù)據(jù)緩存:使用
ConcurrentDictionary存儲(chǔ)歷史數(shù)據(jù) - 異步處理:采用
async/await避免界面卡頓
3. 高級(jí)功能擴(kuò)展
// 信道干擾分析
public Dictionary<int, int> GetChannelUtilization()
{
return _scanResults.Values
.GroupBy(x => x.Channel)
.ToDictionary(g => g.Key, g => g.Count());
}
// 熱力圖生成
public Bitmap GenerateHeatmap()
{
// 使用GDI+繪制信號(hào)強(qiáng)度分布
}
四、部署與使用
1. NuGet依賴
Install-Package SimpleWifi.netstandard.Lsh Install-Package LiveCharts.WinForms
2. 運(yùn)行示例
var scanner = new WifiScanner();
scanner.ResultsUpdated += (s, e) =>
{
Console.WriteLine($"檢測(cè)到 {e.Results.Count} 個(gè)網(wǎng)絡(luò)");
e.Results.OrderByDescending(r => r.SignalStrength).Take(3).ToList().ForEach(r =>
Console.WriteLine($"最強(qiáng)信號(hào): {r.SSID} ({r.SignalStrength}dBm)"));
};
scanner.StartContinuousScan();
五、調(diào)試與校準(zhǔn)
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. 精度校準(zhǔn)
// 校準(zhǔn)參數(shù)
private static double _calibrationFactor = 1.2;
// 帶校準(zhǔn)的距離計(jì)算
public double CalibratedDistance(int rssi)
{
double rawDistance = CalculateDistance(rssi);
return rawDistance * _calibrationFactor;
}
參考代碼 WIFI Distance(Wifi信號(hào)強(qiáng)弱掃描程序) www.youwenfan.com/contentcsn/93530.html
六、界面增強(qiáng)建議
信號(hào)強(qiáng)度可視化
// 使用LiveCharts繪制實(shí)時(shí)波形
var chart = new CartesianChart();
chart.Series = new SeriesCollection
{
new LineSeries
{
Values = new ChartValues<double>(_scanResults.Values.Select(x => x.SignalStrength))
}
};
設(shè)備定位功能
public Point CalculatePosition()
{
// 三角定位算法實(shí)現(xiàn)
var accessPoints = _scanResults.Values.ToList();
if (accessPoints.Count < 3) return Point.Empty;
// 實(shí)現(xiàn)三邊測(cè)量算法...
}
到此這篇關(guān)于基于C#實(shí)現(xiàn)的WiFi信號(hào)強(qiáng)度掃描程序的文章就介紹到這了,更多相關(guān)C# WiFi信號(hào)強(qiáng)度掃描內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#?NLua?Winform實(shí)現(xiàn)熱更新的項(xiàng)目實(shí)踐
本文介紹了在.NET應(yīng)用中使用NLua庫(kù)嵌入Lua腳本,實(shí)現(xiàn)動(dòng)態(tài)邏輯和熱更新功能,包括創(chuàng)建項(xiàng)目、設(shè)置公共數(shù)據(jù)、Lua腳本交互以及熱更新的具體實(shí)現(xiàn)步驟,感興趣的可以了解一下2025-11-11
c# winform讀取xml文件創(chuàng)建菜單的代碼
動(dòng)態(tài)創(chuàng)建菜單使得程序靈活性大大增加,本文根據(jù)讀取xml文件中的配置菜單項(xiàng)來動(dòng)態(tài)創(chuàng)建菜單,代碼如下2013-09-09
C#實(shí)現(xiàn)SHP文件讀取與地圖顯示的完整教程
在地理信息系統(tǒng)(GIS)開發(fā)中,SHP文件是一種常見的矢量數(shù)據(jù)格式,本文將詳細(xì)介紹如何使用C#讀取SHP文件并實(shí)現(xiàn)地圖顯示功能,包括坐標(biāo)轉(zhuǎn)換、圖形渲染、平移縮放操作以及屬性表展示,需要的朋友可以參考下2025-09-09
WPF仿LiveCharts實(shí)現(xiàn)餅圖的繪制
這篇文章主要介紹了如何利用WPF仿LiveCharts實(shí)現(xiàn)餅圖的繪制,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)或工作有一定幫助,需要的可以參考一下2022-07-07
c#調(diào)用c++的DLL的實(shí)現(xiàn)方法
本文主要介紹了c#調(diào)用c++的DLL的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05

