Android WIFI 详解
该类成员函数的也是通过调用mWifimanager的接口来实现的。
3) WifiManager:
frameworks/base/wifi/java/android/net/wifi/WifiManager.java
两个重要的数据成员:
//WifiService
IWifiManager mService;
HandlermHandler;
IWifiManager mService和HandlermHandler,这个类拥有了一个WifiService实例,就可以通过它进行一系列的调 用;WifiManager中定义了的wifi和ap的状态,这些状态会在其他很多类中有使用;然后定义了大量的函数,这些函数几乎都是对 WifiService接口函数的封装,直接调用WifiService的函数。
该类的构造函数很简单:
public WifiManager(IWifiManager service,Handler handler) {
mService = service;
mHandler = handler;
}
该 类中还定义了一个WifiLock类,这个类用来保证在有应用程序使用Wifi无线电传输数据时,wifiradio可用,即当一个应用程序使用wifi 的radio进行无线电数据传输时,就要先获得这个锁,如果该锁已被其他程序占有,就要等到该锁被释放后才能获得,只用当所有持有该锁的程序都释放该锁 后,才能关闭radio功能。
4)WifiService:
frameworks/base/services/java/com/android/server/WifiService.java
private final WifiStateTrackermWifiStateTracker;
private Context mContext;
private WifiWatchdogServicemWifiWatchdogService = null;
private final WifiHandler mWifiHandler;
这是WifiService中的几个重要的数据成员。
在 接下来的构造函数中初始化了mWifiStateTracker,mContext,然后动态生成mWifiThread子线程并启动,在主线程里用 mWifiThread调用getLooper()函数获得线程的looper,来初始化创建一个mWifiHandler对象,这个 WifiHandler在WifiService类的后面有定义,并重载了Handler类的handlermessage()函数,这样消息就可以在主 线程里被处理了,这是android的handlerthread消息处理机制,可参考相关资料,这里不予详述。在构造函数的最后,注册了两个广播接收 器,分别用来ACTION_AIRPLANE_MODE_CHANGED和ACTION_TETHER_STATE_CHANGED这两个动作,这里是 android的intent消息通知机制,请参考相关资料,代码如下:
mContext = context;
mWifiStateTracker = tracker;
mWifiStateTracker.enableRssiPolling(true);
……
HandlerThread wifiThread = newHandlerThread(WifiService);
wifiThread.start();
mWifiHandler = newWifiHandler(wifiThread.getLooper());
……
随 后定义了一系列的函数,其中有服务器要发送的命令的系列函数,它通过mWifiStateTracker成员类调用自己的的发送命令的接口(其实就是对本 地接口的一个封装),最后通过适配层发送命令给wpa_supplicant,而事件处理只到WifiStateTracker层被处理。
要 注意的是,在WifiService中,定义了一些函数来创建消息,并通过mWifiHandler将消息发送到消息队列上,然后在 mHandlerThread线程体run()分发处理消息,在主线程中被mWifiHandler的handlerMessage()函数处理,最后 调用mWifiStateTracker的对应函数来实现的。这里我也不明白为什么WifiService不直接调用mWifiStateTracker 对应的函数,还要通过消息处理机制,绕了一圈在调用,当然Google这么做肯定是有它道理的,忘高手指点。
5) WifiStateTracker类:
frameworks/base/wifi/java/android/net/wifi/WifiStateTracker.java
NetworkStateTracker继承了handler类,而WifiStateTracker继承了NetworkStateTracker类,就是说WifiStateTracker间接继承了handler类,属于一个事件处理类。
WifiStateTracker类首先定义了事件日志和事件码(这里包含了所有可能的事件类型),还定义了如下的重要成员数据:
//几个重要的数据成员
private WifiMonitor mWifiMonitor; //被启动用来监听supplicant传来的消息
private WifiInfo mWifiInfo;
private WifiManager mWM; //服务代理
private DhcpHandler mDhcpTarget; //IP地址获取线程
private DhcpInfo mDhcpInfo; //Dhcp的相关信息都在这里
类的构造函数中,初始化了系列成员变量,包括生成了WifiMonitor的实例,在构造函数中,因为WifiStateTracker是一个handler间接子类,所以他会自动调用handler的无参构造函数,获得looper和Queue消息队列。
然后定义了一些设置supplicant和更新网络信息的辅助函数。
startEventLoop()函数很重要,用来启动WifiMonitor线程,进入消息循环检测。接着定义了系列通知函数,被 WifiMonitor调用来向WifiStateTracker传递从wpa_supplicant接收到的消息,他会调用消息发送函数到消息队列,并 被WifiStateTracker的handlermessage()函数处理。这个handlermessage()函数就是在随后被定义的,它主要 是调用相应的辅助函数完成动作,并可能会将消息封装后,通过intent机制发送出去,被上层的UI活动接收处理。
这 里也定义了很多的WfiNative接口函数,这是JNI的本地接口;类DhcpHandler extends Handler{}也是在该类中定义的,它也是一个handler的子类,用来处理DHCP相关的消息EVENT_DHCP_START,可以想到它和 WifiStateTracker不是共用一个looper。
注意:handleMessage是在该文件中定义的,用来处理经WifiMonitor转换过的消息。
6) WifiMonitor
frameworks/base/wifi/java/android/net/wifi/WifiMonitor.java
声明了一个重要的成员变量:mWifiStateTracker,并在构造函数中由参数提供初始化,还定义了一系列的可能从wpa_supplicant层接收的事件类型及其名字,这些是消息处理机制的基础。
startMonitoring()函数,这是一个线程启动的封装函数,WifiStateTracker就是通过这个函数启动的WifiThread。
这 个重要的类classMonitorThreadextends Thread{};它是一个监控进程类,里面有一系列的事件处理函数和一个重要的Run()函数,run函数主要流 程:connectToSupplicant()连接精灵进程wpa_supplicant,这里有一个 mWifiStateTracker.notifySupplicantXXX()的调用,通知上层是否连接成功,然后就是一个轮询过程,其中调用了 WifiNative.waitForEvent()本地轮询函数接口,并从返回的事件字符串类型中提取事件的名称,最后通过事件的名称调用相应的事件处 理函数,并将事件转换成mWifiStateTracker能识别的类型上报。
评论