Android settings之Wifi学习.docx

上传人:b****2 文档编号:2533088 上传时间:2023-05-03 格式:DOCX 页数:20 大小:97.39KB
下载 相关 举报
Android settings之Wifi学习.docx_第1页
第1页 / 共20页
Android settings之Wifi学习.docx_第2页
第2页 / 共20页
Android settings之Wifi学习.docx_第3页
第3页 / 共20页
Android settings之Wifi学习.docx_第4页
第4页 / 共20页
Android settings之Wifi学习.docx_第5页
第5页 / 共20页
Android settings之Wifi学习.docx_第6页
第6页 / 共20页
Android settings之Wifi学习.docx_第7页
第7页 / 共20页
Android settings之Wifi学习.docx_第8页
第8页 / 共20页
Android settings之Wifi学习.docx_第9页
第9页 / 共20页
Android settings之Wifi学习.docx_第10页
第10页 / 共20页
Android settings之Wifi学习.docx_第11页
第11页 / 共20页
Android settings之Wifi学习.docx_第12页
第12页 / 共20页
Android settings之Wifi学习.docx_第13页
第13页 / 共20页
Android settings之Wifi学习.docx_第14页
第14页 / 共20页
Android settings之Wifi学习.docx_第15页
第15页 / 共20页
Android settings之Wifi学习.docx_第16页
第16页 / 共20页
Android settings之Wifi学习.docx_第17页
第17页 / 共20页
Android settings之Wifi学习.docx_第18页
第18页 / 共20页
Android settings之Wifi学习.docx_第19页
第19页 / 共20页
Android settings之Wifi学习.docx_第20页
第20页 / 共20页
亲,该文档总共20页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

Android settings之Wifi学习.docx

《Android settings之Wifi学习.docx》由会员分享,可在线阅读,更多相关《Android settings之Wifi学习.docx(20页珍藏版)》请在冰点文库上搜索。

Android settings之Wifi学习.docx

Androidsettings之Wifi学习

Androidwifi模块学习

wifi相关的文件位置:

WIFISettings应用程序位于

packages/apps/Settings/src/com/android/settings/wifi/

JAVA部分:

frameworks/base/services/java/com/android/server/

frameworks/base/wifi/java/android/net/wifi/

JNI部分:

frameworks/base/core/jni/android_net_wifi_Wifi.cpp

wifi管理库。

hardware/libhardware_legary/wifi/

wifi用户空间的程序和库:

external/wpa_supplicant/

生成库libwpaclient.so和守护进程wpa_supplicant。

 

Wifi网卡状态

1.WIFI_STATE_DISABLED:

WIFI网卡不可用

2.WIFI_STATE_DISABLING:

WIFI正在关闭

3.WIFI_STATE_ENABLED:

WIFI网卡可用

4.WIFI_STATE_ENABLING:

WIFI网卡正在打开

5.WIFI_STATE_UNKNOWN:

未知网卡状态

WIFI访问网络需要的权限

android:

name=“android.permission.CHANGE_NETWORK_STATE”>

网络状态改变的权限

android:

name=“android.permission.CHANGE_WIFI_STATE”>

修改WIFI状态的权限

android:

name=“android.permission.ACCESS_NETWORK_STATE”>

访问网络权限

android:

name=“android.permission.ACCESS_WIFI_STATE”>

访问WIFI权限

 

Android提供了frameworks/base/wifi/java/android/net/wifi包供我们操作WiFi。

首先介绍一下几个类:

WifiManager:

用来管理我们的wifi连接(提供了管理WiFI连接的大部分API)

addNetwork(WifiConfigurationconfig)通过获取到的网络的链接状态信息,来添加网络

calculateSignalLevel(intrssi,intnumLevels)计算信号的等级

compareSignalLevel(intrssiA,intrssiB)对比连接A和连接B

createWifiLock(intlockType,Stringtag)创建一个wifi锁,锁定当前的wifi连接

disableNetwork(intnetId)让一个网络连接失效

disconnect()断开连接

enableNetwork(intnetId,BooleandisableOthers)连接一个连接

getConfiguredNetworks()获取网络连接的状态

getConnectionInfo()获取当前连接的信息

getDhcpInfo()获取DHCP的信息

getScanResulats()获取扫描测试的结果

getWifiState()获取一个wifi接入点是否有效

isWifiEnabled()判断一个wifi连接是否有效

pingSupplicant()ping一个连接,判断是否能连通

ressociate()即便连接没有准备好,也要连通

reconnect()如果连接准备好了,连通

removeNetwork()移除某一个网络

saveConfiguration()保留一个配置信息

setWifiEnabled()让一个连接有效

startScan()开始扫描

updateNetwork(WifiConfigurationconfig)更新一个网络连接的信息

该类里有两个重要的成员变量:

IWifiManagermService;

privateServiceHandlermHandler;

这个类拥有了一个WifiService实例,就可以通过它进行一系列的调用;WifiManager中定义了的wifi和ap的状态,这些状态会在其他很多类中有使用;然后定义了大量的函数,这些函数几乎都是对WifiService接口函数的封装,直接调用WifiService的函数。

该类的构造函数很简单:

publicWifiManager(IWifiManagerservice,Handlerhandler){

mService=service;

mHandler=handler;

}

该类中还定义了一个WifiLock类

ScanResult:

通过wifi硬件的扫描来获取一些周边的wifi热点的信息(已经检测出的接入点的地址、名称、身份认证、频率、信号强度)

BSSID:

接入点的地址,这里主要是指小范围几个无线设备相连接所获取的地址,比如说两台笔记本通过无线网卡进行连接,双方的无线网卡分配的地址

SSID:

网络的名字,当我们搜索一个网络时,就是靠这个来区分每个不同的网络接入点

Capabilities:

网络接入的性能,这里主要是来判断网络的加密方式等(WPA、WPE)

Frequency:

频率,每一个频道交互的MHz数

Level:

等级,主要来判断网络连接的优先数。

WifiConfiguration:

连通一个wifi接入点的时候,需要获取到的一些信息

WifiConfiguration.AuthAlgorthm用来判断加密方法

WifiConfiguration.GroupCipher获取使用GroupCipher的方法来进行加密

WifiConfiguration.KeyMgmt获取使用KeyMgmt进行加密

WifiConfiguration.PairwiseCipher获取使用WPA方式的加密

WifiConfiguration.Protocol获取使用哪一种协议进行加密

wifiConfiguration.Status获取当前网络的状态

WifiInfo:

wifi连通后,可以通过这个类获得一些已经连通的wifi连接的信息(包括接入点、网络连接状态、隐藏的接入点、IP地址、连接速度、MAC地址、网络ID、信号强度等等)

getBSSID()获取BSSID

getDetailedStateOf()获取客户端的连通性,

getHiddenSSID()获得SSID是否被隐藏

getIpAddress()获取IP地址

getLinkSpeed()获得连接的速度

getMacAddress()获得Mac地址

getRssi()获得802.11n网络的信号

getSSID()获得SSID

getSupplicanState()返回具体客户端状态的信息

WifiManager.WifiLock:

用于给wifi加锁,通常用于下载大体积文件的时候。

如果应用程序想在屏幕被关掉后继续使用WiFi则可以调用acquire(),WifiLock来锁住WiFi,该操作会阻止WiFi进入睡眠状态。

当应用程序不再使用WiFi时需要调用releaseWifiLock来释放WiFi。

之后WiFi可以进入睡眠状态以节省电源。

默认情况下当屏幕被关掉以后,如果没有应用程序在使用WiFi,WiFi会在2分钟后进入睡眠状态。

这主要是为防止频繁地改变WiFi的电源模式。

wifiLock可通过setReferenceCounted(booleanrefCounted)来设置加锁方式。

一种是不计数锁,另一种是计数锁。

区别在于:

前者无论acquire()了多少次,只要通过一次release()即可解锁。

后者正真解锁是在(--count==0)的时候。

wifisettings.java

packages/apps/Settings/src/com/android/settings/wifiwifisettings.java

该类数据部分主要定义了下面几个类的变量:

{

privatefinalIntentFiltermFilter;

privatefinalBroadcastReceivermReceiver;//广播接收器,用来接收消息并做响应的处理工作

privatefinalScannermScanner;//这是一个扫描类,会在用户手动扫描AP时被调用

privateWifiInfomLastInfo;

privateWifiManagermWifiManager;//服务代理端,作为WifiService对外的接口类呈现

//这个类主要实现Wifi的开闭工作

privateWifiEnablermWifiEnabler;

//AP

privateAccessPointmSelected;

privateWifiDialogmDialog;

……

}

WifiEnabler.java:

packages/apps/Settings/src/com/android/settings/wifi/WifiEnabler.java

privatefinalContextmContext;

privateSwitchmSwitch;

privatefinalWifiManagermWifiManager;

privatefinalIntentFiltermIntentFilter;

wifienabler类中定义了四个成员变量很重要,mContext,mSwitch,mWifiManager和mReceiver,其中mContext用于获取mwifiManager实例,mReceiver用来接收底层发来的消息,mSwitch用来改变UI的状态

该类中定义了几个重要的函数onCheckedChanged,handleWifiStateChanged和handleStateChanged,onCheckedChanged用来处理按下的Enbler键,它会调用mWifiManager.setWifiEnabled(enable),另外两个用来处理接受的消息事件

 

wpa_supplicant本是开源项目源码,被谷歌修改后加入android移动平台,它主要是用来支持WEP,WPA/WPA2和WAPI无线协议和加密认证的,而实际上的工作内容是通过socket(不管是wpa_supplicant与上层还是wpa_supplicant与驱动都采用socket通讯)与驱动交互上报数据给用户,而用户可以通过socket发送命令给wpa_supplicant调动驱动来对WiFi芯片操作。

简单的说,wpa_supplicant就是WiFi驱动和用户的中转站外加对协议和加密认证的支持。

 

1.Wifi启动流程

1 初始化

(frameworks/base/services/java/com/android/server/SystemServer.Java)

在SystemServer启动的时候,会生成一个ConnectivityService的实例

try{

Slog.i(TAG,"ConnectivityService");

connectivity=newConnectivityService(

context,networkManagement,networkStats,networkPolicy);

ServiceManager.addService(Context.CONNECTIVITY_SERVICE,connectivity);

}catch(Throwablee){

reportWtf("startingConnectivityService",e);

}

try{

Slog.i(TAG,"Wi-FiService");

wifi=newWifiService(context);//实例化WifiService

ServiceManager.addService(Context.WIFI_SERVICE,wifi);

}catch(Throwablee){

reportWtf("startingWi-FiService",e);

}

跟踪frameworks/base/services/java/com/android/server/ConnectivityService.Java

for(inttargetNetworkType:

mPriorityList){

finalNetworkStateTrackertracker;

try{

tracker=netFactory.createTracker(targetNetworkType,config);

}catch(IllegalArgumentExceptione){...}

tracker.startMonitoring(context,mTrackerHandler);////启动Monitoring

WifiStateTracker会创建WifiMonitor接收来自底层的事件,WifiService和WifiMonitor是整个模块的核心。

WifiService负责启动关闭wpa_supplicant、启动关闭WifiMonitor监视线程和把命令下发给wpa_supplicant,

WifiMonitor则负责从wpa_supplicant接收事件通知。

也就是说WifiService负责wifi整个流程的控制,而WifiMonitor负责监视底层的事件

 

2 连接AP(AccessPoint,无线访问接入点)

1.激活wifi

(packages/apps/Settings/src/com/android/settings/wifi/WifiSettings.java)

WifiSettings在初始化的时候配置了由WifiEnabler来处理Wifi按钮

publicvoidonActivityCreated(BundlesavedInstanceState){

SwitchactionBarSwitch=newSwitch(activity);

mWifiEnabler=newWifiEnabler(activity,actionBarSwitch);//初始化WifiEnabler对象

当用户按下Wifi按钮后,Android会调用WifiEnabler的onPreferenceChange,再由WifiEnabler调用WifiManager的setWifiEnabled接口函数,通过AIDL,实际调用的是WifiService的setWifiEnabled函数,在处理该消息的代码中做真正的激活工作

当使能成功后,会广播发送WIFI_STATE_CHANGED_ACTION这个Intent通知外界WIFI已经成功激活了。

WifiEnabler创建的时候就会向Android注册接收WIFI_STATE_CHANGED_ACTION,当有有可用的WIFI连接时会接收到SCAN_RESULTS_AVAILABLE_ACTION,从而开始扫描。

publicWifiSettings(){

mFilter=newIntentFilter();

//当WIFI功能开启或关闭时会收到

mFilter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);

//当手机扫描到有可用的WIFI连接时会收到

mFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);

mFilter.addAction(WifiManager.NETWORK_IDS_CHANGED_ACTION);

//当连接请求状态发生改变时会收到

mFilter.addAction(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION);

mFilter.addAction(WifiManager.CONFIGURED_NETWORKS_CHANGED_ACTION);

mFilter.addAction(WifiManager.LINK_CONFIGURATION_CHANGED_ACTION);

//当网络状态发生变化时会收到

mFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);

mFilter.addAction(WifiManager.RSSI_CHANGED_ACTION);

///M:

addnoWAPIcertificationaction

mFilter.addAction(WifiManager.NO_CERTIFICATION_ACTION);

mReceiver=newBroadcastReceiver(){

@Override

publicvoidonReceive(Contextcontext,Intentintent){

handleEvent(context,intent);

}

};

mScanner=newScanner();

mManuallyConnect=false;

}

直接跟踪handleEvent()方法:

privatevoidhandleEvent(Contextcontext,Intentintent){

Stringaction=intent.getAction();

if(WifiManager.WIFI_STATE_CHANGED_ACTION.equals(action)){

updateWifiState(intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE,

WifiManager.WIFI_STATE_UNKNOWN));

}elseif(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION.equals(action)||

WifiManager.CONFIGURED_NETWORKS_CHANGED_ACTION.equals(action)||

WifiManager.LINK_CONFIGURATION_CHANGED_ACTION.equals(action)){

updateAccessPoints();

}elseif(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION.equals(action)){

SupplicantStatestate=(SupplicantState)intent.getParcelableExtra(

WifiManager.EXTRA_NEW_STATE);

if(!

mConnected.get()){

updateConnectionState(WifiInfo.getDetailedStateOf(state));

}

}elseif(WifiManager.NETWORK_STATE_CHANGED_ACTION.equals(action)){

NetworkInfoinfo=(NetworkInfo)intent.getParcelableExtra(

WifiManager.EXTRA_NETWORK_INFO);

mConnected.set(info.isConnected());

changeNextButtonState(info.isConnected());

updateAccessPoints();

updateConnectionState(info.getDetailedState());

if(mAutoFinishOnConnection&&info.isConnected()){

Activityactivity=getActivity();

if(activity!

=null){

activity.setResult(Activity.RESULT_OK);

activity.finish();

}

return;

}

}

privatevoidupdateAccessPoints(){

//Safeguardfromsomedelayedeventhandling

if(getActivity()==null)return;

finalintwifiState=mWifiManager.getWifiState();

switch(wifiState){

caseWifiManager.WIFI_STATE_ENABLED:

//所有接入点的结合

finalCollectionaccessPoints=constructAccessPoints();

if(accessPoints.size()==0){

addMessagePreference(R.string.wifi_empty_list_wifi_on);

}

if(!

mExt.isCatogoryExist()){

for(AccessPointaccessPoint:

accessPoints){

getPreferenceScreen().addPreference(accessPoint);

}

}

break;

 

2.查找并添加AP

成功开启WIFI,即getWifiState()返回为WIFI_STATE_ENABLED时首先会调用constructAccessPoints(),在constructAccessPoints()这个方法中调用mWifiManager.getConfiguredNetworks()与mWifiManager.getScanResults()来分别获取已保存与可用的WI

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2