一、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 supplicant on
      "/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
         group system wifi 
         socket wpa_wlan0 dgram 0666 wifi wifi   //这项是用于UDP连接的
         disabled          oneshot
      service dhcpcd /system/bin/logwrapper /system/bin/dhcpcd -d -B eth0          group system 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的配置为:
      interface eth0
      option subnet_mask, routers, domain_name_servers  

更多相关文章

  1. 使用android访问SQLServer数据库
  2. Android系统自带的常用数据库
  3. Android蓝牙默认名称的修改
  4. android 读取mac地址
  5. 修改ListView 分割线Seperator line
  6. 修改ProgressBar的进度条颜色
  7. Android(安卓)Tethering can't been open(QCOM平台)
  8. Android(安卓)解决Handler在运行时加载报空指针异常
  9. 教你怎么配置Android的AndroidManifest.xml让你不用重复新建项目

随机推荐

  1. php rename错误原因的查找方法
  2. React项目如何使用Element的方法步骤
  3. JavaScript 对象创建的3种方法
  4. 如何解决php domdocument找不到的问题
  5. php将word转换为html格式代码分析
  6. Android(安卓)对话框【Dialog】去除白色
  7. android一些有用的网址
  8. Android调用相机接口
  9. android binder机制
  10. android 4.0 中出错 java.lang.Unsupport