Chinaunix首页 | 论坛 | 博客
  • 博客访问: 702196
  • 博文数量: 152
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1793
  • 用 户 组: 普通用户
  • 注册时间: 2013-09-12 12:26
个人简介

相信自己,只有不想做的,没有做不到的。

文章分类

全部博文(152)

文章存档

2021年(1)

2015年(2)

2014年(74)

2013年(75)

分类: Android平台

2014-09-13 22:47:48

wifi

的层次结构

 

wifi

分为以下几个层次:

  

1.

 

wifi setting

UI

界面

 

2.

 

wifi framework 

3.

 

wifi 

硬件抽象层

 

4.

 

wifi 

服务层

 

5.

 

wifi

驱动层

 

编辑

 

wifi setting 

wifi

ui

界面主要在如下的目录中:

packages\apps\Settings\src\com\android\settings\wifi.  

?

 

WifiSettings.java

负责显示

wifi

的设置界面。

 

?

 

WifiEnabler.java

主要是

wifi

的开关逻辑

 

?

 

WifiDialog.java

负责

wifi

的对话框显示

 

?

 

AdvancedSettings.java

负责

wifi

的高级选项的显示

 

?

 

AccessPoint.java

表示一个

ap

所有属性的一个类

 

?

 

WifiInfo.java

主要是

wifi

的一些配置信息,列如鉴权方式,密码,

ssid

 

wifi

界面的编译输出是在

settings.apk

中。为什么要说每层的编译输出结果

呢,因为在调试中,你可能只是修改了某一层的某几个文件而已,这时候,你没

必要重新编译整个文件系统,而只要编译这一层对应的输出,然后通过

adb

或其

他的途径替换原有的包,再重起目标板,就可以生效了。

  

编辑

 

wifi framework 

wifi

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

由于这一层的修改要编译整个

framework 

services

,所以编译时间长,调试

花费时间长。但理论上,可以只编译修改的类,然后替换

framework.jar

services.jar

对应的类即可。该过程可以通过

java

perl

脚本来实现,可以

大大节省编译的时间,加快调试的进度,好言归正传!

  

wifiManager.java

是通过

ibinder

调用到

wifiservice.java

的,

wifiManager.java

只是封装了一些供

sdk

开发用的

api

接口,如果要了解当前

sdk

关于

wifi

相关的

api

,可以查看

android

文件系统的

current.xml

文件,

wifiManager.java

现实的主要功能都是在

wifiservice.java

中实现的,所以

wifisercie.java

是我们研究

wifi

的主要对象。

  

wifiservice.java

主要是执行一些

wifi

的命令,如扫描,连接

ap

,断开

ap

等,

更详细的就没必要说了,看代码。但需要知道,这个类主要就是用来执行

wifi

的命令的,

wifi

是有两条路的,一条是执行命令的路径,一条是接口事件的路

径。而

wifiservice.java

正是用来执行命令的。

  

wifiMonitor.java

就是用来接收服务层上来的事件的,例如:断开,连接,

有扫描结果等事件,也就是刚说的

wifi

的另一条路径。

  

android_net_wifi_wifi.cpp

就是典型

jni

接口了

通过它来直接调用到

wifi

的硬件抽象层。

  

编辑

 

wifi 

硬件抽象层

 

wifi

的硬件抽象层就是:

hardware/libharedware_legacy/wifi/wifi.c

,该层

居于

wifi framework

wifi wpa_supplicant

服务层之间,起着承上启下的作

用,具体是:

android_net_wifi_wifi.cpp

中的大部分接口都是直接有

wifi.c

文件来实现,该文件通过

socket

接口来跟

wifi

服务层来通讯。

  

编辑

 

wifi 

服务层

 

wifi

的服务层就是

wpa_supplicant

层,该层是

wifi framework

层的基石,该

层与上层的

wifi.c

通过

socket

通讯方式来实现控制接口

同样也是通过

socket

通讯方式实现了事件接口,控制接口对应用于

wifiservice.java

的命令的发

送;而事件接口对应用

wifimonitor.java

的事件的接收。从而实现了命令和事

件两条通路。

  

该层的代码路径是:

external/wpa_supplicant/

目录下。

  

wpa_supplicant

的功能很强大,在目前的

android

机器里,

wifi

除了传输应用

数据不会经过

wpa_supplicant

这一层以外,其他上层所有相关的功能都会间接

的调用的

wpa_supplicant

这一层。譬如:点击扫描按钮,连接

ap

,断开

ap

,信

号强度的动态改变,获取扫描结果,鉴权,等等都是要通过

wpa_supplicant

执行实际的功能。

  

而这一层跟

wifi

的驱动就典型的

socket

系统调用了

大家都知道使用

socket

得指定所使用的协议族,在这里,

PF_INET

协议就是我们通用的

tcp/ip

协议;

PF_NETLINK

协议族是用于

wpa_supplicant

获取内核上来的事件的;而

PF_PACKET

协议族是说用于接收基于链路层上的裸数据的,该协议主要用来做鉴

权的,诸如

wpa

wpa2

wapi

等。

  

编辑

 

wifi

驱动层

 

该层是在内核目录下,有两种存在形式,一个是模块驱动方式,此时代码就可能

不在内核里,一种是内核内建(

buit-in

)方式,就是包含在内核里,

linux

核已经支持了很多的

wifi

网卡的驱动。通常在目录内核根目录:

drivers\net\wireless

下面。

  

wifi

驱动从某种意义上将可以分为两种:一种是硬件

mac

,就是

mac

协议由硬件

实现,当然省时又省力了。另一种是软

mac

,就是由软件来实现

mac

,软件复杂

些,但可以节省硬件成本。软

mac

linux

下的目录如下:

net/mac80211

  

wifi

从硬件接口上将,分为

sdio

接口,

usb

接口,

pcmcia

接口。目前嵌入式上

主流是

sdio

接口和

usb

接口

分别需要硬件资源有

sdio

控制器和

usb

主控制器

及相应的驱动的支持。

  

wifi

驱动架构遵循一般的网络设备驱动模型的架构,当然又不同于一般的有线

网络驱动模型。具体的鉴于篇幅在这里就不详细讨论了,因为这一篇是讨论架构

的,不拘泥于细节的。

  

最后:讲了这么多层次结构,怎么样把他们串起来呢?这个要留给读者了,但我

可以给你一个不坏的建议

(如果你不能提供更好的建议的话)

:你可以在手机上

点击扫描操作,看扫描命令时怎么样发送下去,直止驱动里是怎么驱动的,而后

wifi

网卡接收到驱动里的扫描命令后,开始努力的扫描,扫描完后,如果有扫

描结果,会通过事件又是怎么样将扫描结果上传给

wifi

上层并显示出来的。

阅读(1003) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~