Android WIFI 架构和控制流程

一、WIFI的基本架构

   1、wifi用户空间的程序和库:

         external/wpa_supplicant/

       生成库libwpaclient.so和守护进程wpa_supplicant

   2、hardware/libhardware_legary/wifi/是wifi管理库

   3、JNI部分:

         frameworks/base/core/jni/android_net_wifi_Wifi.cpp

   4、JAVA部分:

         frameworks/base/services/java/com/android/server/

         frameworks/base/wifi/java/android/net/wifi/

   5、WIFI Settings应用程序位于:

       packages/apps/Settings/src/com/android/settings/wifi/

   6、WIFI 驱动模块  wlan.ko

        wpa_supplicant通过wireless_ext 接口和驱动通信

   7、WIFI 硬件模块 

二、WIFI在Android中如何工作

       Android使用一个修改版wpa_supplicant作为daemon来控制WIFI,代码位于external/wpa_supplicant。 wpa_supplicant是通过socket与hardware/libhardware_legacy/wifi/wifi.c通信。UI通过 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

   在BoardConfig.mk中添加:

      BOARD_HAVE_WIFI := true

      BOARD_WPA_SUPPLICANT_DRIVER := WEXT

   这将在external/wpa_supplicant/Android.mk设置WPA_BUILD_SUPPLICANT为true,默认使用驱动driver_wext.c。

   如果使用定制的wpa_supplicant驱动(例如 wlan0),可以设置:

       BOARD_WPA_SUPPLICANT_DRIVER := wlan0

四、使能wpa_supplicant调试信息

   默认wpa_supplicant设置为MSG_INFO,为了输出更多信息,可修改:

   1、在common.c中设置wpa_debug_level = MSG_DEBUG;

   2、在common.c中把#define wpa_printf宏中的

      if ((level) >= MSG_INFO)

      改为

      if ((level) >= MSG_DEBUG)

五、配置wpa_supplicant.conf

   wpa_supplicant是通过wpa_supplicant.conf中的ctrl_interface=来指定控制socket的,应该在 AndroidBoard.mk中配置好复制到$(TARGET_OUT_ETC)/wifi(也就是/system/etc/wifi /wpa_supplicant.conf)这个位置会在init.rc中再次检测的。

   一般的wpa_supplicant.conf配置为:

      ctrl_interface=DIR=/data/system/wpa_supplicant GROUP=wifi

      update_config=1

      fast_reauth=1  

   有时,驱动需要增加:

      ap_scan=1

   如果遇到AP连接问题,需要修改ap_scan=0来让驱动连接,代替wpa_supplicant。

   如果要连接到non-WPA or open wireless networks,要增加:

      network={

              key_mgmt=NONE

      }

六、配置路径和权限

   Google修改的wpa_supplicant要运行在wifi用户和组下的。代码可见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 0770 wifi wifi

       chmod 0770 /system/etc/wifi

       chmod 0660 /system/etc/wifi/wpa_supplicant.conf

       chown wifi wifi /system/etc/wifi/wpa_supplicant.conf

       # wpa_supplicant socket

       mkdir /data/system/wpa_supplicant 0771 wifi wifi

       chmod 0771 /data/system/wpa_supplicant

       #wpa_supplicant control socket for android wifi.c

       mkdir /data/misc/wifi 0770 wifi wifi

       mkdir /data/misc/wifi/sockets 0770 wifi wifi

       chmod 0770 /data/misc/wifi

       chmod 0660 /data/misc/wifi/wpa_supplicant.conf

   如果系统的/system目录为只读,那应该使用路径/data/misc/wifi/wpa_supplicant.conf。

七、运行wpa_supplicant和dhcpcd

   在init.rc中确保有如下语句:

      service wpa_supplicant /system/bin/logwrapper /system/bin/wpa_supplicant -dd

                   -Dwext -iwlan0 -c /data/misc/wifi/wpa_supplicant.conf

         user root

         group wifi inet

      socket wpa_wlan0 dgram 660 wifi wifi

         oneshot

      service dhcpcd /system/bin/logwrapper /system/bin/dhcpcd -d -B wlan0

         disabled

         oneshot

   根据所用的WIFI驱动名字,修改wlan0为自己驱动的名字。

七、编译WIFI驱动为module或kernel built in

   1、编译为module

      在BoardConfig.mk中添加:

         WIFI_DRIVER_MODULE_PATH := "/system/lib/modules/xxxx.ko"

         WIFI_DRIVER_MODULE_ARG := ""  #for example nohwcrypt

         WIFI_DRIVER_MODULE_NAME := "xxxx"  #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要求SIOCSIWPRIV ioctl发送命令到驱动,及接收信息,例如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 wlan0

      option subnet_mask, routers, domain_name_server

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目标检测(Object Detection)是计算机视觉领域的一个核心问题,其主要任务是找出图像中所有感兴趣的目标(物体),并确定它们的类别和位置。以下是对目标检测的详细阐述: 一、基本概念 目标检测的任务是解决“在哪里?是什么?”的问题,即定位出图像中目标的位置并识别出目标的类别。由于各类物体具有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具挑战性的任务之一。 二、核心问题 目标检测涉及以下几个核心问题: 分类问题:判断图像中的目标属于哪个类别。 定位问题:确定目标在图像中的具体位置。 大小问题:目标可能具有不同的大小。 形状问题:目标可能具有不同的形状。 三、算法分类 基于深度学习的目标检测算法主要分为两大类: Two-stage算法:先进行区域生成(Region Proposal),生成有可能包含待检物体的预选框(Region Proposal),再通过卷积神经网络进行样本分类。常见的Two-stage算法包括R-CNN、Fast R-CNN、Faster R-CNN等。 One-stage算法:不用生成区域提议,直接在网络中提取特征来预测物体分类和位置。常见的One-stage算法包括YOLO系列(YOLOv1、YOLOv2、YOLOv3、YOLOv4、YOLOv5等)、SSD和RetinaNet等。 四、算法原理 以YOLO系列为例,YOLO将目标检测视为回归问题,将输入图像一次性划分为多个区域,直接在输出层预测边界框和类别概率。YOLO采用卷积网络来提取特征,使用全连接层来得到预测值。其网络结构通常包含多个卷积层和全连接层,通过卷积层提取图像特征,通过全连接层输出预测结果。 五、应用领域 目标检测技术已经广泛应用于各个领域,为人们的生活带来了极大的便利。以下是一些主要的应用领域: 安全监控:在商场、银行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值