嵌入式设备WIFI应用开发(1)- wpa_supplicant和wpa_cli的移植和使用

嵌入式设备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的移植。

  1. 获取源码
    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

  2. 编译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.gz

    2.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.patch

    2.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/utils

    2.5、编译wpa_supplicant
    make

  3. 准备wpa_supplicant.conf配置文件
    新建一个名为wpa_supplicant.conf的文件,在文件中写入下面内容:

ctrl_interface=/var/run/wpa_supplicant            
ctrl_interface_group=0                                                 
ap_scan=1
  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拷贝到硬件

  1. 运行ifconfig查看wlan0网络设备状态
    在串口中断运行ifconfig命令,查看是否有wlan0网络接口(网络接口名不一定是wlan0),如果没有wlan0出现,则要看看wifi驱动是否加载了。
  2. 运行wpa_supplicant
    ./wpa_supplicant -B -iwlan0 -c wpa_supplicant.conf -Dwext
  3. 运行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
  1. 设置ip地址和网关
ifconfig wlan0 192.168.88.235
route add default gw 192.168.88.1
  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完成的做。

  • 1
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Android中调试WiFi,通常会使用wpa_supplicantwpa_cli。下面是一些总结和步骤: 1. 在设备上运行wpa_supplicant设备上运行wpa_supplicant,它是一个用于处理WiFi连接的后台进程。可以在终端中使用以下命令启动它: ``` wpa_supplicant -iwlan0 -Dwext -c /data/misc/wifi/wpa_supplicant.conf ``` 其中,`wlan0` 是设备WiFi接口名称,`wext` 是驱动程序的类型,`/data/misc/wifi/wpa_supplicant.conf` 是包含WiFi配置信息的文件路径。 2. 使用wpa_cli进行WiFi连接 wpa_cli是一个命令行工具,用于与wpa_supplicant进行交互并管理WiFi连接。可以在终端中使用以下命令启动它: ``` wpa_cli -iwlan0 ``` 此时会进入wpa_cli交互模式。可以使用以下命令执行一些操作: - `scan` 扫描可用的WiFi网络 - `scan_results` 查看扫描结果 - `add_network` 添加一个新的WiFi网络配置 - `set_network` 设置WiFi网络配置 - `enable_network` 启用WiFi网络 - `disable_network` 禁用WiFi网络 - `status` 查看当前连接状态 例如,如果要连接到名为“mywifi”的WiFi网络,可以执行以下步骤: 1. 扫描可用的WiFi网络 ``` > scan ``` 2. 查看扫描结果 ``` > scan_results ``` 会显示可用的WiFi网络列表,找到名为“mywifi”的网络并记下其network id。 3. 添加一个新的WiFi网络配置 ``` > add_network ``` 会返回一个新的network id。 4. 设置WiFi网络配置 ``` > set_network <network_id> ssid "mywifi" > set_network <network_id> psk "mypassword" ``` 其中,`<network_id>` 是上一步中返回的新的network id,`mywifi` 是WiFi网络的SSID,`mypassword` 是WiFi网络的密码。 5. 启用WiFi网络 ``` > enable_network <network_id> ``` 6. 查看连接状态 ``` > status ``` 如果连接成功,会显示类似于以下内容的信息: ``` wpa_state=COMPLETED ip_address=192.168.1.100 ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值