android4.0.3源码之wifi的简单分析(转)


关于wifi应用层的接口的调用

        首先从上层android wifi的应用开始,首先会根据android的wifimanager的类,实例化一个mwifimanager的对象,这个对象处理了所有wifi需要处理的任务,接着比如说打开wifi,那么就会调用 mWifiManager.isWifiEnabled();判断wifi是否已经打开,如果没有打开,那么就会调用mWifiManager.setWifiEnabled(true);来打开wifi了。这里会调用到wifiservice的方法,就是设置wifi使能,mService.setWifiEnabled。然后该函数会继续调用wifi的状态机中的设置使能的方法mWifiStateMachine.setWifiEnabled,而在wifi状态机中,这个方法主要是往这个状态机中发了两条消息,CMD_LOAD_DRIVER,和CMD_START_SUPPLICANT。看其意思就可以知道是加载驱动和启动wpa_supplicant了。剩下就是wifi状态机里做的事情了,这个下面分析。还有其他的比如关闭wifi啊,扫描啊,连接网络啊,断开网络啊等等可以看下面的简单的流程图。具体的实现可以跟踪代码,就不一一介绍了。

 

 

关于wifi的framework层状态机

Wifi framework层的主要的状态机可以参见下面的图了。

 

       这里主要还是介绍下wifistatemachine的一些主要状态机的实现吧。

       初始状态是initial,所以一开始执行initial的enter(),由于我们平台中,我移植的时候是wifi的驱动编译进内核的,所以WifiNative.isDriverLoaded()函数必须是true的。接着状态就转换为transitionTo(mDriverLoadedState)。

驱动加载的状态了。在这里的processMessage就会处理消息了。结合上面APP在开启wifi的时候发送的消息,CMD_START_SUPPLICANT,所以这里会处理开启wpa_supplicant。接着会下载firmware

mNwService.wifiFirmwareReload(mInterfaceName,"STA");因为我们wifi驱动的firmware是驱动内部实现的,所以这里就不管他了。然后在WifiNative.startSupplicant();这里调用了hal层的,开启wpa_supplicant,具体下面分析。然后是mWifiMonitor.startMonitoring();开启一个monitor,主要还是处理wpa_supplicant往上报的事件的。接着,状态又转换了,就是

transitionTo(mSupplicantStartingState);

SupplicantStartingState状态了,这里如果wpa_supplicant启动成功的话,monitor那里上报一个WifiMonitor.SUP_CONNECTION_EVENT,接着就转换状态了,也就是transitionTo(mDriverStartedState);具体如下:

case WifiMonitor.SUP_CONNECTION_EVENT:

                    if (DBG)log("Supplicant connection established");

                   setWifiState(WIFI_STATE_ENABLED);

                    mSupplicantRestartCount =0;

                    /* Reset the supplicantstate to indicate the supplicant

                     * state is not known atthis time */

                   mSupplicantStateTracker.sendMessage(CMD_RESET_SUPPLICANT_STATE);

                   mWpsStateMachine.sendMessage(CMD_RESET_WPS_STATE);

                    /* Initialize datastructures */

                    mLastBssid = null;

                    mLastNetworkId =WifiConfiguration.INVALID_NETWORK_ID;

                    mLastSignalLevel = -1;

 

                   mWifiInfo.setMacAddress(WifiNative.getMacAddressCommand());

 

                    WifiConfigStore.initialize(mContext);

 

                   sendSupplicantConnectionChangedBroadcast(true);

                   transitionTo(mDriverStartedState);

 

这里在DriverStartedState状态下了。这里又做了很多处理:其中有一个CMD_START_SCAN,就是开始扫描。

对于状态机,下面画了大部分的状态图。


关于wifi的jni层

       Jni层主要是封装了很多的接口,可以让上层的JAVA代码来调用hal层的c或者c++代码。这里他把命令和一些控制都封装好了。其主要接口可以看下图。

 

关于wifi的hal层

Wifi的hal层主要就是上层jni会调用到wpa_supplicant的,具体如下图所示。

 

关于wpa_supplicant的总工作流程

 

 

关于wpa_supplicant的socket与hal通信的流程

 

       以上主要是以流程结合图形文字的方式简单的介绍了android的整个wifi的机制。具体可以结合代码分析。因为网上已经有很多的说明了,这里也不会太过分析。

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值