libnl-1.1.4.tar.gz 下载地址:http://www.infradead.org/~tgr/libnl/
openssl-0.9.8za 下载地址:ftp://ftp.openssl.org/source/old/0.9.x/
wpa_supplicant-2.5 下载地址:http://w1.fi/releases/
我这里使用的是wpa_supplicant-2.5.tar.gz和openssl-0.9.8za.tar.gz。
下载wpa_supplicant-2.5.tar.gz (openssl用到2.5提供的补丁)
#tar xvfz wpa_supplicant-2.5.tar.gz看到patches目录下
openssl-0.9.8za-tls-extensions.patch和openssl-0.9.8zf-tls-extensions.patch两个补丁文件,所以openssl要下载对应的0.98za或0.98zf版本
我们下载0.98za版本
#tar zxvf openssl-0.9.8za.tar.gz
分别解压wpa_supplicant-2.5.tar.gz和openssl-0.9.8za.tar.gz,把wpa_supplicant-2.5里面的patches文件夹下的openssl-0.9.8za-tls-extensions.patch文件拷贝到openssl-0.9.8za目录下,运行:
patch -p1 < openssl-0.9.8za-tls-extensions.patch
下面开始编译各个源码
需要使用root 权限,否则在install的时候会提示没有权限。
配置libnl(之前用了最新的libnl-3.4.0,编译wpa的时候会提示找不到-lnl,因为3.4编译完后生成的是libnl-3)
./configure --prefix=/usr/local/arm/libnl1.1
编译
make CC=arm-linux-gnueabi-gcc
make install
编译openssl
修改makfile 需要用绝对路径,否则会提示出错
CC= /home/zjf/R40/lichee/out/sun8iw11p1/linux/common/buildroot/external-toolchain/bin/arm-linux-gnueabi-gcc
AR= /home/zjf/R40/lichee/out/sun8iw11p1/linux/common/buildroot/external-toolchain/bin/arm-linux-gnueabi-ar $(ARFLAGS) r
RANLIB= /home/zjf/R40/lichee/out/sun8iw11p1/linux/common/buildroot/external-toolchain/bin/arm-linux-gnueabi-ranlib
安装目录放在了openssl的目录下,没有试其它目录,因为在下面运行make install的时候会安装失败,是由于要安装man导致,所以在编译wpa_supplicant的时候直接选择主目录就可以了。
INSTALLTOP=/home/zjf/wifibuild/openssl-0.9.8za
OPENSSLDIR=/home/zjf/wifibuild/openssl-0.9.8za
执行 make && make install
编译wpa_supplicant(wpa还是用2.5版本,用2.6版本编译不过)
首先建立配置文件:
cp defconfig .config
然后修改.config,增加以下内容:
CC=arm-linux-gnueabi-gcc
CFLAGS+=-I /home/zjf/wifibuild/openssl-0.9.8za/include
LIBS+=-L /home/zjf/wifibuild/openssl-0.9.8za/lib
LDFLAGS +=-L /home/zjf/wifibuild/openssl-0.9.8za
LIBS+=-L /home/zjf/wifibuild/openssl-0.9.8za
CFLAGS += -I/usr/local/arm/libnl1.1/include/
LDFLAGS += -I/usr/local/arm/libnl1.1/include/
LIBS += -L/usr/local/arm/libnl1.1/lib
保存配置后执行 make ,完成编译。
把wpa_supplicant 下载到板子上后创建一下配置文件wpa_supplicant.conf
内容如下:
network={
ssid="z001"
psk="1234567891"
}
network={
ssid="z001"
psk="1234567891"
priority=1
key_mgmt=WPA-PSK
}
然后运行下面命令
./wpa_supplicant -Dnl80211 -iwlan0 -c/tmp/wpa_supplicant.conf &
打印如下
# Successfully initialized wpa_supplicant
nl80211: Could not re-add multicast membership for vendor events: -2 (No such file or directory)
wlan0: Trying to associate with 6c:e8:73:27:42:68 (SSID='z001' freq=2437 MHz)
[22570.275881] cfg80211: Calling CRDA for country: US
[22570.282865] RTL871X: rtw_set_802_11_connect(wlan0) fw_state=0x00000008
[22570.375384] RTL871X: start auth
[22570.381426] RTL871X: auth success, start assoc
[22570.393070] RTL871X: assoc success
wlan0: Associated with 6c:e8:73:27:42:68
[22570.403822] RsvdPageNum: 8
[22570.514479] RTL871X: send eapol packet
[22570.619330] RTL871X: send eapol packet
[22570.623993] RTL871X: set pairwise key to hw: alg:4(WEP40-1 WEP104-5 TKIP-2 AES-4) camid:4
[22570.718353] RTL871X: set group key to hw: alg:4(WEP40-1 WEP104-5 TKIP-2 AES-4) keyid:1
[22570.718385] RTL871X: send eapol packet
wlan0: WPA: Key negotiation completed with 6c:e8:73:27:42:68 [PTK=CCMP GTK=CCMP]
wlan0: CTRL-EVENT-CONNECTED - Connection to 6c:e8:73:27:42:68 completed [id=1 id_str=]
[22571.736155] RTL871X: set group key to hw: alg:4(WEP40-1 WEP104-5 TKIP-2 AES-4) keyid:1
[22571.736190] RTL871X: send eapol packet
wlan0: WPA: Group rekeying completed with 6c:e8:73:27:42:68 [GTK=CCMP]
然后用dhcp 获取ip地址
udhcpc -i wlan0
ping 一下,成功ping 通
为了方便可以搭建一个脚本
ifconfig eth0 down
ifconfig wlan0 up
sleep 2
./wpa_supplicant -Dnl80211 -iwlan0 -c/tmp/wpa_supplicant.conf &
sleep 5
udhcpc -i wlan0
以下是个很好的wpa_supplicant.conf例程
# 请不要修改下面这一行内容,否则将不能正常工作
ctrl_interface=/var/run/wpa_supplicant
# 确保只有root用户能读取WPA的配置
ctrl_interface_group=0
# 使用wpa_supplicant来扫描和选择AP
ap_scan=1
# 简单的情形:WPA-PSk密码验证方式,PSK是ASCII密码短语,所有合法的加密方式都允许连接
network={
ssid="simple"
psk="very secret passphrase"
# 优先级越高,就能越早匹配到。
priority=5
}
# 与前面的设置相同,但要求对特定的SSID进行扫描(针对那些拒绝广播SSID的AP)
network={
ssid="second ssid"
scan_ssid=1
psk="very secret passphrase"
priority=2
}
# 仅使用WPA-PSK方式。允许使用任何合法的加密方式的组合
network={
ssid="example"
proto=WPA
key_mgmt=WPA-PSK
pairwise=CCMP TKIP
group=CCMP TKIP WEP104 WEP40
psk=06b4be19da289f475aa46a33cb793029d4ab3db7a23ee92382eb0106c72ac7bb
priority=2
}
# 明文连接方式(不使用WPA和IEEE802.1X)
network={
ssid="plaintext-test"
key_mgmt=NONE
}
# 共享WEP密钥连接方式(不使用WPA和IEEE802.1X)
network={
ssid="static-wep-test"
key_mgmt=NONE
# 引号包含的密钥是ASCII密钥
wep_key0="abcde"
# 没有引号包含的密钥是十六进制密钥
wep_key1=0102030405
wep_key2="1234567890123"
wep_tx_keyidx=0
priority=5
}
# 共享WEP密钥连接方式(无WPA和IEEE802.1X),使用共享密钥IEEE802.11验证方式
network={
ssid="static-wep-test2"
key_mgmt=NONE
wep_key0="abcde"
wep_key1=0102030405
wep_key2="1234567890123"
wep_tx_keyidx=0
priority=5
auth_alg=SHARED
}
# 在IBSS/ad-hoc网络中使用WPA-None/TKIP
network={
ssid="test adhoc"
mode=1
proto=WPA
key_mgmt=WPA-NONE
pairwise=NONE
group=TKIP
psk="secret passphrase"
}