码迷,mamicode.com
首页 > 其他好文 > 详细

获取系统的网络状态与无线网的信号强度

时间:2018-05-10 00:04:21      阅读:369      评论:0      收藏:0      [点我收藏+]

标签:api   with   需要   dwr   第三方   OLE   class   定义   alq   

一台电脑,有时通过有线网连接网络(调制解调器/局域网),如有网卡也可连接wifi。
那么如何获取WLAN是否连接,和相应的信号强度呢?

就以下俩点:

  • 获取电脑连网状态
  • 获取无线网络的信号强度

 获取电脑连网状态

 在看下文之前,可以浏览:通过InternetGetConnectedState方法对网络状态的获取

如上InternetGetConnectedState方法介绍中

  • dwReversed必须设置为0
  • 通过输出值lpdwFlags可以获取当前网络连接的信息,通过拼装对比可以得到当前连接的网络类型,如拨号上网/局域网/无线网等
bool InternetGetConnectedState( out LPDWORD lpdwFlags, int dwReversed);

技术分享图片

首先,添加非托管函数并调用,可以获取网络是否联网

//声明外部的函数
[DllImport("winInet.dll ")]
private static extern bool InternetGetConnectedState(ref int flag,int dwReserved);

 

获取无线网络的信号强度

1. 判断当前是否是WLAN网络  

微软API表示,不管是否有网,Flag值都是有效的。

1 var isConnectedNetwork = InternetGetConnectedState(ref Flag, 0);
2 var hasWlan = (Flag & INTERNET_CONNECTION_LAN) != 0;

2. 获取WLAN的名称与信号强度

无线网的信息,可以通过第三方开源ManagedWifi来获取。

也可以从我的云盘下载:https://pan.baidu.com/s/1CjSUIMr0DuVqDZrdZCx_mA 密码:2d2o

下载后引用到项目中

值得注意的是,

  • WlanClient只在有网卡的系统中能初始化
  • WlanInterfacer的GetAvailableNetworkList方法,获取的是附近wifi热点列表,和任务栏下热点列表的顺序无关。
  • WlanAvailableNetwork的wlanSignalQuality信号强度,100以内,如要转换成信号格数,需要整除25
  • profileName,对已连接的热点profileName显示完整,未连接的热点profileName为empty.

定义枚举值:

暂时只定义了有线网和无线网的状态 

 1 /// <summary>
 2 /// 网络状态
 3 /// </summary>
 4 public enum NetworkStatus
 5 {
 6     Internet,
 7     InternetWithError,
 8     WifiWithError,
 9     WifiWithOneBar,
10     WifiWithTwoBars,
11     WifiWithThreeBars,
12     WifiWithFourBars,
13 }

获取网络状态的详细实现

流程:网络是否连接->是否有无线网连接->获取无线网状态(信号强度)->返回网络状态

 1 //获取网络状态
 2 public static NetworkStatus GetNetworkStatus()
 3 {
 4     var networkStatus = NetworkStatus.InternetWithError;
 5 
 6     int Flag = 0;
 7     var isConnectedNetwork = InternetGetConnectedState(ref Flag, 0);
 8     var hasWlan = (Flag & INTERNET_CONNECTION_LAN) != 0;
 9 
10     if (hasWlan)
11     {
12         var wlanStatus = GetWlanStatus();
13         if (isConnectedNetwork && wlanStatus == NetworkStatus.WifiWithError)
14         {
15             //如未已连接网络,且无线网连接错误,则返回有线网连接正常状态。
16             networkStatus = NetworkStatus.Internet;
17         }
18         else
19         {
20             networkStatus = wlanStatus;
21         }
22     }
23     else
24     {
25         //返回有线网连接状态
26         networkStatus = isConnectedNetwork ? NetworkStatus.Internet : NetworkStatus.InternetWithError;
27     }
28     return networkStatus;
29 } 
31 
32 private static NetworkStatus GetWlanStatus()
33 {
34     var wlanStatus = NetworkStatus.WifiWithError;
35     try
36     {
37         WlanClient wlanClient = new WlanClient();
38 
39         foreach (WlanClient.WlanInterface wlanIface in wlanClient.Interfaces)
40         {
41             if (wlanIface.InterfaceState == Wlan.WlanInterfaceState.Connected && wlanIface.CurrentConnection.isState == Wlan.WlanInterfaceState.Connected)
42             {
43                 Wlan.WlanAvailableNetwork[] networks = wlanIface.GetAvailableNetworkList(0);
44                 foreach (var network in networks)
45                 {
46                     if (network.profileName == wlanIface.CurrentConnection.profileName
47                         && (int)network.flags == (int)(Wlan.WlanAvailableNetworkFlags.Connected | Wlan.WlanAvailableNetworkFlags.HasProfile))
48                     {
49                         switch (network.wlanSignalQuality / 25)
50                         {
51                             case 0:
52                                 wlanStatus = NetworkStatus.WifiWithOneBar;
53                                 break;
54                             case 1:
55                                 wlanStatus = NetworkStatus.WifiWithTwoBars;
56                                 break;
57                             case 2:
58                                 wlanStatus = NetworkStatus.WifiWithThreeBars;
59                                 break;
60                             default:
61                                 wlanStatus = NetworkStatus.WifiWithFourBars;
62                                 break;
63                         } 
65                         break;
66                     }
67                 }
68                 break;
69             }
70         }
71     }
72     catch (Exception e)
73     {
74         Console.WriteLine("获取无线网配置失败!");
75     } 
77     return wlanStatus;
78 }
79 
80 private const int INTERNET_CONNECTION_LAN = 2;
81 
82 //声明外部的函数
83 [DllImport("winInet.dll ")]
84 private static extern bool InternetGetConnectedState(ref int flag, int dwReserved);

 

获取系统的网络状态与无线网的信号强度

标签:api   with   需要   dwr   第三方   OLE   class   定义   alq   

原文地址:https://www.cnblogs.com/kybs0/p/9017301.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!