Jelly Bean Wifi研究(1)

近来无事,研究下Jelly Bean Wifi的工作流程。

1. 首先是打开wifi流程

packages/apps/Settings/src/com/android/settings/Settings.java里面会持有一个WifiEnabler.java对象, 当用户点击wifi的switch控件时,会调用mWifiEnabler.setSwitch(holder.switch_),然后去WifiEnabler里面看看。

102和104这两行是控制wifi的switch控件UI的。

真正去打开wifi需要看这里:onCheckedChanged(...)

首先判断statte machine event的状态,假如你已经点mStateMachineEvent貌似一直为false。没关系。

然后去检查在Airplane mode 下支不支持打开wifi(114行),Jelly Bean(4.1)源码是支持的哦。

如果wifi ap打开,则关掉(121~125行)

准备工作都做好了。最后干正事:打开wifi(126行)


经WifiManager调用WifiService里的setWifiEnabled方法,其调用的是WifiStateMachine里面的setWifiEnabled方法 { 这里需要继续往下跟,对应到wifi.c里面的int wifi_wait_for_event(char *buf, size_t buflen) }

WifiStateMachine里面的setWifiEnabled方法会去发消息,sendMessage将包含CMD_LOAD_DRIVER 和 WIFI_STATE_ENABLING参数的message放入消息队列。将在handleMessage中接收(知晓StateMachine机制,再看这个就不难了)

具体执行时在,DriverUnloadingState这个内部类里面mWifiNative.loadDriver()。

去看看本地方法吧:

public native static boolean loadDriver();

就这么简单一行。哈哈,接着要看JNI了。frameworks/base/core/jni/android_net_wifi_Wifi.cpp

请看这一行:{ "loadDriver", "()Z",  (void *)android_net_wifi_loadDriver }

对应java方法为loadDriver(), JNI里面的方法为android_net_wifi_loadDriver(), 去看看发现对应c里面的方法为wifi_load_driver(), 返回值为bool类型

static jboolean android_net_wifi_loadDriver(JNIEnv* env, jobject)
{
    return (jboolean)(::wifi_load_driver() == 0);                                                                                        
}

到这里,java层的工作已经做完了,接下来要看底层的处理了。


1.加载模块wifi_load_driver
请先阅读APPENDING的wifi HAL层接口一节。
=========================
APPENDING
=========================
1.wifi HAL层接口
定义在android/hardware/libhardware_legacy/include/hardware_legacy/wifi.h文件中,里面有HAL层接口的详细讲解。
函数的具体功能实现在android/hardware/libhardware_legacy/wifi/wifi.c
此处的接口主要用于跟wpa_supplicant通信的。对于wifi控制流的信息,必须经过wpa_supplicant。对于数据流,一般采用经典的TCP/IP模型。
2.wpa_supplicant的作用
对于无线网络安全中,分出两个对象supplicant(恳请者)和authenticator(认证者) 。我们使用的就是包含wpa加密协议的supplicant,此处的supplicant是一个守护进程。
supplicant主要负责管理加密和网络链接的,更确切的说,是链路层的链接建立。所以,我们调试时,一般都会遇到这类型的问题。
你也可以关注一下supplicant和authenticator之间的四路握手协议。在我发给你的<链路层.pdf>里面有详细介绍。
3.cfg80211与nl80211协议
是一套配合使用的协议。用于wlan设备的supplicant和内核层的通信。supplicant层使用nl80211协议对功能和数据进行封装,底层驱动使用cfg80211协议封装获得上层的数据。而者协议的通信是使用netlink机制的(socket的一种,主要用于linux的内核与userspace之间的通信的)。


回到java层,如果driver load成功, 会通知StateMachine去改变状态

把状态改为loaded


loaded成功之后状态机就不需要做什么了, 这里只打了个log


继续往下走!

回顾WifiStateMachine里面setWifiEnabled方法

看第845行,CMD_START_SUPPLICANT这个消息的处理时在DriverLoadedState这个类里面处理的。


它将会做一系列操作,我们其中就包括

WifiNative.startSupplicant()
mWifiMonitor.startMonitoring();

第2383,2385行。

先看下2385行mWifiMonitor.startMonitoring()

它将开启一个线程去监听wifi的event,什么都不说了直接贴代码(部分), event来源WifiNative.waitForEvent()。{ 这里需要继续往下跟,对应到wifi.c里面的int wifi_wait_for_event(char *buf, size_t buflen) }








  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值