本文档基于Android 2.3.4,描述wifi热点相关工作事宜
1.
<1>.配置android2.3.4\frameworks\base\core\res\res\values\Config.xml
增加相关tether interface:
<!-- caihua.zhao modify here 20120523 -->
<!-- List of regexpressions describing the interface (if any) that represent tetherable Wifi interfaces.
<string-array translatable="false" name="config_tether_wifi_regexs">
</string-array>
增加相关upstream interface: [增加的就是以太网的接口eth0]
<!-- Regex array of allowable upstream ifaces for tethering - for example if you want tethering on a new interface called "foo2" add <item>"foo\\d"</item> to the array -->
<string-array translatable="false" name="config_tether_upstream_regexs">
</string-array>
<2>. 配置android2.3.4\device\softwinner\crane-common\ProductCommon.mk
增加:
PRODUCT_PROPERTY_OVERRIDES += ro.tether.denied=false
<3>.修改android2.3.4\frameworks\base\services\java\com\android\server\
ConnectivityService.java,接口函数ConnectivityService()
增加红色部分:
mTetheringConfigValid = (((mNetTrackers[ConnectivityManager.TYPE_MOBILE_DUN] != null)
||!mTethering.isDunRequired()) &&(mTethering.getTetherableUsbRegexs().length != 0 ||
mTethering.getTetherableWifiRegexs().length != 0) &&
mTethering.getUpstreamIfaceRegexs().length != 0);
上面三项修改后,重新编译后,在 android设置里就会找到便携式热点选项了!
2.
<1>.将nano_7.0.8拷贝到linux wifi driver module目录:
<2>.配置build script,编译新的wifi driver.
修改lichee\linux-2.6.36\scripts\build_sun4i_crane.sh
clean_modules() :
CONFIG_CHIP_ID=${CONFIG_CHIP_ID} HOST=${CROSS_COMPILE} INSTALL_DIR=${LICHEE_MOD_DIR} clean
3.
#define WIFI_FIRMWARE_MODULE_ARG
其中x_mac.axf为softap的固件fireware.
4.
查看debug知道: Exception in startAccessPoint() \ SIOCGIPRIV failed:
,同时知道wifi driver的ko及固件是成功加载的,而且也注册了wifi interface:wlan0
跟踪源码后知道引起这个问题有两个原因:
<1>.android2.3.4\frameworks\base\services\java\com\android\server\WifiService.java
private static final String SOFTAP_IFACE = "wl0.1";
需要修改为:
private static final String SOFTAP_IFACE = "wlan0";// "wl0.1";
<2>. android2.3.4\system\netd\ SoftapController.cpp
int SoftapController::getPrivFuncNum(char *iface, const char *fname) {
}
static struct iw_handler_def nrx_iw_handler_def = {
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,33)
#endif
#if WIRELESS_EXT >= 17
#endif
};
#endif
由于没有定义相应的private接口函数,所以上述ioctl会出错。因为这个ioctl就是为了得到wifi driver定义的private函数接口地址。
问题点:
要想解决这个问题,必须在驱动里增加相应的接口函数。
但nanoradio 技术支持说他也没有加过这样的接口,却没有提及其有开发的Android2.3.4SDK(坑爹哟!),后才知道这才是正道,我根据这个SDK大概花了不到两天时间,在android2.3.4的softap及client都弄好了,或许是之前的折腾,让我熟悉很多工具和并对驱动也熟悉很多。另,也没有说,softap和client需要不同的固件,后来我们测试时,发现启动client功能时宕机,我查看流程在知道需要不同固件。
当时,我们商量先用命令行模式将softap调试好。
涉及到android系统中没有的命令有iwconfig 、hostapd 。
而已有命令如下:
iptables、dnsmasq.
命令简介:
iwconfig是Linux Wireless Extensions(LWE)的用户层配置工具之一。LWE是Linux下对无线网络配置的工具,包括内核的支持、用户层配置工具和驱动接口的支持三部分。目前很多无线网卡都支持LWE,而且主流的Linux发布版本,比如Redhat Linux、Ubuntu Linux都已经带了这个配置工具。
hostapd 是一个用户态用于AP和认证服务器的守护进程。它实现了IEEE 802.11相关的接入管理,IEEE 802.1X/WPA/WPA2/EAP 认证, RADIUS客户端,EAP服务器和RADIUS 认证服务器。Linux下支持的驱动有:Host AP,madwifi,基于mac80211的驱动。
iptables IP 信息包过滤系统是一种功能强大的工具,可用于添加、编辑和除去规则,这些规则是在做信息包过滤决定时,防火墙所遵循和组成的规则。这些规则存储在专用的信息包过滤表中,而这些表集成在 Linux 内核中。在信息包过滤表中,规则被分组放在我们所谓的链(chain)中。
DNSmasq是一个小巧且方便地用于配置DNS和DHCP的工具,适用于小型网络,它提供了DNS功能和可选择的DHCP功能。它服务那些只在本地适用的域名,这些域名是不会在全球的DNS服务器中出现的。DHCP服务器和DNS服务器结合,并且允许DHCP分配的地址能在DNS中正常解析,而这些DHCP分配的地址和相关命令可以配置到每台主机中,也可以配置到一台核心设备中(比如路由器),DNSmasq支持静态和动态两种DHCP配置方式。
下面我们就开始编译相关可执行的命令行文件!
5.
6.
具体命令行流程如下:
<1>.load dirver
<2>. config softAP
<3>.config ip address
<4>.config iptables
<5>.create share net chain
<6>.config dnsmasq
dnsmasq --no-daemon --no-resolv --no-poll --dhcp-range=192.168.43.100,192.168.43.200,
100h
如此配置后,能后手机搜索到softap : HuaziNanoAP,没有加密的,并且也能正常获得ip地址,但是手机并不能正常的上网。
查找原因后知道:dnamasq没有配置dns服务器的地址。
解决方法:
新建一个文件resolv.conf,内容如下:
nameserver 202.96.134.133
nameserver 202.96.128.86
nameserver 8.8.8.8
nameserver 4.2.2.2
其中202.96.134.133、202.96.128.86是我们办公室网线上网时获得到的dns服务器地址.
而8.8.8.8、4.2.2.2是两个免费的dns服务器.
将resolv.conf通过adb上传到/etc目录
修改上面的第六步命令如下:
dnsmasq --no-daemon --no-poll --dhcp-range=192.168.43.100,192.168.43.200,100h
这样的话,启动dnsmasq时,会自动加载/etc/resolv.conf配置dns.
后用手机再次测试,这次能正常上网了!(可喜可贺)
7.
封装接口的对应关系如下:
getPrivFuncNum(iface, "START");
nano_iwpriv_control_on()
getPrivFuncNum(iface, "STOP");
nano_iwpriv_control_off()
getPrivFuncNum(mIface, "AP_BSS_START");
nano_iwpriv_softap_start ()
fnum = getPrivFuncNum(mIface, "AP_BSS_STOP");
nano_iwpriv_softap_stop ()
getPrivFuncNum(argv[2], "AP_SET_CFG");
nano_iwpriv_set_ap_config()
getPrivFuncNum(iface, "FW_RELOAD");
nano_iwpriv_fw_reload ()
在nano_iwpriv_softap_start调用driver的相关api实现如下命令行的流程:
nano_iwpriv_softap_start依次调用了:
//SET Mode
nrx_iw_set_mode()
//Set Channel
nrx_iw_set_freq()
//SET ESSID
nrx_iw_set_essid()
而后,编译后,我们发现在Android设置里,能正常启动不加密的softap了,
并且后边的iptables/dnsmasq流程在android code是正常的。
用手机测试能DHCP连接到softap,且能正常上网!
至此,softap在android2.3.4上,不加密时就OK了!
8.
实现wep加密,用iwconfig就能实现。
在第6步的<2>. config softAP增加一句命令即可:
iwconfig wlan0 key s:1234efghijklm
后按照第6步启动softap,这时用手机搜到的softap显示wep加密保护,输入密码“1234efghijklm”后,能自动获取到IP,同时也能正常上网。
需要注意的是:
WEP密码长度必须是5BYTE和13BYTE两种,不过一般设13byte,这样破解起来也需时久些!
根据命令流程,在、在nano_iwpriv_softap_start调用driver的相关api实现wep,
nano_iwpriv_softap_start调用了:
修改android2.3.4\system\netd\ SoftapController.cpp
int SoftapController::setSoftap(int argc, char *argv[]) 函数接口里:
修改之后:
而后,编译后,我们在Android便携式热点设置里,选择wpa2-psk加密方式,密码设置长度为13byte.启动softap,用手机连接测试softap,显示wep加密保护,正确输入密码连接,能DHCP获得IP,且能正常上网!
至此,softap在android2.3.4上,WEP加密时就OK了!
9.
<1>.ubantu10.04用arm-none-linux-gnueabi-gcc-4.5.1编译hostapd,开源项目,
nanoradio提供的版本是hostapd_WD_8.3,做了一定修改。
编译命令如下:
make -j4 SPACE=kernel DRIVER_PATH=../driver/src
编译之前,需将nano_7.0.8里的内容拷贝到hostapd_WD_8.3/driver/src目录下。
然后,执行编译命令,
check ../driver/src/userspace/libnrx/编译没有,没有编译,则会去编译
libnrx,但是这个路径下没有Makefile,报错!
解决方法:
到路径下查看,发现存在configure.ac make.am,有了这两个文件,我们就可以生成
Makefile.
autoconf根据configure.ac(在早前版本称为configure.in)生成configure。
automake,根据Makefile.am,生成Makefile.in。
configure,根据Makefile.in生成Makefile。
所以需要在ubantu10.04安装autoconf、automake两个工具,安装完成后,就可以生成
Makefile了。
修改Makefile的CC等为ARM交叉编译,以及修改一些地方编译通过后,
会生产一个libnrx.a。这是编译hostapd需要的!
之后,修改hostapd_WD_8.3/hostapd/Makefile,同样主要是配置成ARM交叉编译,
在执行编译命令
make -j4 SPACE=kernel DRIVER_PATH=../driver/src
这次编译并未保错了,并且生成两个可执行命令行文件hostapd和hostapd_cli,
将hostapd用adb push到/system/bin,添加可执行权限后,在adb shell里执行:
#hostapd -v
/system/bin/sh:hostapd:No such file or directory
说明hostapd命令行不能用。怎么办?
我想:当初编译iwconfig时,打开BUILD_STATIC就可以了,是不是编译hostapd是也要加上呢?
先不管,加上试试,在hostapd的Makefile的
CFLAGS += -static
重新编译,再次上传生成的hostapd到/system/bin,添加可执行权限后,执行:
#hostapd -v
/system/bin/sh:hostapd:No such file or directory
问题依旧,怎么办?
只好求助百度。
网上有人说,降低ARM交叉编译器版本为android编译器的版本。
查了一下,android2.3.4\build\envsetup.sh有如下:
export ANDROID_EABI_TOOLCHAIN=$prebuiltdir/toolchain/arm-eabi-4.4.3/bin
说明用的是交叉编译版本是4.4.3
好,开始编译4.4.3的arm交叉编译器,这一步还好,很顺利。
交叉编译器编译好后,重新配置hostapd的Makefile,CC、AR、RANLIB配置成
新编译的版本为4.4.3的arm交叉编译。
再次编译,上传生成的hostapd到/system/bin,添加可执行权限后,执行:
#hostapd -v
/system/bin/sh:hostapd:No such file or directory
哎,问题依旧,怎么办?
正当灰心丧气时,总监提出也许可以在android源码里编译。
之前之所以没有这么做,因为Nanoradio提供的方法就是在Ubantu上交叉编译,
问了那边有没有在android编译过,说从来没有过,很少汗颜啊!
没办法,第一个吃螃蟹的人总的有嘛!
好,试试再说!
先将hostapd_WD_8.3拷贝到external下,
#cd external/hostapd_WD_8.3/hostapd
#mm
直接报错,分析了一下是hostapd src路径没有设置对,
修改android.mk的src 为 ../src
另,修改src/drivers下drivers.mk的src 也为 ../src
再次mm. 前面编译还挺顺利,但link时出错,需要libnrx.a,
当然这次的libnrx.a也是要用android的编译器编译才行,
但driver/src/userspace/libnrx/没有android.mk,怎办?
通过Makefile的规则,我增加这个android.mk,
后编译libnrx通过后,再次到hostapd里去编译,
这次通过了。(大喜!)
上传生成的hostapd到/system/bin,添加可执行权限后,执行:
#hostapd -v
/system/bin/sh:hostapd:No such file or directory
hostapd v0.8.x
User space daemon for IEEE 802.11 AP management,
IEEE 802.1X/WPA/WPA2/EAP/RADIUS Authenticator
Copyright (c) 2002-2011, Jouni Malinen <j@w1.fi> and contributors
Yeah, 成功了,hostapd可以用了!编译成功!
<2>.命令行配置wpa加密的softap
具体命令行流程如下:
1.load dirver
2. config softAP
3.config ip address
4.config iptables
5.create share net chain
6.config dnsmasq
dnsmasq --no-daemon --no-resolv --no-poll --dhcp-range=192.168.43.100,192.168.43.200,
100h
首先修改hostapd_softap_RSN_TKIP.conf中相关配置项:
# AP netdevice name
interface=wlan0
# Driver interface type (hostap/wired/madwifi/prism54/test/none/nl80211/bsd);
driver=nano
ssid=HuaziNanoAP
#屏蔽掉以下两个
#ctrl_interface=/var/fun/hostapd
#ctrl_interface_group=0
如果不屏蔽掉的话,hostapd命令执行会出错!
出错提示如下:
mkir[ctrl_interface]:No such file or directory
chown[ctrl_interface]:Operation not permitted
上传hostapd_softap_RSN_TKIP.conf到/system/etc,
执行上述的命令流程,wpa加密的softap就配置出来了。
手机测试,连接OK!
<3>.根据nanoradio提供的android2.3.4 sdk,整合相关内容。
config.xml:
softap interface改成sap0 ,防止与wifi client冲突,如果两个接口同为wlan0的话,启动client时,也会触发启动softap,流程会出错的!
init.rc:增加wifi client和softap相关的service。
wifi.c: 修改。
SoftapController.cpp: 修改。