获取系统的网络状态与无线网的信号强度(格数)
一台电脑,有时通过有线网连接网络(调制解调器/局域网),如有网卡也可连接wifi。
那么如何获取WLAN是否连接,和相应的信号强度呢?
就以下俩点:
- 获取电脑连网状态
- 获取无线网络的信号强度
获取电脑连网状态
通过IsNetworkAlive可获取当前环境是否已经连接网络。详见《C# 获取电脑的网络连接状态》
流程:网络是否连接->是否有无线网连接->获取无线网状态(信号强度)->返回网络状态
1 [DllImport("sensapi.dll", SetLastError = true)] 2 private static extern bool IsNetworkAlive(out int connectionDescription); 3 public NetworkStatus GetNetworkStatusByNetworkAlive() 4 { 5 var networkStatus = NetworkStatus.InternetWithError; 6 7 int flags = 0; 8 var isNetworkAlive = IsNetworkAlive(out flags); 9 10 int errCode = Marshal.GetLastWin32Error(); 11 if (errCode != 0) 12 { 13 throw new InvalidOperationException($"通过{nameof(IsNetworkAlive)}非托管DLL,获取网络状态时,遇到异常"); 14 } 15 if (isNetworkAlive) 16 { 17 // 获取WLAN网络状态 18 var wlanStatus = GetWlanStatus(); 19 if (isNetworkAlive && wlanStatus == NetworkStatus.WifiWithErro) 20 { 21 networkStatus = NetworkStatus.Internet; 22 } 23 else 24 { 25 networkStatus = wlanStatus; 26 } 27 } 28 return networkStatus; 29 }
网络状态枚举值
暂时只定义了有线网和无线网的状态
1 /// <summary> 2 /// 网络状态 3 /// </summary> 4 public enum NetworkStatus 5 { 6 Internet, 7 InternetWithError, 8 WifiWithErro, 9 WifiWithOneBar, 10 WifiWithTwoBars, 11 WifiWithThreeBars, 12 WifiWithFourBars, 13 }
那么,具体是否有线/还是无线网络,如何判断?见下面~
获取无线网络的信号强度
获取WLAN的名称与信号强度
无线网的信息,可以通过第三方开源ManagedWifi来获取。
ManagedWifi.Dll也可以从我的云盘下载:https://pan.baidu.com/s/1CjSUIMr0DuVqDZrdZCx_mA 密码:2d2o
下载后引用到项目中
1. WlanClient wlanClient = new WlanClient();
2. 循环foreach(WlanClient.WlanInterface wlanIface in wlanClient.Interfaces)
3. Wlan.WlanAvailableNetwork[] networks = wlanIface.GetAvailableNetworkList(0);
值得注意的是,
- WlanClient只在有网卡的系统中能初始化--所以如果WlanClient不能初始化,且IsNetworkAlive返回true,则意味着当前是有线连接网线
- WlanInterfacer的GetAvailableNetworkList方法,获取的是附近wifi热点列表,和任务栏下热点列表的顺序无关。
- WlanAvailableNetwork的wlanSignalQuality信号强度,100以内,如要转换成信号格数,需要整除25
- profileName,对已连接的热点profileName显示完整,未连接的热点profileName为empty.
获取无线网连接状态:
1 private NetworkStatus GetWlanStatus() 2 { 3 var wlanStatus = NetworkStatus.WifiWithErro; 4 try 5 { 6 WlanClient wlanClient = new WlanClient(); 7 8 foreach (WlanClient.WlanInterface wlanIface in wlanClient.Interfaces) 9 { 10 if (wlanIface.InterfaceState == Wlan.WlanInterfaceState.Connected && wlanIface.CurrentConnection.isState == Wlan.WlanInterfaceState.Connected) 11 { 12 Wlan.WlanAvailableNetwork[] networks = wlanIface.GetAvailableNetworkList(0); 13 foreach (var network in networks) 14 { 15 if (network.profileName == wlanIface.CurrentConnection.profileName 16 && (int)network.flags == (int)(Wlan.WlanAvailableNetworkFlags.Connected | Wlan.WlanAvailableNetworkFlags.HasProfile)) 17 { 18 switch (network.wlanSignalQuality / 25) 19 { 20 case 0: 21 wlanStatus = NetworkStatus.WifiWithOneBar; 22 break; 23 case 1: 24 wlanStatus = NetworkStatus.WifiWithTwoBars; 25 break; 26 case 2: 27 wlanStatus = NetworkStatus.WifiWithThreeBars; 28 break; 29 default: 30 wlanStatus = NetworkStatus.WifiWithFourBars; 31 break; 32 } 33 break; 34 } 35 } 36 break; 37 } 38 } 39 } 40 catch (Exception e) 41 { 42 } 43 return wlanStatus; 44 }
关键字:网络连接状态NetworkStatus,无线网络强度(格数),ManagedWifi,IsNetworkAlive,GetLastError
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 上周热点回顾(2.17-2.23)
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)