上一篇文章讲述了如何在内核中配置RT5370驱动,配置完了之后便是使用。当无线网络是 WPA/WPA2 加密方式时,WIFI 客户端也需要用此加密方式才能连接上网络。连接WPA/WPA2 加密网络方法是修改无线网络配置文件后直接连接网络。
要连接WPA/WPA2 加密方式的路由需要使用wpa_supplicant工具,需要对它进行移植。
先说一下软件环境:
上位机:虚拟机中使用ubuntu12.04
移植代码版本:wpa_supplicant-0.7.3 下载地址:http://download.csdn.net/detail/andylauren/9597596
openssl-0.9.8e 下载地址:http://download.csdn.net/detail/andylauren/9597598
在启动RT5370网卡时需要的固件文件:rt2870.bin 下载地址:http://download.csdn.net/detail/andylauren/9597594
然后我们就开始我们的移植工作
wpa_supplicant的其他版本可以访问官方网站进行下载:http://w1.fi/releases/
1、首先解压wpa_supplicant-0.7.3,在解压得到的文件夹中找到patches目录,这里面存放的是openssl的补丁文件,里面有很多个补丁,也就是与wpa_supplicant-0.7.3匹配的openssl版本,可以在官方网站进行选择,ftp://ftp.openssl.org/source/old/0.9.x/
我这里选择的是openssl-0.9.8e版本。
2、知道了openssl的版本后,下载openssl并解压,把wpa_supplicant-0.7.3里面的patches文件夹下的openssl-0.9.8e-tls-extensions.patch文件拷贝到openssl-0.9.8e目录下,运行:pathc–p1<openssl-0.9.8e-tls-extensions.patch
简单解释一下,pathc是打补丁命令,后面的-p1是忽略补丁中的第一级目录。
3、编译openssl
首先建立openssl的安装目录,建议安装在openssl-0.9.8e目录下,因为生成的库等只在交叉编译wpa_supplicant时使用,这样可以保持系统干净。我建立的目录为openssl-arm。
进入openssl-0.9.8e目录修改Makefile,修改如下:
CC=arm-linux-gcc
AR=arm-linux-ar$(ARFLAGS) r
RANLIB=arm-linux-ranlib
INSTALLTOP=刚才你建立的安装目录,要使用绝对路径,不然在make install的时候会出错
OPENSSLDIR=刚才你建立的安装目录,要使用绝对路径,不然在make install的时候会出错
我的配置为
INSTALLTOP=/home/linux/arm/wpa-supplicant/openssl-arm
# Do not edit this manually. Use Configure --openssldir=DIR do change this!
OPENSSLDIR=/home/linux/arm/wpa-supplicant/openssl-arm
然后执行make和make install
会在openssl-arm目录中生成我们移植wpa_supplicant需要的头文件和库文件。
4、编译wpa_supplicant
首先进入wpa_supplicant目录,建立配置文件:
cp defconfig .config
然后修改.config,增加以下内容:
CC=arm-linux-gcc -L/home/linux/arm/wpa-supplicant/openssl-arm/lib
CFLAGS+= -I/home/linux/arm/wpa-supplicant/openssl-arm/include
LIBS+= -L/home/linux/arm/wpa-supplicant/openssl-arm/lib
CC是指定交叉编译链,并且通过-L指定刚刚编译好的openssl的库文件目录
CFLAGS是通过-I指定刚刚编译好的openssl的头文件目录
LIBS通过-L指定刚刚编译好的openssl的库文件目录
设置好了之后就可以保存退出,进行make
make后会在该文件夹下生成我们需要的二进制可执行文件,需要我们拷贝到开发板的/bin目录下。其中有3个需要拷贝的文件:
wpa_supplicant,wpa_cli,wpa_passphrase
将这三个文件想办法弄到开发板的/bin目录下。
5、编写wpa_supplicant.conf文件
在该文件夹下有无线网卡配置文件wpa_supplicant.conf需要我们修改后并拷贝到开发板的/etc目录下。
修改内容如下:
ctrl_interface=/var/run/wpa_supplicant
update_config=1
network={
ssid="mingzi"
key_mgmt=WPA-PSK
psk="mimamimamima"
}
修改完成后就可以保存退出,将该文件想办法拷贝到开发板的/etc目录下。
6、使用wpa_supplicant
现在我们在开发板上可以使用wpa_supplicant进行无线网卡的连接了,前提是已经将无线网卡的驱动加载并将无线网卡插在了开发板上。
然后可以使用
wpa_supplicant -ira0 -Dwext -c/etc/wpa_supplicant.conf -dd &
wpa_supplicant -ira0 -Dwext -c/etc/wpa_supplicant.conf &
这两条指令中的任意一个,-dd的会输出更过的信息。
如果使用的是我上一节中讲到的内核自带驱动,会出现一个rt2x00lib_request_firmware: Error - Failed to request Firmware.问题。
意思是找不到无线网卡的固件,这个问题很好解决,只需要在网上下载到无线网卡的固件,并放到开发板的/lib/firmware目录下即可。
如果使用的是RT5370无线网卡可以下载我上面提供的固件,已经经过我验证是可以的。也可以在官方下载:http://rt2x00.serialmonkey.com/pipermail/users_rt2x00.serialmonkey.com/2013-January/005610.html
这个下载后需要改名为rt2800.bin
然后我们就可以执行wpa_supplicant命令了。
但是像我这样移植后的wpa_supplicant会出现无法启动网卡的错误,只需要手动up无线网卡即可,可能这里你不会遇到这个问题,因为这可问题可能是由于linux内核驱动的原因,我在移植无线网卡官方驱动时,也就是不使用linux内核自带驱动情况下是不需要手动up的。
执行wpa_supplicant -ira0 -Dwext -c/etc/wpa_supplicant.conf -dd &命令后当看到如下输出说明无线网卡已经启动起来了。
wpa_driver_wext_set_operstate: operstate 0->1 (UP)
netlink: Operstate: linkmode=-1, operstate=6
EAPOL: External notification - portValid=1
EAPOL: External notification - EAP success=1
EAPOL: SUPP_PAE entering state AUTHENTICATING
EAPOL: SUPP_BE entering state SUCCESS
EAP: EAP entering state DISABLED
EAPOL: SUPP_PAE entering state AUTHENTICATED
EAPOL: Supplicant port status: Authorized
EAPOL: SUPP_BE entering state IDLE
EAPOL authentication completed successfully
RTM_NEWLINK: operstate=1 ifi_flags=0x11043 ([UP][RUNNING][LOWER_UP])
RTM_NEWLINK, IFLA_IFNAME: Interface 'wlan0' added
EAPOL: startWhen --> 0
EAPOL: disable timer tick
之后可以配置静态IP或者使用udhcpc -i wlan0进行动态申请IP。
root@SBC8600:/# udhcpc -i wlan0
udhcpc (v1.11.3) started
Sending discover...
Sending select for 192.168.1.105...
Lease of 192.168.1.105 obtained, lease time 7200
adding dns 10.10.0.1
adding dns 124.207.160.106
这之后就可以使用无线网络了,移植工作完成。