从用户角度看,Android Wi-Fi模块自下向上可以看为5层:硬件驱动程序,wpa_suppplicant,JNI,WiFi API,WifiSettings应用程序。

1.wpa_supplicant是一个开源库,是android实现Wi-Fi功能的基础,它从上层接到命令后,通过Socket与硬件驱动进行通讯,操作硬件完成需要的操作。

2.JNI(Java Native Interface)实现了java代码与其他代码的交互,使得在java虚拟机中运行的java代码能够与其他语言编写的应用程序和库进行交互,在android中,JNI可以让java程序调用C程序。

3.Wi-Fi API使应用程序可以使用Wi-Fi的功能。

4.Wi-FI Settings应用程序是android中自带的一个应用程序,选择手机的Settings->WireLess & netWorks->Wi-Fi,可以让用户手动打开或关闭Wi-Fi功能。当用户打开Wi-Fi功能后,它会自动搜索周围的无线网络,并以列表的 形式显示,供用户选择。默认会连接用户上一次成功连接的无线网络。

在android.net.wifi包中提供了一些类管理设备的Wi-Fi功能。主要包括ScanResult,wifiConfiguration,WifiInfo,WifiManager.

1.ScanResult

ScanResult主要是通过Wi-Fi硬件的扫描来获取一些周边的Wi-Fi热点的信息。该类包括以下五个域:

返回类型 域名 解释
public String BSSID 接入点地址
public String SSID 网络的名称
public String capabilities 网络性能,包括介入点支持的认证,密钥管理,加密机制等
public int frequency 以MHz为单位的接入频率
public int level 以dBm为单位的信号强度

该类还提供了一个方法toString(),可将结果转换为简洁,易读的字符串形式。

2.wifiConfiguration类

通过该类可获取一个Wi-Fi网络的网络配置,包括安全配置等。该类包括六个子类,如下:

子类 解释
WifiConfiguration.AuthAlgorthm 获取IEEE802.11的加密方法
WifiConfiguration.GroupCipher 获取组密钥
WifiConfiguration.KeyMgmt 获取密码管理机制
WifiConfiguration.PairwiseCipher 获取WPA方式的成对密钥
WifiConfiguration.Protocol 获取机密协议
WifiConfiguration.Status 获取当前网络状态

每个子类都以常量形式给出相关的配置信息,有些还包括含域和方法。

3.WifiInfo类

通过该类可以获取已经建立或处于活动状态的Wi-Fi网络的状态信息。该类提供的方法较多,部分常用的如下:

方法 解释
getBSSIS() 获取当前接入点的BSSID
getIpAddress() 获取IP地址
getLinkSpeed() 获取当前连接的速度
getMacAddress() 获取MAC地址
getRssi() 获得802.11n网络的信号强度指示
getSSID() 获得网络SSID
getSupplicanState() 返回客户端状态的信息

4.wifiManager类

该类用于管理Wi-Fi连接,其定义了26个常量和23个方法。下面列出常用方法:

方法      解释
addNetwork(WifiConfiguration config) 向设置好的网络里添加新网络
calculateSignalLevel(int rssi,int numLevels) 计算信号的等级
compareSignalLevel(int rssiA,int rssiB) 对比两个信号的强度
createWifiLock(int lockType,String tag) 创建一个Wi-Fi锁,锁定当前的Wi-Fi连接
disableNetWork(int netId) 让一个网络连接失败
disconnect() 与当前接入点断连接
enableNetwork(int netId,Boolean disableOthers) 与之前设置好的网络建立连接
getConfiguredNetworks() 客户端获取网络连接状态
getConnectionInfo() 获取当前连接信息
getDhcpInfo() 获取DHCP信息
getScanResult() 获取扫描测试结果
getWifiState() 获取一个Wi-Fi接入点是否有效
isWifiEnabled() 判断一个Wi-Fi连接是否有效
pingSupplicant() 看看客户后台程序是否响应请求
ressociate() 重连到接入点,即使已经连接上了
reconnect() 如果现在没有连接的话,则重连接
removeNetwork(int netId) 移出某一个特定网络
saveConfiguration() 保留一个配置信息
setWifiEnabled(boolean enabled) 让一个连接有效或失效
startScan() 开始扫描
updateNetwork(WifiConfiguration config) 更新一个网络连接信息

需要指出的是,Wi-Fi网卡状态是由一系列的整型常量来表示的。

WIFI_STATE_DISABLED:Wi-Fi网卡不可用,用整型常量1表示。

WIFI_STATE_DISABLING:Wi-Fi网卡正在关闭,用整型常量0表示。

WIFI_STATE_ENABLED:Wi-Fi网卡可用,用整型常量3表示。

WIFI_STATE_ENABLING:Wi-Fi网卡正在打开,启动需要一段时间,用整型常量2表示。

WIFI_STATE_UNKNOWN:未知网卡状态,用整型常量4表示。

此外wifiManager还提供了一个子类wifiManagerLock.wifiManagerLock的作用是这样的:在普通的状态下,如 果Wi-Fi的状态处于闲置,那么网络将会暂时中断;但是如果把当前的网络状态锁上,那么Wi-Fi连通将会保持在一定的状态,在结束锁定之后,才会恢复 常态。

下面简单介绍一些方法的调用方式

private WifiInfo mWifiInfo;

private WifiManager mWifiManager;

1.获取WifiManager系统服务

mWifiManager=(WifiManager)context.getSystemService(Context.WIFI_SERVICE);

2.重新获取当前Wi-Fi的连接信息

public void againGetWifiInfo(){

  mWifiInfo=mWifiManager.getConnectionInfo();

}

3.判断用户是否开启wi-fi网卡

public boolean isNetCardFriendly(){

  return mWifiManager.isWifiEnabled();

}

4.判断当前是否连接Wi-Fi

private State state;

//创建连接管理器

private ConnectivityManager connManager;

public boolean isConnectioning(){

  state=connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState();

  if(State.CONNECTING==state){

    return true;

  }else{

    return false;

  }

}

5.得到当前网络的连接状态

public State getCurrentState(){

  state=connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState();

  return state;

}

6.设置配置好的网络(有密码的网络并配置好密码),指定的

//网络连接列表

private List wifiConfigList=new ArrayList();

//Wi-Fi配置列表

private List wifiConfigedSpecifiedList=new ArrayList();

public void setWifiConfigedSpecifiedList(String ssid){

  wifiConfigedSpecifiedList.clear();

  if(wifiConfigList!=null){

    for(WifiConfiguration item : wifiConfigList){

      //如果是指定的网络,就加入列表

      if(item.SSID.equalsIgnoreCase("\""+ssid+"\"")&& item.preSharedKey!=null){

        //添加到列表中

        wifiConfigedSpecifiedList.add(item);

      }

    }

  }

}

7.返回Wi-Fi设置列表

public List getWifiConfigedSpecifiedList(){

  return wifiConfigedSpecifiedList;

}

8.打开Wi-Fi网卡

public void openNetCard(){

  if(!mWifiManager.isWifiEnabled()){

    mWifiManager.setWifiEnabled(true);

  }

}

9.关闭Wi-Fi网卡

public void closeNetCard(){

  if(mWifiManager.isWifiEnabled()){

    mWifiManager.setWifiEnabled(false);

  }

}

10.检查当前Wi-Fi网卡状态

public void checkNetCardState(){

  if(mWifiManager.getWifiState()==0){

    Log.i("","网卡正在关闭");

  }else if(mWifiManager.getWifiState()==1){

    Log.i("","网卡已经关闭");

  }else if(mWifiManager.getWifiState()==2){

    Log.i("","网卡正在打开");

  }else if(mWifiManager.getWifiState()==3){

    Log.i("","网卡已经打开");  

  }else{

    Log.i("","没有获取到状态");

  }

}

11.扫描周边网络

//保存扫描结果列表

public List listResult=new ArrayList();

public void scan(){

  //开始扫描

  mWifiManager.startScan();

  //获取扫描结果

  listResult=mWifiManager.getScanResults();

  //扫描配置列表

  wifiConfigList=mWifiManager.getConfiguredNetworks();

  if(listResult!=null){

    //当前存在无线网络

  }else{

    //当前区域没有无线网络  

  }

}

12.返回扫描结果

public List getListResult(){

  return listResult;

}

13.得到扫描结果

//存储扫描结果

private StringBuffer mStringBuffer=new StringBuffer();

private ScanResult mScanResult;

public String getScanResult(){

  //每次点击扫描之前清空上一次扫描结果

  if(mStringBuffer!=null){

    mStringBuffer=new StringBuffer();  

  }

  //开始扫描调用11的方法

  scan();

  listResult=mWifiManager.getScanResults();

  if(listResult!=null){

    for(int i=0;i

      mScanResult=listResult.get(i);

      //将需要的属性连接到字符串里面 

     mStringBuffer.append("NO.").append(i+1).append(" :").append(mScanResult.SSID).append("->").append(mScanResult.BSSID).append("->").append(mScanResult.capabilities).append("->").append(mScanResult.frequency).append("->").append(mScanResult.level).append("->").append(mScanResult.describeContents()).append("\n\n");

    }

  }

  return mStringBuffer.toString();

}

14.断开当前连接的网络

public void disconnectWifi(){

  //获取网络ID

  int newId=getNetworkId();

  //设置网络不可用

  mWifiManager.disableNetWork(netId);

  //断开网络

  mWifiManager.disconnect();

  //设置Wi-Fi信息为NULL

  mWifiInfo=null;

}

15.检查当前网络状态

public Boolean checkNetWorkState(){

  if(mWifiInfo!=null){

    return true;

  }else{

    return false;

  }

}

16.得到连接的ID

public int getNetworkId(){

  return (mWifiInfo==null)?0:mWifiInfo.getNetworkId();

}

17.得到IP地址

public void getIPAddress(){

   return (mWifiInfo==null)?0:mWifiInfo.getIpAddress();

}

18.锁定WifiLock

WinfiLock mWifiLock;

public void acquireWifilock(){

  mWifiLock.acquire();

}

19.解锁WifiLock

public void releaseWifiLock(){

  if(mWifiLock.isHeld()){

    mWifiLock.acquire();

  }

}

20.创建一个WifiLock

public void creatWifiLock(){

  mWifiLock=mWifiManager.createWifiLock("test");

}

21.得到配置好的网络wpa_supplicant.conf中的内容,不管有没有配置密码

public List getConfiguration(){

  return wifiConfigList;

}

22.指定配置好的网络连接

public Boolean connectConfiguration(int index)(){

  //所引大于配置好的网络返回

  if(index>=wifiConfigList.size()){

    return false;

  }

  return mWifiManager.enableNetwork(wifiConfigedSpecifiedList.get(index).networkId,true);

}

23.得到MAX地址

public String getMacAddress(){

  return (mWifiInfo=null)?"":mWifiInfo.getMacAddress(); 

}

24.得到接入点BSSID

public String getBSSID(){

  return (mWifiInfo=null)?"NULL":mWifiInfo.getBSSID();

}

25.得到WifiInfo的所有信息包

public String getWifiInfo(){

  return (mWifiInfo=null)?"NULL":mWifiInfo.toString();

}

26.添加一个网络并连接

public int addNetwork(WifiConfiguration g){

  //添加网络

  int wcgID=mWifiManager.addNetwork(g);

  //设置添加的网络可用

  mWifiManager.enableNetwork(wcgID,true);

  return wcgID;

}

Andriod wifi 基本操作的更多相关文章

  1. Andriod WIFI驱动模块

    一:什么是WIFI WIFI是一种无线连接技术,可用于手机.电脑.PDA等终端.WIFI技术产生的目的是改善基于IEEE802.11标准的无线网络产品之间的互通性,也就是说WIFI是基于802.11标 ...

  2. Android Wi-Fi基本操作

    从用户角度看,Android Wi-Fi模块自下向上可以看为5层:硬件驱动程序,wpa_suppplicant,JNI,WiFi API,WifiSettings应用程序. 1.wpa_supplic ...

  3. 九、Android学习第八天——广播机制与WIFI网络操作(转)

    (转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 九.Android学习第八天——广播机制与WIFI网络操作 今天熟悉了An ...

  4. Android WIFI的基本操作

    WIFI管理类 class WifiConnector { private ExecutorService executors; Handler mHandler; WifiManager wifiM ...

  5. Andriod小项目——在线音乐播放器

    转载自: http://blog.csdn.net/sunkes/article/details/51189189 Andriod小项目——在线音乐播放器 Android在线音乐播放器 从大一开始就已 ...

  6. Fiddler基本原理与抓取Andriod与IOS的App数据包

    Fiddler基本原理 Fiddler数据包的原理是Fiddler将自己设置为一个代理服务器,默认监听127.0.0.1:8888端口同时将浏览器的HTTP.HTTPS协议设置为使用代理服务器也就是使 ...

  7. Andriod环境搭建

    安卓是一款现在在移动端十分流行的系统,本人出于好奇心,希望彻底了解安卓的开发技. 首先了解一下安卓的系统构架,安卓大致分为四层架构,五块区域: 1.Linux内核层 Andriod是基于Linux2. ...

  8. Windows 7/8 创建WIFI热点

    问题描述:很多人(特别是中国的大学生)都拥有一台联网的笔记本电脑,而手机使用的却是电信运营商提供的限制数量和速度的GPRS. 很多人不敢想象:联网的笔记本电脑能够将其流量以WiFi的形式共享出来供其它 ...

  9. phonegap环境配置与基本操作

    一.开发环境配置: 1.工具环境安装: 安装java sdk 1.6以上版本号,Android Development Tools.ant,系统变量 Path后面加入 新增名稱 JAVA_HOME 值 ...

随机推荐

  1. Ralink RT3290无线网卡驱动安装 (linux)

    Ralink RT3290无线网卡驱动安装 (linux, 笔记备忘) 1. 设备信息查看无线网卡设备信息 # lspci : 2. 驱动下载http://pan.baidu.com/s/1sjsHN ...

  2. hdu 4612 Warm up 桥缩点

    4612Warm hdu up 题目:给出一个图,添加一条边之后,问能够在新图中得到的最少的桥的数量. 分析:我们可以双联通分量进行缩点,原图变成了一棵树.问题变成了:求树中添加一条边之后,使得不在圈 ...

  3. echo,printr,print_r之间的区别

    echo 返回值是void,可以一次输出多个值,多个值之间用逗号分隔.echo是语言结构(language construct)也就是关键字,而并不是真正的函数,因此不能作为表达式的一部分使用.使用的 ...

  4. JS内存泄露常见原因

    详细内容请点击 分享的笔记本-前端 开发中,我们常遇见的一些关于js内存泄露的问题,有时候我们常常会找半天找不出原因,这里给大家介绍简单便捷的方法 1.闭包上下文绑定后没有释放:   2.观察者模式在 ...

  5. Abp Zero——前端如何新增功能模块

    为适应不同开发人员,abp rezo的UI实现了spa和mpa两套: spa--Single-page Application(单页面应用),默认"http://localhost/Acco ...

  6. 在IIS上发布项目后浏览时报的错:Unable to make the session state request to the session state server

    错误描述: Unable to make the session state request to the session state server. Please ensure that the A ...

  7. js中的相等与不等运算

    如果其中一个操作数的类型为 Boolean ,那么,首先将它转换为数字类型,false 转换为 0, true 将转换为 1. 如果其中一个操作数的类型是字符串,另外一个为数字类型,那么,将字符串转换 ...

  8. 桌面虚拟化之XenDesktop7

    安装篇 1. 安装所需要的组件 2. 安装核心组件 配置篇 完整的部署 1. 打开Citrix Studio软件 2. 选择完整部署 3. 创建站点 4. 选择数据库(可以使用自己的或者默认使用自带的 ...

  9. String中重要方法与字段

    下列这段代码已全部包含了我要写的String类中重要的字段: //StringMisc.java// This program demonstrates the length, charAt and ...

  10. 洛谷 P3374 【模板】树状数组 1

    题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某一个数加上x 2.求出某区间每一个数的和 输入输出格式 输入格式: 第一行包含两个整数N.M,分别表示该数列数字的个数和操作的总个数. ...