wpa_supplicant & iwlist移植和使用参考
1. 移植¶
wpa_supplicant是一个用于无线网络连接管理的开源软件,用于与无线访问点进行认证和加密通信,可以在Linux系统中运行,并支持多种无线网卡和驱动程序。wpa_supplicant工具包含wpa_supplicant和wpa_cli这2个程序,其中wpa_supplicant程序作为服务端在后台运行,服务wpa_cli客户端的请求,从而实现WiFi的配置连接。
iwlist是一个用于查看无线网络信息的命令行工具,用于获取和显示与无线网卡相关的信息。
- OpenSSL: 1.1.1i
- libnl: 3.5.0
- wpa_supplicant:2.9
- wireless_tool:29
1.1. 传统方式¶
1.1.1. OpenSSL交叉编译¶
OpenSSL是一个开源的软件库,提供了一组用于安全通信的密码学功能和工具,广泛用于安全协议的实现、加密通信的建立以及数字证书的管理。
1.1.1.1. 源码下载
版本:1.1.1i
1.1.1.2. 交叉编译
资源包下载完成后,解压进入opensl-1.1.1i目录,执行Configure配置文件配置编译工具链和指定相应的安装路径,如下:
tar -zxvf openssl-1.1.1i.tar.gz cd openssl-1.1.1i/ export PATH=/tools/toolchain/gcc-10.2.1-20210303-sigmastar-glibc-x86_64_aarch64-linux-gnu/bin:$PATH ; export ARCH=arm64 ; export CROSS_COMPILE=aarch64-linux-gnu- ./Configure --prefix=$PWD/install linux-aarch64 make clean -j8 make -j8 make install
注意上述示例步骤中的export命令指定的编译链地址,实际操作时请根据真实的编译链路径进行声明。执行上述步骤后将在openssl-1.1.1i/install/
路径下找到生成的头文件和库文件。
1.1.2. libnl交叉编译¶
libnl是一个用于处理与Linux内核Netlink协议通信的C语言库,它简化了与内核通信的过程,隐藏了底层Netlink协议的细节,使开发者能够更方便地编写与网络相关的应用程序。
1.1.2.1. 源码下载
版本:3.5.0
1.1.2.2. 交叉编译
资源包下载完成后,解压进入目录,执行configure文件配置安装目录,如下:
tar -zxvf libnl-3.5.0.tar.gz cd libnl-3.5.0/ export PATH=/tools/toolchain/gcc-10.2.1-20210303-sigmastar-glibc-x86_64_aarch64-linux-gnu/bin:$PATH ; export ARCH=arm64 ; export CROSS_COMPILE=aarch64-linux-gnu- ./configure --host=aarch64-linux-gnu --prefix=$PWD/install/ make clean -j8 make -j8 make install
注意上述示例步骤中的export命令指定的编译链地址,实际操作时请根据真实的编译链路径进行声明。执行上述步骤后将在libnl-3.5.0//install/
路径下找到生成的头文件和库文件。
1.1.3. wpa_supplicant交叉编译¶
1.1.3.1. 源码下载
版本:2.9
1.1.3.2. 交叉编译
资源包下载完成后,解压进入目录,执行configure文件配置编译选项,如下:
tar -zxvf wpa_supplicant-2.9.tar.gz
cd wpa_supplicant-2.9/wpa_supplicant/
cp defconfig .config
修改.config文件:
+CC=/tools/toolchain/gcc-10.2.1-20210303-sigmastar-glibc-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-gcc +CFLAGS += -I../../openssl-1.1.1i/install/include/ +LIBS += -L../../openssl-1.1.1i/install/lib/ -lssl -lcrypto +CFLAGS += -I../../libnl-3.5.0/install/include/ +LIBS += -L../../libnl-3.5.0/install/lib/ ... -CONFIG_CTRL_IFACE_DBUS_NEW=y +#CONFIG_CTRL_IFACE_DBUS_NEW=y
执行如下命令交叉编译:
export PKG_CONFIG_PATH=/home/veahow.chen/opensource/libnl-3.5.0/install/lib/pkgconfig:$PKG_CONFIG_PATH export PATH=/tools/toolchain/gcc-10.2.1-20210303-sigmastar-glibc-x86_64_aarch64-linux-gnu/bin:$PATH ; export ARCH=arm64 ; export CROSS_COMPILE=aarch64-linux-gnu- ./configure --host=aarch64-linux-gnu --with-libs --with-zlib=$PWD/../zlib-1.2.12/ --with-ssl-dir=$PWD/../openssl-1.1.1i/ --exec-prefix=/customer/ssh --prefix=$PWD/install --disable-etc-default-login --disable-strip CC=aarch64-linux-gnu-gcc AR=aarch64-linux-gnu-ar make clean -j8 make -j8
最终将生成程序wpa_supplicant和wpa_cli,原有生成的程序大小较大,可以通过如下命令进行裁剪:
aarch64-linux-gnu-strip wpa_supplicant --strip-unneeded aarch64-linux-gnu-strip wpa_cli --strip-unneeded
该程序依赖libnl-3.so.200、libnl-genl-3.so.200。
1.1.4. iwlist交叉编译¶
1.1.4.1. 源码下载
版本:29
1.1.4.2. 交叉编译
资源包下载完成后,解压进入目录:
tar -zxvf wireless_tools.29.tar.gz
cd wireless_tools.29/
修改Makefile文件:
ifndef PREFIX - PREFIX = /usr/local + PREFIX = ./install endif ... -CC = gcc +CC = aarch64-linux-gnu-gcc -AR = ar +AR = aarch64-linux-gnu-ar -RANLIB = ranlib +RANLIB = aarch64-linux-gnu-ranlib
执行交叉编译指令:
export PATH=/tools/toolchain/gcc-10.2.1-20210303-sigmastar-glibc-x86_64_aarch64-linux-gnu/bin:$PATH ; export ARCH=arm64 ; export CROSS_COMPILE=aarch64-linux-gnu- make clean -j8 make -j8 make install
最终将生成程序iwlist,该程序依赖libiw.so.29。
1.2. 基于Buildroot¶
wpa_supplicant和iwlist分别属于wpa_supplicant和wireless_tools包,版本分别为2.9和30,按如下步骤可直接编译构建:
export PATH=/tools/toolchain/gcc-10.2.1-20210303-sigmastar-glibc-x86_64_aarch64-linux-gnu/bin:$PATH ; export ARCH=arm64 ; export CROSS_COMPILE=aarch64-linux-gnu- cd 3rdparty/buildroot-masters make wpa_supplicant make wireless_tools
通过该方式构建出来的wpa_supplicant依赖动态库libnl-3.so.200、libnl-genl-3.so.200,动态库在3rdparty/buildroot-master/output/target/usr/lib/文件夹下;通过该方式构建出来的iwlist被集成在3rdparty/buildroot-master/output/target/sbin/下。
2. 环境搭建¶
2.1. 拷贝文件¶
将相关文件和库拷贝至project/release/chip/pcupid/dispcam/common/glibc/10.2.1/release/wifi/
的bin
和lib
目录下,并通过chmod +x命令添加可执行权限。
2.2. 镜像打包¶
在project
下执行make image_install
将会打包rz和sz到project/image/output/customer/wifi
下。
3. 测试验证¶
确认板端成功加载某一WiFi驱动后,输入ifconfig wlan0 up
启用WiFi网卡进行测试。
3.1. wpa_supplicant的使用¶
运行wpa_supplicant,wpa_supplicant程序作为wpa_cli的服务端,必须先启动后,才能给wpa_cli访问使用。
wpa_supplicant的手册说明:
wpa_supplicant usage: wpa_supplicant [-BddhKLqqtvW] [-P<pid file>] [-g<global ctrl>] \ [-G<group>] \ -i<ifname> -c<config file> [-C<ctrl>] [-D<driver>] [-p<driver_param>] \ [-b<br_ifname>] [-e<entropy file>] \ [-o<override driver>] [-O<override ctrl>] \ [-N -i<ifname> -c<conf> [-C<ctrl>] [-D<driver>] \ [-p<driver_param>] [-b<br_ifname>] [-I<config file>] ...] drivers: nl80211 = Linux nl80211/cfg80211 wext = Linux wireless extensions (generic) wired = Wired Ethernet driver options: -b = optional bridge interface name -B = run daemon in the background -c = Configuration file -C = ctrl_interface parameter (only used if -c is not) -d = increase debugging verbosity (-dd even more) -D = driver name (can be multiple drivers: nl80211,wext) -e = entropy file -g = global ctrl_interface -G = global ctrl_interface group -h = show this help text -i = interface name -I = additional configuration file -K = include keys (passwords, etc.) in debug output -L = show license (BSD) -N = start describing new interface -o = override driver parameter for new interfaces -O = override ctrl_interface parameter for new interfaces -p = driver parameters -P = PID file -q = decrease debugging verbosity (-qq even less) -t = include timestamp in debug messages -v = show version -W = wait for a control interface monitor before starting
可参考如下命令:
wpa_supplicant -D nl80211 -i wlan0 -c /etc/wpa_supplicant.conf -B
-
-D nl80211:表示驱动类型名称为nl80211
-
-i wlan0:表示网络接口名称为wlan0
-
-c /etc/wpa_supplicant.conf:表示配置文件为wpa_supplicant.conf
-
-B:表示将守护进程wpa_supplicant挂到后台运行
简易的wpa_supplicant.conf参考如下,测试板端是否能连接通过手机热点打开的名为10086的无线网络:
ctrl_interface=/customer/wpa_supplicant ap_scan=1 network={ ssid="10086" psk="123654789" }
示例如下:
成功连接到WiFi后,输入udhcpc -i wlan0 -s /customer/udhcpc.script
可动态获取到IP地址,并通过ifconfig wlan0
查看到信息。
同时手机热点上也能够正常看到连接的设备:
3.2. wpa_cli的使用¶
wpa_supplicant作为服务端已经运行,此时再启动wpa_cli客户端,即可通过wpa_cli客户端进行网络配置的操作。
使用wpa_cli有2种方式,一种是通过进入wpa_cli控制台交互界面进行。
例:
wpa_cli -p/data/system/wpa_supplicant -iwlan0
-p /data/system/wpa_supplicant 就是wpa_supplicant.conf指定的ctrl_interface
-iwlan0 就是wpa_supplicant运行时指定的接口
另一种是不进入控制台交互界面,直接通过串口终端输入完整的命令。本文的WiFi配置将通过这种方式进行介绍。
例:
wpa_cli -p/data/system/wpa_supplicant -iwlan0 help
下面我们将从使用WiFi的常用流程来介绍wpa_cli的使用。所有的命令使用介绍可以通过“wpa_cli -i wlan0 help”命令进行查看。
3.2.1. 扫描周边WiFi热点¶
启动扫描:
wpa_cli -p/data/system/wpa_supplicant -iwlan0 scan
注意:
scan扫描过程需要一定的时间,扫描过程中将使wpa_supplicant处于busy状态,再次发送scan扫描将失败。
查看扫描结果:
wpa_cli -p/data/system/wpa_supplicant -iwlan0 scan_results
注意:
scan_results打印出来的是可获得的wifi的列表,列表包含WiFi热点的ssid(名称)、bssid(mac地址)、signal level(信号强度,单位dBm)、flags(加密类型)等。
可以发现,如果周边有多个热点,打印出来的WiFi列表,一个热点是一行信息,但热点排列的先后顺序不是严格按信号强度signal level(负值)由大到小排列。而且此时再开新的WiFi热点,重新scan,然后scan_results打印结果,会发现新开的WiFi热点,虽然信号强,但也是排在列表很靠后的位置。
所以如果想让WiFi热点按照信号强度由大到小排序,就要在获取到WiFi列表后,自己再根据信号强度进行降序排列,从而实现信号强的WiFi排在前面。
3.2.2. 连接WiFi热点¶
增加一个网络id:
add_network命令会返回一个network id,后面是根据这网络编号来配置WiFi热点。
wpa_cli -i wlan0 add_network
配置WiFi热点的名称ssid:
wpa_cli -i wlan0 set_network 网络编号 ssid '"WiFi名称"'
例:
wpa_cli -i wlan0 set_network 0 ssid '"honor"'
配置WiFi热点的密码psk:
wpa_cli -i wlan0 set_network 网络编号 psk '"密码"'
例:
wpa_cli -i wlan0 set_network 0 psk '"12345678"'
查看网络列表:
wpa_cli -i wlan0 list_network
选择网络:
使用list_network命令,会打印所有已添加成功的WiFi热点,如果有多个WiFi热点,可以使用select_network命令选择使用哪个热点,可实现WiFi热点的切换。
wpa_cli -i wlan0 select_network 网络编号
例:
wpa_cli -i wlan0 select_network 0
注意:
此时只是连接AP成功,并未获取到IP、DNS。可使用udhcpc命令动态获取IP。
例:
udhcpc -q -i wlan0 -s /etc/init.d/udhcpc.script
3.2.3. 查看WiFi状态信息¶
wpa_cli -i wlan0 status
使用status命令,查看当前wifi的信息,包括bssid,ssid,IP等等。
注意:通过status命令查看到WiFi是连接状态,并不能确定就能访问外网,还要查看是否已经获取了IP、DNS等。
3.2.4. 保存WiFi热点信息¶
wpa_cli -i wlan0 save_config
保存WiFi热点信息到配置文件/etc/wpa_supplicant.conf文件中。
3.2.5. 停止使用WiFi热点¶
wpa_cli -i wlan0 disable_network 网络编号
此时还连接着WiFi热点,只是没有激活使用WiFi。
例:
wpa_cli -i wlan0 disable_network 0
3.2.6. 使能WiFi热点¶
wpa_cli -i wlan0 enable_network 网络编号
根据网络编号使能对应的WiFi热点,
例:
wpa_cli -i wlan0 enable_network 0
3.2.7. 断开WiFi热点¶
wpa_cli -i wlan0 disconnect
3.2.8. 重连WiFi热点¶
disconnect断开WiFi后,可以使用reconnect重连原来断开的网络。
wpa_cli -i wlan0 reconnect
3.2.9. 删除WiFi热点¶
删除热点后,热点将从list_network中移除,即不能删除前的网络编号配置WiFi热点。
wpa_cli -i wlan0 disconnect
3.3.iwlist的使用¶
使用iwlist scanning
命令能够搜索到可用的无线热点。