引言
在移动互联的今天,没有哪一款app是可以离开Wi-Fi的,所以这一部分的知识虽然简单但也是不可或缺的,正巧我们智能硬件连接同一网段多个相同UUID的AP时,出现了网络不稳定的情况,为了找到根源(主要是硬件方面说是软件的原因,我肯定要拿出证据),于是就编写了个检测小程序,实时查看Wi-Fi信息,当连接到信号很弱的AP实时,自动断开再连。
一、WifiManager和WifiInfo
WifiManager这个类正如它的名字的含义一样,封装了用于管理Wi-Fi连接的所有方面的主要API,使用之前得先获取WifiManager实例,只有一种途径那就是context.getSystemService(Context.WIFI_SERVICE)——应仅从应用程序上下文获取,而不是从任何其他派生上下文获取,以避免调用进程中的内存泄漏。而WifiInfo就是一个实现了Parcelable接口用于描述Wi-Fi状态信息的Bean,可以通过wifiManager.getConnectionInfo()获得。
1、获取WifiManager实例和获取WifiInfo实例
private WifiAdmin(Context context) {
//获取系统Wifi服务WIFI_SERVICE
WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
//获取连接信息
WifiInf wifiInfo = wifiManager.getConnectionInfo();
}
2、判断是否存在指定的热点(根据热点名称)
/**
* 是否存在网络信息
* @param str 热点名称
* @return
*/
private WifiConfiguration isExsits(String str) {
Iterator localIterator = this.wifiManager.getConfiguredNetworks().iterator();
WifiConfiguration localWifiConfiguration;
do {
if (!localIterator.hasNext()){
return null;
}
localWifiConfiguration = (WifiConfiguration) localIterator.next();
} while (!localWifiConfiguration.SSID.equals("\"" + str + "\""));
return localWifiConfiguration;
}
3、WifiManager.WifiLock
所谓WifiLock其实可以理解成一种机制,我们知道在手机屏幕关闭之后,并且其他的应用程序没有在使用wifi的时候,android系统大概在两分钟之后,会关闭wifi,使得wifi处于睡眠状态,来节省电源能量和延长电池寿命等。但是有时候我们希望Wi-Fi一直处于活跃状态,于是Android提供了一种叫WifiLock的机制,能够阻止wifi进入睡眠状态。
- 创建WifiManager.WifiLock
/**
*
* @param lockName
* 锁的名字
* @return wifiLock
*/
public WifiLock createWifiLock(String lockName) {
wifiLock = wifiManager.createWifiLock(lockName);
return wifiLock;
}
/**
*
* @param lockName
* 锁的名称
* @param lockType
*
* WIFI_MODE_FULL == 1 <br/>
* 扫描,自动的尝试去连接一个曾经配置过的点<br />
* WIFI_MODE_SCAN_ONLY == 2 <br/>
* 只剩下扫描<br />
* WIFI_MODE_FULL_HIGH_PERF = 3 <br/>
* 在第一种模式的基础上,保持最佳性能<br />
* @return wifiLock
*/
public WifiLock createWifiLock(String lockName, int lockType){
wifiLock = wifiManager.createWifiLock(lockType, lockName);
return wifiLock;
}
- 激活WifiManager.WifiLock上锁
/**
* 加上锁
*/
public void lockWifi(){
wifiLock.acquire();
}
- 释放WifiManager.WifiLock
/**
* 释放锁
*/
public void releaseLock(){
if (wifiLock.isHeld()) {
wifiLock.release();
}
}
- 判断WifiManager.WifiLock是否被持有
/**
* 判断wifi的锁是否持有
*
* @return
*/
public boolean isHeld(){
return wifiLock.isHeld();
}
4、打开、关闭、断开Wi-Fi连接
/**
* 打开Wifi
**/
public void OpenWifi() {
if (!this.wifiManager.isWifiEnabled()) { //当前wifi不可用
this.wifiManager.setWifiEnabled(true);
}
}
/**
* 关闭Wifi
**/
public void closeWifi() {
if (wifiManager.isWifiEnabled()) {
wifiManager.setWifiEnabled(false);
}
}
/**
* 端口指定id的wifi
**/
public void disconnectWifi(int netid) {
this.wifiManager.disableNetwork(netid);
}
5、通过WifiInfo实例获取Wifi的各种信息
方法 | 说明 | |
---|---|---|
String getBSSID() | 获取BSSID | |
static NetworkInfo.DetailedState getDetailedStateOf(SupplicantState suppState) | 获取网络链接的状态。 | |
boolean getHiddenSSID() | ||
int getIpAddress() | ||
int getLinkSpeed() | Returns the current link speed in LINK_SPEED_UNITS. | |
String getMacAddress() | ||
int getNetworkId() | 返回NetId | |
int getRssi() | 返回当前信号的强度,单位dBm,通常wifi模块获取wifi信号强度值时会在-20~-100之间的值,-20最好 | |
String getSSID() | Returns the service set identifier (SSID) of the current 802.11 network. |
二、实时监测Wi-Fi信息
public class MainActivity extends Activity {
private WifiManager wifiManager;
private WifiInfo wi; // WifiInfo在包android.net.wifi.WifiInfo中
private int strength; //信号强度
private TextView tvwifi;
//android wifi模块获取wifi信号强度值时我们通常会得到-20~-80之间的值
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
wifiManager = (WifiManager) getSystemService(WIFI_SERVICE);
tvwifi= (TextView) findViewById(R.id.tv_signal);
new SignalThread().start();
}
class SignalThread extends Thread{
@Override
public void run() {
do{
try{
Thread.sleep(3000);
Message msg = new Message();
msg.what = 1;//what,int类型,未定义的消息,以便接收消息者可以鉴定消息是关于什么的。每个句柄都有自己的消息命名空间,不必担心冲突
mHandler.sendMessage(msg);
}
catch (InterruptedException e){
e.printStackTrace();
}
}while (true);
}
}
private StringBuilder stringBuilder=new StringBuilder();
private SimpleDateFormat formatter = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss ");
private Handler mHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch(msg.what){
case 1:
//使用getSystemService(String)来取回WifiManager然后处理wifi接入,
wi = wifiManager.getConnectionInfo();//getConnectionInfo返回wifi连接的动态信息
Calendar cal = Calendar.getInstance();
String currdate=String.valueOf(cal.get(Calendar.HOUR))+":"+cal.get(Calendar.MINUTE)+":"+cal.get(Calendar.SECOND);
if(wi.getBSSID() != null)//getBSSID返回基本服务集标识符,如果未连接,返回null,否则返回MAC地址形式:XX:XX:XX:XX:XX
strength = wi.getRssi();//返回接收到的目前的802.11网络的信号强度
stringBuilder.append(currdate+" BSSID:"+wi.getBSSID()+" 网络:"+wi.getSSID()+" 信号强度:"
+((Integer) strength).toString()+"连接速度:"+wi.getLinkSpeed());
stringBuilder.append("\n");
tvwifi.setText(stringBuilder.toString());
break;
default:
break;
}
}
};
}
未完待续。。。