郭大侠
guo443193911
相信自己,只有不想做的,没有做不到的。
全部博文(152)
2021年(1)
2015年(2)
2014年(74)
2013年(75)
hushup
雨碎江南
yangheng
huaye201
襄阳居士
cr858923
暗夜linu
lsw20088
Linux_小
heysd2
km康蒙92
Kilento
llIUNIU
Zjuanjua
zqqq
孤独键客
cpu0018
taurusty
分类: Android平台
2014-09-13 22:47:48
wifi
的层次结构
分为以下几个层次:
1.
wifi setting
,
UI
界面
2.
wifi framework
3.
硬件抽象层
4.
服务层
5.
驱动层
编辑
的
ui
界面主要在如下的目录中:
packages\apps\Settings\src\com\android\settings\wifi.
?
WifiSettings.java
负责显示
的设置界面。
WifiEnabler.java
主要是
的开关逻辑
WifiDialog.java
负责
的对话框显示
AdvancedSettings.java
的高级选项的显示
AccessPoint.java
表示一个
ap
所有属性的一个类
WifiInfo.java
的一些配置信息,列如鉴权方式,密码,
ssid
等
界面的编译输出是在
settings.apk
中。为什么要说每层的编译输出结果
呢,因为在调试中,你可能只是修改了某一层的某几个文件而已,这时候,你没
必要重新编译整个文件系统,而只要编译这一层对应的输出,然后通过
adb
或其
他的途径替换原有的包,再重起目标板,就可以生效了。
framework
主要有如下几个类:
framework/base/wifi/java/android/net/wifi/wifiManager.java
framework/base/services/java/com/android/wifiService.java
framework/base/wifi/java/android/net/wifi/wifiMonitor.java
framework/base/core/jni/android_net_wifi_wifi.cpp
他们的编译输出主要有两个类
:
一个
framework.jar
,另一个是
services.jar
由于这一层的修改要编译整个
或
services
,所以编译时间长,调试
花费时间长。但理论上,可以只编译修改的类,然后替换
对应的类即可。该过程可以通过
java
perl
脚本来实现,可以
大大节省编译的时间,加快调试的进度,好言归正传!
wifiManager.java
是通过
ibinder
调用到
wifiservice.java
的,
只是封装了一些供
sdk
开发用的
api
接口,如果要了解当前
关于
相关的
,可以查看
android
文件系统的
current.xml
文件,
现实的主要功能都是在
中实现的,所以
wifisercie.java
是我们研究
的主要对象。
主要是执行一些
的命令,如扫描,连接
,断开
等,
更详细的就没必要说了,看代码。但需要知道,这个类主要就是用来执行
的命令的,
是有两条路的,一条是执行命令的路径,一条是接口事件的路
径。而
正是用来执行命令的。
而
wifiMonitor.java
就是用来接收服务层上来的事件的,例如:断开,连接,
有扫描结果等事件,也就是刚说的
的另一条路径。
android_net_wifi_wifi.cpp
就是典型
jni
接口了
通过它来直接调用到
的硬件抽象层。
的硬件抽象层就是:
hardware/libharedware_legacy/wifi/wifi.c
,该层
居于
与
wifi wpa_supplicant
服务层之间,起着承上启下的作
用,具体是:
中的大部分接口都是直接有
wifi.c
文件来实现,该文件通过
socket
接口来跟
服务层来通讯。
的服务层就是
wpa_supplicant
层,该层是
层的基石,该
层与上层的
通过
通讯方式来实现控制接口
同样也是通过
通讯方式实现了事件接口,控制接口对应用于
的命令的发
送;而事件接口对应用
wifimonitor.java
的事件的接收。从而实现了命令和事
件两条通路。
该层的代码路径是:
external/wpa_supplicant/
目录下。
的功能很强大,在目前的
机器里,
除了传输应用
数据不会经过
这一层以外,其他上层所有相关的功能都会间接
的调用的
这一层。譬如:点击扫描按钮,连接
,信
号强度的动态改变,获取扫描结果,鉴权,等等都是要通过
来
执行实际的功能。
而这一层跟
的驱动就典型的
系统调用了
大家都知道使用
得指定所使用的协议族,在这里,
PF_INET
协议就是我们通用的
tcp/ip
协议;
PF_NETLINK
协议族是用于
获取内核上来的事件的;而
PF_PACKET
协议族是说用于接收基于链路层上的裸数据的,该协议主要用来做鉴
权的,诸如
wpa
wpa2
wapi
等。
该层是在内核目录下,有两种存在形式,一个是模块驱动方式,此时代码就可能
不在内核里,一种是内核内建(
buit-in
)方式,就是包含在内核里,
linux
内
核已经支持了很多的
网卡的驱动。通常在目录内核根目录:
drivers\net\wireless
下面。
驱动从某种意义上将可以分为两种:一种是硬件
mac
,就是
协议由硬件
实现,当然省时又省力了。另一种是软
,就是由软件来实现
,软件复杂
些,但可以节省硬件成本。软
在
下的目录如下:
net/mac80211
。
从硬件接口上将,分为
sdio
接口,
usb
pcmcia
接口。目前嵌入式上
主流是
接口和
接口
分别需要硬件资源有
控制器和
主控制器
及相应的驱动的支持。
驱动架构遵循一般的网络设备驱动模型的架构,当然又不同于一般的有线
网络驱动模型。具体的鉴于篇幅在这里就不详细讨论了,因为这一篇是讨论架构
的,不拘泥于细节的。
最后:讲了这么多层次结构,怎么样把他们串起来呢?这个要留给读者了,但我
可以给你一个不坏的建议
(如果你不能提供更好的建议的话)
:你可以在手机上
点击扫描操作,看扫描命令时怎么样发送下去,直止驱动里是怎么驱动的,而后
网卡接收到驱动里的扫描命令后,开始努力的扫描,扫描完后,如果有扫
描结果,会通过事件又是怎么样将扫描结果上传给
上层并显示出来的。
上一篇:OMAP4 pandaboard上CPU hotplug进程迁移与负载均衡测试
下一篇:WiFi子系统架构
登录 注册