2019独角兽企业重金招聘Python工程师标准>>>

从用户角度看,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<WifiConfiguration> wifiConfigList=new ArrayList<WifiConfiguration>();

//Wi-Fi配置列表

private List<WifiConfiguration> wifiConfigedSpecifiedList=new ArrayList<WifiConfiguration>();

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<WifiConfiguration> 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<ScanResult> listResult=new ArrayList<ScanResult>();

public void scan(){

  //开始扫描

  mWifiManager.startScan();

  //获取扫描结果

  listResult=mWifiManager.getScanResults();

  //扫描配置列表

  wifiConfigList=mWifiManager.getConfiguredNetworks();

  if(listResult!=null){

    //当前存在无线网络

  }else{

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

  }

}

12.返回扫描结果

public List<ScanResult> 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<listResult.size();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<WifiConfiguration> 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;

}

转载于:https://my.oschina.net/liyuanjinglyj/blog/397991

Android Wi-Fi基本操作相关推荐

  1. wifi频率和zigbee干扰_浅谈ZigBee和Wi—Fi的共存和干扰

    龙源期刊网 http://www.qikan.com.cn 浅谈 ZigBee 和 Wi - Fi 的共存和干扰 作者:姜伟 朱凯 刘童 来源:<科技视界> 2013 年第 16 期 [摘 ...

  2. 比较802.11ac(Wi‑Fi 5)和802.11ax(Wi‑Fi 6)

    MIMO 802.11ac仅在下行模式下,支持多用户MIMO. 802.11ax不仅下行链路:也在上行链路支持MIMO功能,因此多个用户可以同时上传视频. 调制方法 802.11ax具有更高的调制方案 ...

  3. android环境监测,基于Wi―Fi和Android家居环境监测与实现

    摘 要 为了人们生活环境健康安全,实现家居环境检测,利用现在手持智能设备,设计出一种基于Android的家居检测系统.本文采用了具有Android操作系统的智能手机或平板电脑作为家居设备终端,以STM ...

  4. Android蓝牙Ble基本操作-(连接2)

    前言: 连接采用nordicsemi库,其中nRF Connect也是使用该库. 蓝牙连接库.nordicsemi官网.nRF Connect apk使用教程.nRF Connect apk下载地址. ...

  5. Android开发秘籍 第2版

    iOS传感器应用开发最佳实践_PDF电子书下载 带书签目录 完整版http://pan.baidu.com/s/1dDtSP2L   Node应用程序构建  使用MongoDB和Backbone_PD ...

  6. 2011705918

    iOS传感器应用开发最佳实践_PDF电子书下载 带书签目录 完整版http://pan.baidu.com/s/1dDtSP2L   Node应用程序构建  使用MongoDB和Backbone_PD ...

  7. 基于android的智能风扇,新锡德尔对基于Android的静电式智能空气净化器系统设计...

    基于Android的静电式智能空气净化器系统设计 随着电子.通信.自动控制等技术的快速发展及人们物质精神生活的提高,家用电器的智能化控制代替传统控制已经成为一种大趋势.伴随智能手机的迅速普及,基于An ...

  8. Android设备的ID

    Android的开发者在一些特定情况下都需要知道手机中的唯一设备ID.例如,跟踪应用程序的安装,生成用于复制保护的DRM时需要使用设备的唯一ID.在本文档结尾处提供了作为参考的示例代码片段. 范围 本 ...

  9. Android之wifi工作流程

    Android Wifi的工作流程 一.WIFI工作相关部分 Wifi 网卡状态 1.    WIFI_STATE_DISABLED:WIFI网卡不可用 2.    WIFI_STATE_DISABL ...

  10. Android MediaPlayer使用注意

    Android MediaPlayer使用注意 (2013-01-28 00:20:02) 转载▼ 标签: android it mediaplayer 视频 音频 分类: android Andro ...

最新文章

  1. python在哪下载-python在哪里下载
  2. guava中的Strings
  3. netbeans项目缺少服务器,Netbeans,添加Glassfish服务器“不存在”
  4. sql注入一点小心得
  5. 【ArcGIS微课1000例】0007:基于数字高程模型DEM生成剖面线、剖面图
  6. 自定义泛型集合,接口
  7. EM算法极其推广---EM算法的收敛性
  8. 什么是 COM编程技术?
  9. 你这几天因为 YYYY-MM-dd 被提 BUG 了吗??
  10. Repast HPC1.0.1实例运行总结
  11. CDA数据分析师教材与题库
  12. 最新服务器cpu14纳米,Intel CPU处理器路线图:14nm用到2021年 7nm再等3年
  13. 设计模式中的撩妹神技--下篇
  14. simple craft system
  15. 虚拟化技术-什么是SAN存储?
  16. 阿里云服务器(Windows)如何远程连接?
  17. 2022年上海应届生落户政策!没有社保基数要求,能直接落户!
  18. 防火墙添加ip白名单_宝塔防火墙IP白名单添加/导入云盾YUNDUN高防CDN节点IP段
  19. mac鼠标光标消失怎么办?
  20. 马化腾凌晨网上发问,他的问题事关未来十年大事!

热门文章

  1. Discuz代码分析——index.php
  2. python一行代码的威力
  3. Python是如何一步步成为热门编程语言的?
  4. linux内存使用统计,Linux 中free命令检查内存使用情况
  5. Go各时间字符串使用详解
  6. ccat – 使用语法突出显示输出内容
  7. java 集合存储空字符窜_java中字符串对象和集合的判空
  8. P1502 窗口的星星 离散化+扫描线
  9. 牛客--追债之旅 两种解法
  10. 2019秦皇岛ccpc A题:Angle Beats[计算几何:统计符合直角三角形的个数]+[向量hash+3hash]