最 近研讨Wifi模块,查了不少的相关材料,但发现基本上是依据android2.0版别的的剖析,而现在研制的android移动渠道基本上都是2.3的 版别,跟2.0版别的不同,在Wifi模块上也是清楚明了的。2.3版别Wifi模块没有了WifiLayer,之前的WifiLayer首要担任一些复 杂的Wifi功用,如AP挑选等以提供给用户自界说,而新的版别里边的这块内容基本上被WifiSettings所替代。
本文便是依据android2.3版别的Wifi剖析,首要分为两部分来别离阐明:
(1) Wifi模块相关文件的解析
(2) Wpa_supplicant解析
(3) Wifi的发动流程(有代码供参阅剖析)
一,Wifi模块相关文件解析
1) wifisettings.java
packages/apps/Settings/src/com/android/settings/wifiwifisettings.java
该类数据部分首要界说了下面几个类的变量:
{
private final IntentFilter mFilter;
//播送接纳器,用来接纳音讯并做呼应的处理作业
privatefinal BroadcastReceiver mReceiver;
//这是一个扫描类,会在用户手动扫描 AP时被调用
privatefinal Scanner mScanner;
private WifiInfo mLastInfo;
//服务署理端,作为WifiService对外的接口类出现
privateWifiManager mWifiManager;
//这个类首要完成Wifi的开闭作业
privateWifiEnabler mWifiEnabler;
//AP
private AccessPoint mSelected;
private WifiDialog mDialog;
……
}
wifiSettings类的结构函数的首要作业:界说了一个IntentFilter(Intent过滤器)变量,并增加了六个动作,(了解 Android的intent机制的同学都知道什么意思,不明白的同学参阅Intent机制的材料)接着界说一个播送接纳器,并有相应的音讯处理函数,下 面是该结构函数的界说:
public WifiSettings() {
mFilter = new IntentFilter();
//intent机制中的intent音讯过滤器,下面增加能够处理的动作
mFilter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
mFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);
mFilter.addAction(WifiManager.NETWORK_IDS_CHANGED_ACTION);
mFilter.addAction(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION);
mFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
mFilter.addAction(WifiManager.RSSI_CHANGED_ACTION);
//注册了播送接纳器,用来处理接纳到的音讯事情
mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context,Intent intent) {
handleEvent(intent); //事情处理函数
}
};
mScanner= new Scanner(); //手动扫描类
}
在播送接纳器中的相应函数onReceive函数中有个handleEvent函数,它便是用来处理播送接纳器承受到的intent音讯的,它的功用是根 据intent音讯中的动作类型,来履行相应的操作,每一种动作对应了activity的一项音讯处理才能。
在oncreate函数中实例化了mWifiManager和mWifiEnabler两个类,这两个类对wifiSettings来说至关重要,它后边的界说的一系列函数都是经过调用这两个类的相应接口来完成的。
……
mWifiManager = (WifiManager)getSystemService(Context.WIFI_SERVICE);
mWifiEnabler = new WifiEnabler(this,
(CheckBoxPreference) findPreference(enable_wifi));
……
WifiSettings中还界说了显现菜单和呼应菜单键的函数,即onCreateOptionsMenu()和 onOptionsItemSelected();还有呼应装备对话框中按键的onClick()函数;最终界说了Scanner类,它是一个 handler的承继类,完成了音讯处理函数,用于处理手动扫描的动作。
2) WifiEnabler.java:
packages/apps/Settings/src/com/android/settings/wifi/WifiEnabler.java
private final Context mContext;
private final CheckBoxPreference mCheckBox;
//两个重要成员
private final WifiManager mWifiManager;
private final IntentFilter mIntentFilter;
wifienabler类中界说了四个成员变量很重要,mContext,mCheckBox,mWifiManager和mReceiver,其间 mContext用于获取mwifiManager实例,mReceiver用来接纳底层发来的音讯,mCheckBox用来改动UI的状况。
该 类中界说了几个重要的函数onPreferenceChange,handleWifiStateChanged和 handleStateChanged,onPreferenceChange用来处理按下的Enbler键,它会调用 mWifiManager.setWifiEnabled(enable),别的两个用来处理承受的音讯事情。
在类的结构函数中,首要做了一下作业:初始化了mContext,mCheckBox,mWifimanager,而且初始化了一个 mIntentFilter变量,增加了三个动作,在结构函数的上面界说了一个播送接纳器,用来接纳基层传来的音讯,并依据intent动作的类型调用相 应的处理函数,这个播送接纳器在onResum函数中被注册。
public WifiEnabler(Context context, CheckBoxPreferencecheckBox) {
mContext= context;
mCheckBox = checkBox;
mOriginalSummary = checkBox.getSummary();
checkBox.setPersistent(false);
mWifiManager = (WifiManager)context.getSystemService(Context.WIFI_SERVICE);
mIntentFilter= new IntentFilter(WifiManager.WIFI_STATE_CHANGED_ACTION);
// Theorder matters! We really should not depend on this. 🙁
mIntentFilter.addAction(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION);
mIntentFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
}
这 里能够总结为:假如上层需求监听或收到基层的音讯,那么就要经过界说一个BroadcastReciever,并将它注册,当然在承受到音讯后应该有处理 音讯的函数,然后在onReciever函数中依据音讯调用相应的处理函数,这儿的音讯告诉机制是Intent,在BroadcastReciever类 的onReciever函数的参数中能够看出。