嵌入式设备WIFI应用开发(1)- wpa_supplicant和wpa_cli的移植和使用
概述
在嵌入式设备中和Android中,对WIFI的操作,使用的都是wpa_supplicant这个工具。wpa_supplicant是一个跨平台的WPA应用,既适应于桌面环境也适合嵌入式环境使用,支持的标准相对于iw-tools更全面;wpa_supplicant的详细介绍可访问他的主页:wpa_supplicant官网
本篇文章主要讲解如何基于wpa_supplicant和wpa_cli通过封装我们自己的WIFI操作接口完成wifi扫描,wifi连接,wifi连接状态查询等基本操作。
测试硬件环境:
CPU型号:HI3516DV100
WIFI型号:MT7601
wpa_supplicant
wpa_supplicant做一个daemon程序运行在系统的后台来控制wifi的连接;通过和前端程序wpa_cli进行命令交互,执行wpa_cli发送的指令,完成操作。
在嵌入式应用环境中,wpa_supplicant通过源码进行交叉编译移植到对应的硬件环境中,所以第一步就是要完成wpa_supplicant的移植。
-
获取源码
wpa_supplicant: https://w1.fi/releases/wpa_supplicant-2.5.tar.gz
openssl: http://www.openssl.org/source/old/0.9.x/openssl-0.9.8za.tar.gz -
编译wpa_supplicant
2.1、解压wpa_supplicant和openssl-0.9.8za
tar zxvf openssl-0.9.8za.tar.gz
tar zxvf wpa_supplicant-2.5.tar.gz2.2、拷贝wpa_supplicant-2.5/patches目录下openssl-0.9.8za-tls-extensions.patch补丁文件到openssl目录
cp wpa_supplicant-2.5/patches/openssl-0.9.8za-tls-extensions.patch …/openssl-0.9.8za
用patch命令打上补丁
patch -p1 < openssl-0.9.8za-tls-extensions.patch2.3、编译openssl-0.9.8za
在openssl-0.9.8za目录下建立bin目录,存在openssl编译后库文件
mkdir -p /project/tool/wpa_supplicant/openssl-0.9.8za/bin修改openssl-0.9.8za目录下Makefile
CC=arm-hisiv300-linux-gcc
AR=arm-hisiv300-linux-ar$(ARFLAGS) r
RANLIB=arm-hisiv300-linux-ranlib
INSTALLTOP=/project/tool/wpa_supplicant/openssl-0.9.8za/bin #刚才你建立的安装目录,要使用绝对路径,不然在make install的时候会出错
OPENSSLDIR=/project/tool/wpa_supplicant/openssl-0.9.8za/bin #刚才你建立的安装目录,要使用绝对路径,不然在make install的时候会出错
make && make install。2.4、配置wpa_supplicant编译选项
cd wpa_supplicant-2.5/wpa_supplicant
cp defconfig .config
修改.config,增加以下内容:
CC=arm-hisiv300-linux-gcc -L/project/tool/wpa_supplicant/openssl-0.9.8za/bin/lib
CFLAGS+=-I/project/tool/wpa_supplicant/openssl-0.9.8za/bin/include
LIBS+=-L/project/tool/wpa_supplicant/openssl-0.9.8za/bin/lib使用默认的.config配置编译出的wpa_supplicant可执行文件较大,通过配置.config文件中选项,可以减小wpa_supplicant可执行文件大小
编辑.config
注释掉CONFIG_DRIVER_HOSTAP=y
注释掉CONFIG_DRIVER_ATMEL=y
注释掉CONFIG_DRIVER_NL80211=y
反注释CONFIG_NO_STDOUT_DEBUG=y
反注释CONFIG_NO_CONFIG_WRITE=y
修改wpa_supplicant的Makefile将:CFLAGS += -I$(abspath …/src)
CFLAGS += -I$(abspath …/src/utils)
修改为:
CFLAGS += -I…/src
CFLAGS += -I…/src/utils2.5、编译wpa_supplicant
make -
准备wpa_supplicant.conf配置文件
新建一个名为wpa_supplicant.conf的文件,在文件中写入下面内容:
ctrl_interface=/var/run/wpa_supplicant
ctrl_interface_group=0
ap_scan=1
- 运行wpa_supplicant
wpa_supplicant -B -iwlan0 -c wpa_supplicant.conf -Dwext
-B: 后台运行wpa_supplicant
-iwlan0: 网络设备wlan0
-c: 配置文件路径
-Dwext: 驱动类型
wpa_cli
wap_cli作为一个前端的client程序负责向wpa_supplicant传递指令,我们先用wpa_cli来测试一下与wpa_supplicant的交互完成基本的wifi操作。在前面wpa_supplicant编译成功后wpa_cli也会编译生成。
测试
将wpa_supplicant,wpa_cli,wpa_supplicant.conf拷贝到硬件
- 运行ifconfig查看wlan0网络设备状态
在串口中断运行ifconfig命令,查看是否有wlan0网络接口(网络接口名不一定是wlan0),如果没有wlan0出现,则要看看wifi驱动是否加载了。 - 运行wpa_supplicant
./wpa_supplicant -B -iwlan0 -c wpa_supplicant.conf -Dwext - 运行wpa_cli
./wpa_cli wlan0
进入wpa_cli交互命令行,
~ # wpa_cli
wpa_cli v2.5
Copyright (c) 2004-2015, Jouni Malinen <j@w1.fi> and contributors
This software may be distributed under the terms of the BSD license.
See README for more details.
Selected interface 'wlan0'
Interactive mode
> scan
OK
> ===>rt_ioctl_giwscan. 22(22) BSS returned, data->length = 4615
<3>CTRL-EVENT-SCAN-RESULTS
<3>CTRL-EVENT-NETWORK-NOT-FOUND
scan_r
> bssid / frequency / signal level / flags / ssid
2e:3a:e8:16:6a:3e 2462 -47 [WPA2-PSK-CCMP+TKIP][ESS] WLT8266
0a:9b:4b:90:7c:91 2462 -39 [WPA2-PSK-CCMP][ESS] \xe6\xaf\x8f\xe4\xba\xba\xe8\xae\xa1
08:10:78:38:d0:5d 2437 -41 [WPA-PSK-CCMP+TKIP][WPA2-PSK-CCMP+TKIP][ESS] Netcore_38D05D
f4:8e:92:02:78:08 2437 -43 [WPA-PSK-CCMP+TKIP][WPA2-PSK-CCMP+TKIP][ESS] hqmrj
08:9b:4b:90:7c:91 2462 -43 [WPA2-PSK-CCMP][ESS] mrj
08:10:78:38:c1:c7 2437 -53 [WPA-PSK-CCMP][WPA2-PSK-CCMP][ESS] \xe6\x8a\x80\xe6\x9c\xaf
78:44:fd:a6:88:a0 2412 -57 [WPA-PSK-CCMP][WPA2-PSK-CCMP][ESS] 3D MRD\xe5\xb1\x95\xe5\x8e\x85
70:8a:09:f9:de:5e 2462 -57 [WPA-PSK-CCMP+TKIP][WPA2-PSK-CCMP+TKIP][ESS] HUAWEI-B310-DE5E
be:54:fc:30:51:c8 2412 -65 [WPA-PSK-CCMP+TKIP][WPA2-PSK-CCMP+TKIP][ESS] \xe5\x8d\x81\xe9\x87\x8c\xe9\xb8\xa1\xe5\x85\xac\xe7\x85\xb2
c0:61:18:44:52:96 2412 -65 [WPA-PSK-CCMP][WPA2-PSK-CCMP][ESS] long
b4:0f:3b:25:a9:81 2417 -39 [WPA-PSK-CCMP+TKIP][WPA2-PSK-CCMP+TKIP][ESS] GWZX
cc:2d:21:1b:3e:b1 2427 -43 [WPA-PSK-CCMP][WPA2-PSK-CCMP][ESS] GEWU-Test
b0:df:c1:e7:a3:f1 2422 -43 [WPA-PSK-CCMP+TKIP][WPA2-PSK-CCMP+TKIP][ESS] Tenda_E7A3F0
64:09:80:06:1f:db 2437 -45 [WPA-PSK-CCMP+TKIP][WPA2-PSK-CCMP+TKIP][ESS] emu
cc:2d:21:1a:be:91 2452 -51 [WPA-PSK-CCMP][WPA2-PSK-CCMP][ESS] yasugongshang
c8:50:e9:e9:b9:c2 2432 -59 [WPA-PSK-TKIP][WPA2-PSK-CCMP][ESS] ChinaNet-vr1T
08:9b:4b:9a:60:d9 2462 -63 [WPA2-PSK-CCMP][ESS] mrj
b0:ac:d2:0e:09:4e 2412 -65 [WPA-PSK-CCMP+TKIP][WPA2-PSK-CCMP+TKIP][ESS] xmjf
0a:9b:4b:9a:60:d9 2462 -65 [WPA2-PSK-CCMP][ESS] \xe6\xaf\x8f\xe4\xba\xba\xe8\xae\xa1
ac:d1:b8:a8:e8:77 2412 -61 [WPA2-PSK-CCMP][ESS] HP-Print-77-LaserJet Pro MFP
38:e3:c5:87:b9:30 2452 -65 [WPA-PSK-CCMP+TKIP][WPA2-PSK-CCMP+TKIP][ESS] ChinaNet-7AqL
04:95:e6:52:7b:41 2462 -73 [WPA-PSK-CCMP+TKIP][WPA2-PSK-CCMP+TKIP][ESS] tuopeng
> add_network
0
> set_network 0 ssid "mrj"
OK
> set_network 0 psk "xiaozhou123"
OK
> enable_network 0
OK
> ===>rt_ioctl_giwscan. 27(27) BSS returned, data->length = 5367
<3>CTRL-EVENT-SCAN-RESULTS
<3>Trying to associa==>rt_ioctl_siwfreq::SIOCSIWFREQ(Channel=11)
te with 08:9b:4b:90:7c:91 (SSID='mrj' freq=2462 MHz)
PeerBeaconAtJoinAction(): HT-CtrlChannel=11, CentralChannel=>9
PeerBeaconAtJoinAction(): Set CentralChannel=9
======> !!!LINK UP!!! (BssType=1, AID=8, ssid=mrj, Channel=11, CentralChannel = 9) <=======
<3>Associated with 08:9b:4b:90:7c:91
<3>WPA: Key negotiation completed with 08:9b:4b:90:7c:91 [PTK=CCMP GTK=CCMP]
<3>CTRL-EVENT-CONNECTED - Connection to 08:9b:4b:90:7c:91 completed [id=0 id_str=]
> bssid=08:9b:4b:90:7c:91
freq=0
ssid=mrj
id=0
mode=station
pairwise_cipher=CCMP
group_cipher=CCMP
key_mgmt=WPA2-PSK
wpa_state=COMPLETED
address=00:0c:43:27:14:7f
> status
bssid=08:9b:4b:90:7c:91
freq=0
ssid=mrj
id=0
mode=station
pairwise_cipher=CCMP
group_cipher=CCMP
key_mgmt=WPA2-PSK
wpa_state=COMPLETED
address=00:0c:43:27:14:7f
- 设置ip地址和网关
ifconfig wlan0 192.168.88.235
route add default gw 192.168.88.1
- ping测试
~ # ping 14.215.177.39
PING 14.215.177.39 (14.215.177.39): 56 data bytes
64 bytes from 14.215.177.39: seq=0 ttl=56 time=10.164 ms
64 bytes from 14.215.177.39: seq=1 ttl=56 time=11.623 ms
64 bytes from 14.215.177.39: seq=2 ttl=56 time=15.099 ms
64 bytes from 14.215.177.39: seq=3 ttl=56 time=9.827 ms
64 bytes from 14.215.177.39: seq=4 ttl=56 time=11.593 ms
64 bytes from 14.215.177.39: seq=5 ttl=56 time=18.452 ms
64 bytes from 14.215.177.39: seq=6 ttl=56 time=25.063 ms
64 bytes from 14.215.177.39: seq=7 ttl=56 time=11.188 ms
64 bytes from 14.215.177.39: seq=8 ttl=56 time=14.565 ms
64 bytes from 14.215.177.39: seq=9 ttl=56 time=58.062 ms
64 bytes from 14.215.177.39: seq=10 ttl=56 time=18.459 ms
64 bytes from 14.215.177.39: seq=11 ttl=56 time=15.334 ms
总结
通过上面的过程,wpa_supplicant就已经可以正确使用起来了,但现在使用的是wpa_cli来与wpa_supplicant通过命令进行交互完成WIFI的连接过程,下一步将通过代码来完成上面wap_cli完成的做。