Android settings之Wifi学习.docx
- 文档编号:2533088
- 上传时间:2023-05-03
- 格式:DOCX
- 页数:20
- 大小:97.39KB
Android settings之Wifi学习.docx
《Android settings之Wifi学习.docx》由会员分享,可在线阅读,更多相关《Android settings之Wifi学习.docx(20页珍藏版)》请在冰点文库上搜索。
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”>
android: name=“android.permission.ACCESS_NETWORK_STATE”>
android: name=“android.permission.ACCESS_WIFI_STATE”>
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:
//所有接入点的结合
finalCollection
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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Android settings之Wifi学习 settings Wifi 学习