您的位置:首页 > 大数据 > 人工智能

4wpa_supplicant适配层 -- 详解 http://blog.csdn.net/wh_19910525/article/details/7392390

2012-12-04 11:48 447 查看





适配层是 通用的wpa_supplicant的 封装,在Android中 作为 WiFi部分的
硬件抽象层
来使用。wpa_supplicant适配层 主要用于 与wpa_supplicant守护进程 的通信,以提供给Android框架使用,它实现了 加载、控制 和 消息监控等功能。

1、当java层调用 loadDriver时, 它实际上是通过JNI来调用Native函数, JNI->android_net_wifi_loadDriver -> wifi_load_driver。

在wifi_load_driver函数中,它将首先通过system property -- wlan.driver.status 的状态来判断驱动是否已经加载。如果没有加载,将会加载该驱动

2、当java层调用startSupplicant时,它实际上是通过JNI调用到wifi_start_supplicant函数,在wifi_start_supplicant函数里,首先确定wpa supplicant的配置文件存在,如果不存在,将默认配置文件拷贝到相应目录下,下面是配置文件的默认路径和工作路径:

static const char SUPP_CONFIG_TEMPLATE[]= "/system/etc/wifi/wpa_supplicant.conf";

static const char SUPP_CONFIG_FILE[] = "/data/misc/wifi/wpa_supplicant.conf";

然后,调用control_supplicant函数, 如果这时wpa_supplicant还没有启动, 将会启动wpa_supplicant.

hardware/libhardware_legacy/wifi/wifi.c------------------------>wpa_supplicant适配器层

int wifi_load_driver(){

//for build in driver, do nothing

//for .ko driver, insmod/load firmware...

}

int wifi_start_supplicant(){

property_set("ctl.start", "wpa_supplicant");

}

//适配层的构成非常的简单,除了一些加载 和 连接 的接口,它最重要的部分是以下两个接口:

//int wifi_command(const char *command, char *reply, size_t *reply_len);

//int wifi_wait_for_event(char *buf, size_t len);

//wifi_command()发送命令给wpa_supplicant进程,并返回结果

//wifi_wait_for_event()接受wpa_supplicant上报的事件


-->

root/init.rc

service wpa_supplicant /system/bin/wpa_supplicant -Dwext -iwlan0 -d -c /data/misc/wifi/wpa_supplicant.conf-------------------->启动 wpa_supplicant程序

socket wpa_wlan0 dgram 0666 wifi wifi

group system wifi

disabled

oneshot

3、 java层通过connectToSupplicant调用wifi_connect_to_supplicant函数,在该函数中,将通过wpa_ctrl_open函数分别创建 两个AF_UNIX地址族 和 数据报方式的socket,一个是ctrl_conn, 用于向wpa_supplicant发送命令并接收response, 另一个是monitor_conn, 它一直阻塞等待从wpa_supplicant过来的event。最后,通过monitor_conn向wpa_supplicant发送命令ATTACH,用于将自己的socket信息注册到wpa_supplicant,
由于socket是数据报方式的,这一步是必须的,对于存在于wpa_supplicant的服务器端,它是所有客户端共享的,由于它需要主动向monitor_conn客户端发送事件,所以它必须先记录下该客户端的详细信息,wpa_supplicant就可以将EVENT发向该socket。在完成上面这些操作后,java层会通过jni方式调用函数android_net_wifi_waitForEvent(应该是起一个线程,在线程里调用),该函数会调用wifi_wait_for_event,在wifi_wait_for_event函数里,会阻塞接收从wpa_supplicant模块传来的事件,一旦wpa_supplicant模块有事件发,wifi_wait_for_event接收到后,会将包含事件的buf通过函数参数的方式回传到java层,java收到事件后,再继续调用wifi_wait_for_event函数进行阻塞等待接收,从而完成一个循环。

4. 以上的流程完成以后,WIFI java layer 调用的WIFI native api 就和wpa_supplicant进程就建立了联系,WIFI java layer就可以向wpa_supplicant发送命令和接收response, 并且wpa_supplicant也可以主动向WIFI java layer发送事件了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐