加qq1126137994与微信:liu1126137994 一起学习更多技术!

现在的无线网络基本都是 WPA/WPA2 加密方式的,当我们在嵌入式Linux平台要实现无线网卡连接无线网时,我们需要一些工具来解密WPA/WPA2 加密方式的无线网。wpa_supplicant软件可以解密这种加密的网络,它同时提供相关的命令,供在Linux平台使用,当使用wpa_supplicant软件连接上无线网后,还需要DHCP软件来自动生成ip地址,这样才能正常的联网。wpa_supplicant软件还依赖于openssl库。

所以一共需要移植三个软件:wpa_supplicant-0.7.3,dhcp-3.1.3,openssl-0.9.8e
百度网盘下载地址:点击下载

移植 wpa_supplicant-0.7.3软件

1、首先解压wpa_supplicant-0.7.3,在解压得到的文件夹中找到patches目录,这里面存放的是openssl的补丁文件,里面有很多个补丁,也就是与wpa_supplicant-0.7.3匹配的openssl版本,可以在官方网站进行选择:点击下载。我这里选择的是openssl-0.9.8e版本。
2、知道了openssl的版本后,下载openssl并解压,把wpa_supplicant-0.7.3里面的patches文件夹下的openssl-0.9.8e-tls-extensions.patch文件拷贝到openssl-0.9.8e目录下,运行运行:patch –p1 <openssl-0.9.8e-tls-extensions.patch 这是打补丁的操作。
3、编译openssl
首先建立openssl的安装目录,建议安装在openssl-0.9.8e目录下,因为生成的库等只在交叉编译wpa_supplicant时使用,这样可以保持系统干净。我建立的目录是:openssl-imx6。

进入openssl-0.9.8e目录修改Makefile,修改如下(省略号代表其他位修改的内容):

INSTALLTOP=/home/zsl/work/system/wifi/openssl-0.9.8e/openssl-imx6
.....
OPENSSLDIR=/home/zsl/work/system/wifi/openssl-0.9.8e/openssl-imx6
....
CC= /home/zsl/work/system/fsl-linaro-toolchain/bin/arm-none-linux-gnueabi-gcc
....
AR=/home/zsl/work/system/fsl-linaro-toolchain/bin/arm-none-linux-gnueabi-ar $(ARFLAGS) r
RANLIB= /home/zsl/work/system/fsl-linaro-toolchain/bin/arm-none-linux-gnueabi-ranlib

修改的部分根据自己的实际目录修改!

然后执行make和make install
会在openssl-imx6目录中生成我们移植wpa_supplicant需要的头文件和库文件。

4、编译wpa_supplicant
首先进入wpa_supplicant目录,建立配置文件:
cp defconfig .config
然后修改.config,增加以下内容:

CC=/home/zsl/work/system/fsl-linaro-toolchain/bin/arm-none-linux-gnueabi-gcc -L/home/zsl/work/system/wifi/openssl-0.9.8e/openssl-imx6/lib

CFLAGS += -I/home/zsl/work/system/wifi/openssl-0.9.8e/openssl-imx6/include

LIBS += -L/home/zsl/work/system/wifi/openssl-0.9.8e/openssl-imx6/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文件
首先说明这个文件,这个文件里面记录的是连接的各个无线网的信息,比如无线网的名字,密码,加密解密方式等,我们需要在这个文件里面先将我们想要连接的无线网的信息记录在内,以后方便连接。
配置文件加一项:

ctrl_interface=/var/run/wpa_supplicant
ctrl_interface_group=0
update_config=1
network={
    ssid="iPhone6s"    #无线网名字,最好写成英文#
    key_mgmt=WPA-PSK    
    proto=WPA
    pairwise=TKIP CCMP
    group=TKIP CCMP 
    psk="liuyang123"   #无线网密码#
}

修改完成后就可以保存退出,将该文件想办法拷贝到开发板的/etc目录下。

6、移植DHCP软件
上述前五个步骤已经可以连接无线网,但是还需要一个DHCP工具来自动生成ip,才能正常使用!
先来移植DHCP软件:上述网盘中的文件dhcp-3.1.3.tar.gz拿到Linux系统解压
tar -zxvf dhcp-3.1.3.tar.gz
进入这个目录:
cd dhcp-3.1.3/
因为要编译Linux平台的。所以运行:
./configure linux
发现是有错误的:

System Type: linux  
No build directory for unknown - please run ./configure.  

这个地方纠结了很久,后来不经意间成功了,先不管上面的错误,直接进入到生成 的目录:
cd work.linux

然后:
make “CC=/home/zsl/work/system/fsl-linaro-toolchain/bin/arm-none-linux-gnueabi-gcc -static”
会出错的,出错信息如下:

Making all in common  
make[1]: Entering directory `/home/ghye/Downloads/dhcp-3.1.3/work.linux/common'  
make[1]: *** No rule to make target `raw.o', needed by `libdhcp.a'.  Stop.  
make[1]: Leaving directory `/home/ghye/Downloads/dhcp-3.1.3/work.linux/common'  
make: *** [all] Error 1  

这个地方出错一直不知道怎么解决,后来发现,重新configure一下就好了:
../configure linux

这次configure 就没有出现上述configure 出现过的错误,具体原因不知道,然后再一次:
make “CC=/home/zsl/work/system/fsl-linaro-toolchain/bin/arm-none-linux-gnueabi-gcc -static”

然后这次编译就顺利了,没有出现错误,看来始这个源码有bug!!!

将在work.linux/client目录下生成的dhclient可执行文件,将这个可执行文件拷贝到开发板文件系统的/usr/bin/下。

拷贝配置文件dhcp-3.1.3/client/dhclient.conf和/dhcp-3.1.3/client/scripts/linux 到开发板的/sbin/目录下,并将后一个文件重命名为dhclient-script 并修改该文件的第一行#! /bin/bash 为#! /bin/sh,保存后,修改权限 chmod +x /sbin/dhclient-script

到这一步软件的移植就完成了,接下来我们来使用移植好的软件来连接无线网!!!

7、连接网络

上面还忘了一件事,在开发板文件系统建立一个目录:
mkdir –p /var/run/wpa_supplicant

1、首先将之前移植好的无线驱动程序装载:
insmod rt5370sta.ko
2、启动网卡:
ifconfig wlan0 up
3、创建连接暗文密码(PSK密码),通过明码转换:
wpa_passphrase iPhone6s liuyang1234 >> /etc/wpa_supplicant.conf
此时将在wpa_supplicant.conf文件中生成:

network={
        ssid="iPhone6s"
        #psk="liuyang1234"
        psk=48cff49bf851d8e073040c6e2a6eaa176ac510faf3d69b6d0daf63aa2d68285f
}

4、然后修改wpa_supplicant.conf配置文件,把 psk=”liuyang123” 这一行明文密码改成生成的暗文密码,即改成:

network={
        ssid="iPhone6s"
        key_mgmt=WPA-PSK
        proto=WPA
        pairwise=TKIP CCMP
        group=TKIP CCMP
        psk=48cff49bf851d8e073040c6e2a6eaa176ac510faf3d69b6d0daf63aa2d68285f
}

5、连接AP
wpa_supplicant -iwlan0 -Dwext -c/etc/wpa_supplicant.conf &
(备注:如果使用的是我上一节中讲到的内核自带驱动,会出现一个rt2x00lib_request_firmware: Error - Failed to request Firmware.问题。
意思是找不到无线网卡的固件,这个问题很好解决,只需要在网卡驱动程序的common/目录下找到固件rt2870.bin,并放到开发板的/lib/firmware目录下即可。可以点击下载:点击下载

显示大概如下的话,就是连接上了无线网:

Trying to associate with b6:6d:83:c4:a2:43 (SSID=’iPhone6s’ freq=2462 MHz)
Associated with b6:6d:83:c4:a2:43
WPA: Key negotiation completed with b6:6d:83:c4:a2:43 [PTK=CCMP GTK=CCMP]
CTRL-EVENT-CONNECTED - Connection to b6:6d:83:c4:a2:43 completed (auth) [id=24 id_str=]

此时是还不能上网的,还需要我们用DHCP工具来动态分配ip,输入以下命令:
udhcpc -i wlan0

大概显示如下:
udhcpc (v1.20.2) started
Sending discover…
Sending select for 192.168.191.3…
Sending select for 192.168.191.3…
Lease of 192.168.191.3 obtained, lease time 3600
Deleting routers
adding dns 192.168.191.1
adding dns 114.114.114.114

则说明分配ip成功,当然你可以输入ifconfig wlan0 来查看是否分配了动态ip。

再来ping以下www.baidu.com
ping www.baidu.com

显示如下:

PING www.baidu.com (180.97.33.108): 56 data bytes
64 bytes from 180.97.33.108: seq=0 ttl=47 time=13.221 ms
64 bytes from 180.97.33.108: seq=1 ttl=47 time=15.429 ms
64 bytes from 180.97.33.108: seq=2 ttl=47 time=15.215 ms
64 bytes from 180.97.33.108: seq=3 ttl=47 time=14.273 ms
64 bytes from 180.97.33.108: seq=4 ttl=47 time=16.212 ms

— www.baidu.com ping statistics —
5 packets transmitted, 5 packets received, 0% packet loss

则说明我们的无线网已经可以正常联网了!!!!

6、连接其他AP
我们不可能只连接一个无线网,也不可能每次都修改配置文件来连接无线网,那样太麻烦了,那么该如何使用命令来快速连接无线网呢?

wpa_cli的用法:
首先运行wpa_supplicant服务,之后运行wpa_cli。
运行wpa_cli之后,会进入命令行交互模式,依次执行scan和scan_results可以显示搜索到的周围的AP信息。如下所示:

从中可以得到AP的MAC地址、信号强度以及加密方式等信息。
按下面的顺序依次执行指令,可以连接到加密方式为WPA-PSK/WPA2-PSK的AP:
add_network (会返回一个值,然后将这个值写到下面的26的位置)
set_network 26 ssid “LieBaoWiFi503”
set_network 26 psk “00000000”
enable_network 26

上述命令是添加一个可以连接的wifi信号,然后下面就可以连接了:
输入:
select_network 26

wpa_cli的其他命令模式:
list 可看到当前可连接的的wifi列表。

想一起探讨以及获得各种学习资源加我:
qq:1126137994
微信:liu1126137994
可以共同交流关于嵌入式,操作系统,C++语言,C语言,数据结构等技术问题。