Android WIFI 详解
最 近研究Wifi模块,查了不少的相关资料,但发现基本上是基于android2.0版本的的分析,而现在研发的android移动平台基本上都是2.3的 版本,跟2.0版本的差别,在Wifi模块上也是显而易见的。2.3版本Wifi模块没有了WifiLayer,之前的WifiLayer主要负责一些复 杂的Wifi功能,如AP选择等以提供给用户自定义,而新的版本里面的这块内容基本上被WifiSettings所代替。
本文引用地址:https://www.eepw.com.cn/article/201610/305545.htm本文就是基于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函数的参数中可以看出。
评论