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

一台电脑,有时通过有线网连接网络(调制解调器/局域网),如有网卡也可连接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);

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

时间: 2024-11-08 00:22:31

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

iOS中利用CoreTelephony获取用户当前网络状态(判断2G,3G,4G)

前言: 在项目开发当中,往往需要利用网络.而用户的网络环境也需要我们开发者去注意,根据不同的网络状态作相应的优化,以提升用户体验. 但通常我们只会判断用户是在WIFI还是移动数据,而实际上,移动数据也分为2G/3G/4G等不同制式.而不同的网络制式又对用户体验产生 较为明显的影响(对于依赖网络的项目而言).因此很有必要对不同的网络制式作相应的优化. 而在iOS当中,无论是苹果官方提供的Reachability类还是较为常用的第三方网络类AFNetworking,它们提供的网络环境判断也仅限 于W

利用CoreTelephony获取用户当前网络状态(判断2G,3G,4G)

前言: 在项目开发当中,往往需要利用网络.而用户的网络环境也需要我们开发者去注意,根据不同的网络状态作相应的优化,以提升用户体验. 但通常我们只会判断用户是在WIFI还是移动数据,而实际上,移动数据也分为2G/3G/4G等不同制式.而不同的网络制式又对用户体验产生 较为明显的影响(对于依赖网络的项目而言).因此很有必要对不同的网络制式作相应的优化. 而在iOS当中,无论是苹果官方提供的Reachability类还是较为常用的第三方网络类AFNetworking,它们提供的网络环境判断也仅限 于W

ios获取当前的网络状态, 获取当前连接的wifi名字

iOS中用来查询当前连接的网络信息的API即CNCopyCurrentNetworkInfo 这个API位于SystemConfiguration.framework里面,使用时需要增加.h和包含库文件 使用时可以直接包含 #import <SystemConfiguration/CaptiveNetwork.h> 代码如下: + (NSString *)getWifiName { NSString *wifiName = nil; CFArrayRef wifiInterfaces = CN

【API】获取系统内存所有状态

SYSTEM_INFO sysInfo = {0}; GetSystemInfo(&sysInfo); DWORD dwMinAddr = (DWORD)sysInfo.lpMinimumApplicationAddress; DWORD dwMaxAddr = (DWORD)sysInfo.lpMaximumApplicationAddress; MEMORY_BASIC_INFORMATION memBase; int i = 0; for (dwMinAddr; dwMinAddr <

android中NetWorkReceive以及获取当前的网络连接状态详解

我们现在APP是断然很难离开网络存活下去,会有很多很频繁的网络操作,请求数据,传递数据等等,所以,我们需要对网络状态有多一点的了解. 首先,假如我们的APP在运行的时候,假如这时候用户掉线了,没有网络了,我们就应该给用户提示,然后用户连上网络了,我们这时候应该也给用户提示,这样他就可以继续玩我们的APP,我们应该怎么做了,没错,就是通过Receiver来实现,因为断网和联网系统都会发送广播,然后,我们可以收到,通过广播去判断当前的网络是否可用,具体代码如下:其中,接受广播需要的action是"a

微信小程序—获取用户网络状态和设备的信息

这个是一个简易教程,按照他的步骤下载好了,打开界面看到的效果是如下的: 这个表示没有问题得,那么我们如何获取网络状态呢?比如我到底是处于wifi状态还是2G/3G/4G网络呢? 那我们先分析下,这个hello world咋个来的呢? 打开index页面如下图: 原来是这个变量获取的值,那么这个变量在哪里呢?请见下图,index.js里哈 原来是这里啊,那么我们要在页面显示网络状态,那么我们也定一个变量吧, 这个API文档在这里,这样我们就获取到了网络状态了,而且显示到了前台页面上了,我还获取了设

iOS开发之runtime的运用-获取当前网络状态

之前写过runtime的一些东西,这次通过runtime获取一些苹果官方不想让你拿到的东西,比如,状态栏内部的控件属性.本文将通过runtime带你一步步拿到状态栏中显示网络状态的控件,然后通过监测该控件的属性来获取当前精确网络状态,比如2G/3G/4G/WIFI.首先,我们需要拿到状态栏,然后通过runtime去探讨状态栏内部的组成结构.导入运行时头文件#import <objc/message.h>编写运行时代码,获取到当前应用程序的所有成员变量 #import "ViewCon

Android获取当前网络状态

Android获取当前网络状态 效果图 有网络 没有网络 源码 下载地址(Android Studio工程):http://download.csdn.net/detail/q4878802/9052833 添加获取网络状态的权限 <!-- 获取网络状态的权限 --> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 工具类 package com.kongqw.

android 监听网络状态的变化及实战

android 监听网络状态的变化及实际应用 转载请注明博客地址:http://blog.csdn.net/gdutxiaoxu/article/details/53008266 平时我们在请求错误的情况下,通常会进行处理一下,一般来说,主要分为两方面的错误 - 没有网络的错误 - 在有网络的情况下,我们客户端的错误或者服务器端的错误 今天这篇博客主要阐述以下问题 怎样监听网络状态的变化,包括是否打开WiFi,否打开数据网络,当前连接的网络是否可用 网络没有打开情况下的处理,如弹出对话框,跳转到