一、WIFI的基本架构(代码路径)


1、WIFI Settings应用程序:
packages/apps/Settings/src/com/android/settings/wifi/
2、JAVA部分(framework):
frameworks/base/services/java/com/android/server/
frameworks/base/wifi/java/android/net/wifi/
3、JNI部分:
frameworks/base/core/jni/android_net_wifi_Wifi.cpp
4、wpa_supplicant的适配器 部分 hardware/libhardware_legary/wifi/主要是wifi.c。 5、wifi用户空间的程序和库:
external/wpa_supplicant/ 和 external/wap_supplicant_6/我不清楚是哪一个目录
生成库libwpaclient.so和守护进程wpa_supplicant。
6、kernel 驱动
二、WIFI在Android中如何工作 Android使用一个修改版wpa_supplicant作为daemon来控制WIFI,代码位于 external/wpa_supplicant。wpa_supplicant是通过socket与 hardware/libhardware_legacy/wifi/wifi.c通信。UI(APP)通过android.net.wifi package (frameworks/base/wifi/java/android/net/wifi/)发送 命令 给wifi.c。 相应的JNI实现位于frameworks/base/core/jni/android_net_wifi_Wifi.cpp。 更高一级的网络管理位于frameworks/base/core/java/android/net。
三、配置Android支持WIFI
*device/rootfs-project/BoardConfig.mk中添加:

WPA_SUPPLICANT_VERSION := VER_0_8_X //wpa_supplicant的版本 WIFI_DRIVER := ar6003//驱动名字(自己定义的宏),主要在hardware/平台名称/wlan/芯片名/Android.mk 文件里使用 BOARD_WPA_SUPPLICANT_PRIVATE_LIB:= lib_driver_cmd_wext
BOARD_WPA_SUPPLICANT_DRIVER :=WEXT //驱动类型,决定wap_supplicant的底层接口类型
这将使external/wpa_supplicant/Android.mk设置WPA_BUILD_SUPPLICANT为true默认使用驱动driver_wext.c
如果使用定制的wpa_supplicant驱动(例如 madwifi),可以设置:
BOARD_WPA_SUPPLICANT_DRIVER := MADWIFI

------- 如果 wifi 具有SoftAP(即虚拟无线AP)的功能,需要以下两个宏 -------

WIFI_DRIVER_FW_STA_PATH := /system/wifi/fw.bin

WIFI_DRIVER_FW_AP_PATH :=/system/wifi/fw_ap.bin

--------
/* 以下两项 可以在hardware/libhardware_legary/wifi/wifi.c 里边直接定义*/
WIFI_DRIVER_MODULE_PATH := /system/wifi/ar6000.ko //wifi 驱动路径
WIFI_DRIVER_MODULE_NAME := ar6000//驱动名字
WIFI_DRIVER_MODULE_ARG:=DBG=7 //该宏是用于insmod时传参数



四、使能wpa_supplicant调试信息 默认wpa_supplicant设置为MSG_INFO,为了输出更多信息,可修改:
1、在/external/wpa_supplicant/common.c中设置wpa_debug_level = MSG_DEBUG;
2、在common.c中把#define wpa_printf宏中的
if ((level) >= MSG_INFO)
改为
if ((level) >= MSG_DEBUG)
五、修改system/etc/wifi/wpa_supplicant.conf (在源码中是修改external/wpa_supplicant/wpa_supplicant.conf)

wpa_supplicant是通过rootfs-src/external/wpa_supplicant/wpa_supplicant.conf中的ctrl_interface=来指定控制socket的
这个路径在wifi.c中用到 一般的/external/wpa_supplicant/wpa_supplicant.conf配置为:
ctrl_interface=DIR=/data/system/wpa_supplicant GROUP=wifi
update_config=1
fast_reauth=1
eapol_version=1
有时,驱动需要增加:
ap_scan=1
如果遇到AP连接问题,需要修改ap_scan=0来让驱动连接,代替wpa_supplicant。

如果要连接到non-WPA or open wireless networks,要增加:
network={
key_mgmt=NONE
}
六、配置路径和权限 Google修改的wpa_supplicant要运行在wifi用户和组下的。代码可见/external/wpa_supplicant/os_unix.c 中的os_program_init()函数
如果配置不对,会出现下面错误:
E/WifiHW ( ): Unable to open connection to supplicanton
"/data/system/wpa_supplicant/wlan0": No such file or directory will appear.

确认init.rc中有如下配置:
mkdir /system/etc/wifi 0771 wifi wifi
chmod 0771 /system/etc/wifi
chmod 0660 /system/etc/wifi/wpa_supplicant.conf
chown wifi wifi /system/etc/wifi/wpa_supplicant.conf#wifi的原始配置文件

# wpa_supplicant socket
mkdir /data/system/wpa_supplicant 0771 wifi wifi
chmod 0771 /data/system/wpa_supplicant#放置wifiinterface的地方

#wpa_supplicant control socket for android wifi.c
mkdir /data/misc/wifi 0770 wifi wifi
mkdir /data/misc/wifi/sockets 0770 wifi wifi #与上层通过socket通信的路径
chmod 0770 /data/misc/wifi
chmod 0660 /data/misc/wifi/wpa_supplicant.conf
#wifi的配置文件,将由wpa_supplicant根据实际配置写入该文件 setprop wifi.interfaceeth0 intreface名称设置, 这在framework/base/wifi/java/android/net/wifi /WifiStateTracker.java中会用到,以处理dhcp。 ar6000.ko用eth0
目录权限的处理是为了所有用户能对下一级进行搜索,/data/misc/wifi/sockets目录不仅为wifi拥有者服务,还因为通信的原因要和其他用户联系,要不然,将会出现Unable to open connection to supplicant on "/data/system/wpa_supplicant/ra0": Connection refused,或permission denied的错误。很多人干脆将上述所有的权限都设为0777,当然也行,但总觉得有些粗糙。

七、 运行wpa_supplicant和dhcpcd

在init.rc中确保有如下语句:
service wpa_supplicant /system/bin/wpa_supplicant -Dwext -iwlan0-c /data/misc/wifi/wpa_supplicant.conf user root
groupsystem wifi
socketwpa_wlan0dgram 0666wifiwifi //这项是用于UDP连接的
disabled oneshot
servicedhcpcd /system/bin/logwrapper /system/bin/dhcpcd -d -B eth0 groupsystem dhcp
disabled
oneshot
根据所用的WIFI驱动名字,修改wlan0为自己驱动的名字

八、编译WIFI驱动为module或kernel built in
1、编译为module
在device/rootfs-project/BoardConfig.mk中添加:
WIFI_DRIVER_MODULE_PATH :=
"/system/lib/modules/ar6000.ko" //驱动的具体位置
WIFI_DRIVER_MODULE_ARG :="" #for example nohwcrypt
WIFI_DRIVER_MODULE_NAME :="ar6000"#for example wlan0
WIFI_FIRMWARE_LOADER := ""

2、编译为kernel built in
1)在hardware/libhardware_legacy/wifi/wifi.c要修改interface名字,
2)在init.rc中添加:
setprop wifi.interface "wlan0"
3)在hardware/libhardware_legacy/wifi/wifi.c中当insmod/rmmod时,
直接return 0。


九、WIFI需要的firmware
Android不使用标准的hotplug binary,WIFI需要的firmware要复制到/etc/firmware。

或者复制到WIFI驱动指定的位置,然后WIFI驱动会自动加载。
十、修改WIFI驱动适合Android Google修改的wpa_supplicant要求SIOCSIWPRIVioctl 发送 命令 到驱动,及接收信息,例如signal strength, mac address of the AP, link speed等。所以要正确实现WIFI驱动,需要从 SIOCSIWPRIV ioctl返回RSSI (signal strength)和MACADDR信息。 如果没实现这个ioctl,会出现如下错误:
E/wpa_supplicant( ): wpa_driver_priv_driver_cmd failed

wpa_driver_priv_driver_cmd RSSI len = 4096
E/wpa_supplicant( ): wpa_driver_priv_driver_cmd failed
D/wpa_supplicant( ): wpa_driver_priv_driver_cmd LINKSPEED len = 4096
E/wpa_supplicant( ): wpa_driver_priv_driver_cmd failed
I/wpa_supplicant( ): CTRL-EVENT-DRIVER-STATE HANGED

十一、设置dhcpcd.conf

一般/system/etc/dhcpcd/dhcpcd.conf的配置为:
interfaceeth0
option subnet_mask, routers, domain_name_servers

更多相关文章

  1. android 设置 永不休眠
  2. Android(安卓)Launcher3一些默认修改
  3. Android控件之Textiew的使用
  4. android 5.1禁止休眠
  5. Android(安卓)Zxing修改为竖屏扫描,和连续扫描问题
  6. Android(安卓)隐式调用 intent
  7. 实现Android屏幕控制Androidscreencast应用
  8. Android启动画面实现
  9. AbstractProcessor注解处理器

随机推荐

  1. Android(安卓)Studio 新建编辑条 点击按
  2. android中使用SQLite进行CRUD操作的实例
  3. 升级Android(安卓)Studio3.1.3,gradel无法
  4. android之网络请求 -- 获取RecyclerView
  5. android中判断网络和WIFI是否连接
  6. 仿WP8样式的Android(安卓)ProgressBar
  7. 新浪微博Android客户端学习记录四:完成OAu
  8. Mac adb 配置
  9. Android五种存储方式
  10. 【Android】Android常见的错误及解决