Chinaunix首页 | 论坛 | 博客
  • 博客访问: 300848
  • 博文数量: 43
  • 博客积分: 2071
  • 博客等级: 大尉
  • 技术积分: 488
  • 用 户 组: 普通用户
  • 注册时间: 2009-08-25 17:48
文章分类

全部博文(43)

文章存档

2014年(5)

2013年(4)

2011年(9)

2010年(8)

2009年(17)

我的朋友

分类: 系统运维

2009-08-28 13:41:07

1. WIFI JAVA layer:
1.1. 当android系统启动WIFI 模块时, 它将调用 Wifiserver 类的setWifiEnabledBlocking函数。
1.2. 在该函数中,如果是使能WIFI, 它将做四件事:
    a. load wifi driver.
    b. 启动wpa_supplicant.
    c. 启动 event loop.
    d. 更新wifi的状态.

2. WIFI Native layer:
2.1. 当java层调用 loadDriver时, 它实际上是通过JNI来调用Native函数, JNI->android_net_wifi_loadDriver -> wifi_load_driver。
在wifi_load_driver函数中,它将首先通过system property -- wlan.driver.status 的状态来判断驱动是否已经加载。如果没有加载,将会加载该驱动。

2.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.

2.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函数进行阻塞等待接收,从而完成一个循环。

2.4. 以上的流程完成以后,WIFI java layer 调用的WIFI native api 就和wpa_supplicant进程就建立了联系,WIFI java layer就可以向wpa_supplicant发送命令和接收response, 并且wpa_supplicant也可以主动向WIFI java layer发送事件了。

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

amuhong2011-08-17 09:47:26

匿名: lz我想开机启动wifi,要怎么修改代码,新手请教,越详细越好。.....
开机启动?
如果你开启wifi后,再重启手机,那么wifi会被自动启动的啊。
实际上,这个启动状态是保存在下面的数据库文件中的。
/data/data/com.android.providers.settings/databases/settings.db

2011-08-16 18:27:01

lz我想开机启动wifi,要怎么修改代码,新手请教,越详细越好。

chinaunix网友2011-01-29 16:44:44

您好: 请教您一个问题,我现在在开机时,一直停留在开机画面。而用adb打出来的log,显示wifi module在不停的循环加载(driver),我现在找不到什么原因导致的。您有什么好的建议嘛?

amuhong2011-01-06 12:28:37

你可以手工插入驱动试试,如果手工的插入都有问题,那肯定是驱动问题,如果手工插入没有问题,你可以比较一下手工插入和程序插入的区别

chinaunix网友2010-12-22 20:11:21

请教一下,当出错时ADB出现了如下代码 E/WifiHW ( 3078): return of insmod (args:firmware_path=/system/etc/wifi/bcm4329 _sta.bin nvram_path=/system/etc/wifi/nvram_net.txt Desire HD_watchdog_ms=10 Desire HD_poll=1 ) : ret = -1, Invalid argument 请问是否就是该wifi驱动出现了问题呢?