一、wifi基本架构

1、开源代码移植部分(external目录下)

wireless_tools、wpa_supplicant、wpa_supplicant_6(后两项已经移植过)

生成库libwpaclient.so和守护进程wpa_supplicant及iwconfig、iwlist等相关的测试程序

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

生成libnetutils.so

同时会和wpa_supplicant守护进程通信

3、JNI部分

frameworks/base/core/jni/Android_net_wifi_Wifi.cpp 这个是无线connect、scan方面的调用

frameworks/base/core/jni/android_net_NetUtils.cpp 这个是管理网络方面的工具,如dhcp、route、net en/unable等

4、JAVA部分

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

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

frameworks/base/core/java/android/net 这个是管理网络的工具,调用第三条的第二个jni

5、WIFI Settings位于

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

6、WIFI驱动模块 rt5370sta.ko(此驱动兼容使用ralink的好多种设备驱动,具体可以查看USB_DEVICE_ID)

wpa_supplicant通过wireless_ext 接口和驱动通信

7、WIFI 硬件模块

D-Link DWA-125 芯片:ralink RT3070

二、wifi开发记录

1、5370驱动编译安装及使用过程

set the "MODE = STA" in Makefile and chose the TARGET to Linux by set "TARGET = LINUX"

set 'HAS_WPA_SUPPLICANT=y' and 'HAS_NATIVE_WPA_SUPPLICANT_SUPPORT=y'

#wpa_supplicant -Dwext -iwlan0 -c wpa_supplicant.conf -d (-c这里需要指定下wpa_supplicant.conf的路径)

wpa_supplicant.conf 内容:

ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=wheel

network={

ssid="home"

scan_ssid=1

key_mgmt=WPA-PSK

psk="very secret passphrase"

} // 这个地方的大括号中的内容可在settings中点击选择某个ap后自动生成

#sudo su (android平台需要自己添加脚本编译,和这里写的有差异)

#make clean

#make

#make install

#modprobe rt5370sta

#ifconfig wlan0 up

#iwconfig wlan0

#iwlist wlan0 scan 这时候已经可以扫描wi-fi网络

下面是dhcpcd wlan0即可。

2、几个可执行程序:wpa_supplicant,wpa_cli等。wpa_supplicant是核心程序,它和wpa_cli的关系就是服务和客户端的关系:后台运行wpa_supplicant,可以使用wpa_cli来搜索、设置、和连接网络等,这两个可执行程序很重要

在android中主要是Settings这个属于system的进程调用的libhardware_legecy库中的wifi.c文件和wpa_supplicant通信,同时也调用了wpa_supplicant中提供的libwpa_client.so库,这两个进程间通过socket通信收发数据来得到当前状态,同时也是通过wifi.c来启动和停止init.rc中的wpa_supplicant进程。

dhcpcd用来自动获取ip。

iwconfig iwevent iwgetid iwlist iwpriv iwspy这几个是测试命令,可用来测试wifi当前的情况,以及scan ap等。

3、以上是命令测试过程,下面进行代码的修改部分说明(broadcom BCM7231)

wpa_supplicant 和wpa_cli原生android2.3已经移植,但是没有wireless tool工具,需要将工具移植进来,

不过这些工具相对都比较容易移植,不再详述,下载源码位置如下

然后从驱动开始修改起

1)修改5370驱动

设备名include/rtmp_def.h 修改两个宏定义从ra0修改为wlan0;

LINUX_SRC=... (android的kernel位置)

ifeq($(PLATFORM),BCM7431)

LINUX_SRC= ${ANDROID_PATH}/kernel #修改path为你的android目录

endif

驱动编译后会生成两个文件:RT5370STA.ko 和RT2870STA.dat,后面

会看到需要拷贝这两个文件到系统中。

ioctl 驱动代码接口在os/linux/sta_ioctl.c 及 sta/sta_cfg.c中,如果遇到一些错误,一般在这里都能查找到.

2)把rt5370sta.ko拷贝到.../lib/modules目录中

include$(CLEAR_VARS)

LOCAL_MODULE := rt5370sta.ko

LOCAL_MODULE_TAGS:= user

LOCAL_MODULE_CLASS:= SHARED_LIBRARIES

LOCAL_MODULE_PATH:= $(TARGET_OUT_SHARED_LIBRARIES)/modules

LOCAL_SRC_FILES:= ${RT5370_PATH}/rt5370sta.ko    #PATH

include$(BUILD_PREBUILT)

3) 查看wifi.c文件ko路径及名字是否正确,若不正确需要修改正确

4) 修改init.rc文件

chmod 0771 /system/etc/wifi wifi wifi

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

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

mkdir /data/misc/wifi 0771 wifi wifi

mkdir /data/misc/wifi/sockets 0771 wifi wifi

#wpa_supplicant socket

mkdir /data/system/ 0771 system system

mkdir /data/system/wpa_supplicant 0771 wifi wifi

mkdir /data/misc/dhcp 0771 system system

chmod 0777 /system/etc/dhcpcd/dhcpcd-run-hooks

chmod 0777 /data/misc/dhcp/

mountyaffs2 mtd@system /system ro remount

setprop wifi.interface wlan0

service wpa_supplicant /system/bin/wpa_supplicant -dd -Dwext -iwlan0 -c/system/etc/wifi/wpa_supplicant.conf

#group system wifi inet

disabled

oneshot

servicedhcpcd_wlan0/system/bin/dhcpcd wlan0// 这里的service需要修改为dhcpcd_wlan0(android2.2 和2.3有差异,我这里是2.3),而不是dhcpcd!

group system dhcp

disabled

oneshot0b1331709591d260c1c78e86d0c51c18.png

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐