wifi的linux应用及配置
linux下应用wifi,AP侧运行程序hostapd,客户端运行wpa_supplicant。官网:http://w1.fi/。
不是所有的无线网卡都支持所有模式,可以查阅Wireless adapters/Chipset table(https://deviwiki.com/wiki/Wireless_adapters/Chipset_table了解芯片是否支持相应模式。
1. hostapd
通过Hostapd可以将无线网卡切换为AP/Master模式,通过修改配置文件,可以开启开放式,WEP,WPA或WPA2、WPA3等方式的无线网络,等待STA设备的连接; 并且通过修改配置文件可以设置无线网卡的各种参数,包括频率,信号,beacon包时间间隔,是否发送beacon包,如果响应探针请求等等。
hostapd_cli是hostapd的命令行工具。
hostapd /etc/hostapd/hostapd.conf -B
hostapd -B /etc/hostapd/hostapd.conf -P /var/run/data/hostapd_ssid1.pid -dd -t -f /var/run/hostapd.log -B:表示后台运行; -P: 表示这个hostapd进程的PID数保存在这个hostapd_ssid1.pid文件中,便于查看; -dd: 打开更多的调试信息,便于分析; -t: 在log中添加时间戳; -f: 保存hostapd运行的log信息。
ctrl_interface=/var/run/hostapd driver=nl80211 ieee80211n=1 interface=wlan1 hw_mode=g channel=6 beacon_int=100 dtim_period=1 ssid=heater_nano_0000 auth_algs=1 ap_isolate=0 ignore_broadcast_ssid=0
udhcpd.conf
udhcpd /etc/udhcpd/udhcpd.conf &
start 192.168.168.2 end 192.168.168.166 interface wlan1 option subnet 255.255.255.0 option router 192.168.168.168
2. wpa_supplicant
wpa_supplicant本是开源项目源码,被谷歌修改后加入Android移动平台,它主要是用来支持WEP,WPA/WPA2和WAPI无线协议和加密认证的,而实际上的工作内容是通过socket(不管是wpa_supplicant与上层还是wpa_supplicant与驱动都采用socket通讯)与驱动交互上报数据给用户,而用户可以通过socket发送命令给wpa_supplicant调动驱动来对WiFi芯片操作。 简单的说,wpa_supplicant就是WiFi驱动和用户的中转站外加对协议和加密认证的支持。
目前可以使用wireless-tools 或wpa_supplicant工具来配置无线网络。请记住重要的一点是,对无线网络的配置是全局性的,而非针对具体的接口。
wpa_supplicant是一个较好的选择,但缺点是它不支持所有的驱动。请浏览wpa_supplicant网站获得它所支持的驱动列表。另外,wpa_supplicant目前只能连接到那些你已经配置好ESSID的无线网络。wireless-tools支持几乎所有的无线网卡和驱动,但它不能连接到那些只支持WPA的AP。
经过编译后的wpa_supplicant源程序可以看到两个主要的可执行工具:wpa_supplicant和wpa_cli。wpa_supplicant是核心程序,它和wpa_cli的关系就是服务和客户端的关系:后台运行wpa_supplicant,使用wpa_cli来搜索、设置、和连接网络。
wpa_cli监控wpa连接断开等事件参考:用Raspberry Pi學Embedded Linux (4) — 利用C語言設定Wi-Fi。
wpa_supplicant [-BddfhKLqqtuvW] [-P<pid file>] [-g<globalctrl>] \
[-G<group>] \
-i<ifname> -c<config file> [-C<ctrl>] [-D<driver>][-p<driver_param>] \
[-b<br_ifname> [-MN -i<ifname> -c<conf>[-C<ctrl>] [-D<driver>] \
[-p<driver_param>] [-b<br_ifname>] [-m<P2P Device configfile>] ...
选项
-b= 可选的桥接接口名称
-B= 后台运行
-c= 配置文件路径
-C= ctrl_interface 参数(仅在-c不使用的时候使用)
-i= 接口名称
-d= 增加调试信息详细程度(-dd显示更多)
-D= 驱动名称
-f= 将日志输出到默认日志位置(通常为/ tmp)
-g= 全局ctrl_interface
-G= 全局 ctrl_interface group
-K= 包括密钥信息在调试中输出
-t= 调试信息添加时间戳
-h= 显示帮助文档
-L= 显示许可证
-p= 驱动程序参数
-P= PID 文件
-q= 减少调试信息详细程度(-qq更少)
-u= 驱动 DBus control interface
-v= 显示版本
-W= 在启动之前等待control interface monitor
-M= 开始描述匹配接口
-N= 开始描述新接口
-m= P2P Device的配置文件
驱动
nl80211 = Linux nl80211/cfg80211 wext = Linux wireless extensions (generic) wired = wpa_supplicant wired Ethernet driver roboswitch = wpa_supplicant Broadcom switch driver bsd= BSD 802.11 support (Atheros, etc.) ndis = Windows NDIS driver
wpa_cli
wpa_cli是一个基于文本的前端程序,用于与wpa_supplicant 进行交互。它用于查询当前状态,更改配置,触发事件并请求交互式用户输入。
wpa_cli支持两种模式:交互式和命令行。
wpa_cli命令:
status = 获取当前WPA/EAPOL/EAP 状态
mib= 获取MIB变量
help = 显示帮助文档
interface [ifname] = 连接接口
level <debug level> = 改变debug等级
license = 显示wpa_cli证书
logoff = IEEE 802.1X EAPOL state machine logoff
logon = IEEE 802.1X EAPOL state machine logon
set= 设置变量
pmksa = 显示PMKSA缓存
reassociate= 强制重新连接
reconfigure =强制wpa_supplicant重新读取配置文件
preauthenticate <BSSID> = 强制预先认证
identity <network id> <identity> = 为SSID配置身份
password <network id> <password> =为SSID配置密码
pin<network id> <pin> = 为SSID配置引脚
otp<network id> <password> = 为SSID配置临时密钥
passphrase <network id> <passphrase> =为SSID配置私钥
bssid <network id> <BSSID> = 为SSID设置首选BSSID
list_networks = 列举已经配置的网络
select_network <network id> = 选择网络(关闭其他)
enable_network <network id> = 启用网络
disable_network <network id> = 禁用网络
add_network = 添加网络
remove_network <network id> = 删除网络
set_network <network id> <variable> <value> =设置网络变量
get_network<network id> <variable> = 获取网络变量
save_config = 保存当前配置
disconnect = 断开连接,等待重新连接命令
scan = 扫描
scan_results = 扫描结果
get_capability <eap/pairwise/group/key_mgmt/proto/auth_alg> = 获取能力
terminate = 终止wpa_supplicant
quit = 退出wpa_cli
wpa_cli [-p<path to ctrl sockets>][-i<ifname>] [-hvB] [-a<action file>] \ [-P<pid file>] [-g<global ctrl>] [command..] -h= 显示使用文档 -v=显示版本信息 -a= 以守护进程方式运行 -B= 后台运行 默认套接字路径: /var/run/wpa_supplicant 默认接口:在套接字路径中找到的第一个接口
ifconfig wlan1 192.168.168.168 up ifconfig wlan1 192.168.168.168 up hostapd ../confiles/hostapd.conf -B udhcpd ../confiles/udhcpd.conf & hostapd /etc/hostapd.conf -B udhcpd /etc/udhcpd.conf & hostapd_cli set ssid AP_FAE243 hostapd_cli reload wpa_cli -i wlan0 scan wpa_cli -i wlan0 scan_results wpa_cli -i wlan0 scan_results|grep ':' |awk -F '\t' '{if($5 != ""){print $5}}'|sort|uniq ifconfig wlan0 up ifconfig wlan0 up wpa_supplicant -D nl80211 -i wlan0 -c /etc/wpa_supplicant.conf -B wpa_cli -i wlan0 remove_network 0 wpa_cli -i wlan0 list_network wpa_cli -i wlan0 add_network wpa_cli -i wlan0 set_network 0 ssid '"wang\xe4\xb8\xad\xe6\x96\x87K40"' wpa_cli -i wlan0 set_network 0 psk '"88123456"' wpa_cli -i wlan0 set_network 0 ssid '"wangK40"' wpa_cli -i wlan0 set_network 0 psk '"88123456"' wpa_cli -i wlan0 select_network 0 udhcpc -i wlan0 -q wpa_cli -i wlan0 status
wpa_states的取值如下:
WPA_DISCONNECTED: 表示当前未连接到任何无线网络。 WPA_INTERFACE_DISABLED: 代表当前此wpa_supplicant所使用的网络设备被禁用。 WPA_INACTIVE: 代表当前此wpa_supplicant没有可连接的无线网络。 这种情况包括周围没有无线网络, 以及有无线网络, 但是因为没有配置信息( 如没有设置密码等) 而不能发起认证及关联请求的情况。 WPA_SCANNING、 WPA_AUTHENTICATING、 WPA_ASSOCIATING: 分别表示当前wpa_supplicant正处于扫描无线网络、 身份验证、 关联过程中。 WPA_ASSOCIATED: 表明此wpa_supplicant成功关联到某个AP。 WPA_4WAY_HANDSHAKE: 表明此wpa_supplicant处于四次握手处理过程中。 当使用PSK( 即WPA/WPA2-Personal) 策略时, STA收到第一个EAPOL-Key数据包则进入此状态。 当使用WPA/WPA2-Enterprise方法时, 当STA完成和RAIDUS身份验证后则进入此状态。 WPA_GROUP_HANDSHAKE: 表明STA处于组密钥握手协议处理过程中。 当STA完成四次握手协议并收到组播密钥交换第一帧数据后即进入此状态( 或者四次握手协议中携带了GTK信息, 也会进入此状态。 详情见4.5.5节EAPOL-Key交换流程分析) 。 WPA_COMPLETED: 所有认证过程完成, wpa_supplicant正式加入某个无线网络。
wpa_passphrase
使用wpa_passphrase快速连接到其SSID已知的网络,wpa_passphrase是一种命令行工具,可生成wpa_supplicant所需的最小配置。
$ wpa_passphrase MYSSID 密码
3. 模式切换
参考明远智睿MY-IMX6-EK200:MYZRIMX6EK200RTL8188EUSWIFIAP
udhcpc默认脚本/usr/share/udhcpc/default.script
参考正点原子:
#!/bin/sh #正点原子@ALIENTEK #USB WIFI脚本 #功能:脚本支持station模式、softap模式、bridge模式相互切换(若相互切换不成功,请重启板子) #使用方法说明 usage_and_exit() { echo "" echo "*****************************************************************************************" echo "*usage: ${0##*/} [-m mode] [-i ssid] [-p psk] [-d device] [-e ethernet] [-h]*" echo "* *" echo "*station mode eg:${0##*/} -m station -i ssid -p psk -d wlan0 *" echo "* *" echo "*softap mode eg: ${0##*/} -m softap -d wlan0 *" echo "* *" echo "*bridge mode eg:${0##*/} -m bridge -d wlan0 -e eth0 *" echo "*eg: ${0##*/} -m mode mode=[ station | softap | bridge ] *" echo "*****************************************************************************************" echo "" return } #使用方法举例: #source ./alientek_usb_wifi_setup.sh -m bridge -d wlan0 -e eth0 #source ./alientek_usb_wifi_setup.sh -m station -i ALIENTEK -p 15902020353 -d wlan0 #source ./alientek_usb_wifi_setup.sh -m softap -d wlan0 #版本信息 version() { echo "version 1.0" echo "作者:DZM@ALIENTEK" } #获取参数 while [ $# -gt 0 ]; do case $1 in --help | -h) usage_and_exit $0;break;; -m) shift; mode=$1; shift; ;; -i) shift; ssid=$1; shift; ;; -p) shift; psk=$1; shift; ;; -d) shift; device=$1; shift; ;; -e) shift; ethernet=$1; shift; ;; --version) version $0; break;; *) usage_and_exit; break; ;; esac done #判断参数 if [ -n "$mode" ]; then echo "您的WIFI配置信息是:" echo "mode : $mode" fi if [ -n "$ssid" ]; then echo "ssid : $ssid" echo "psk : $psk" fi if [ -n "$device" ]; then echo "device: $device" fi if [ -n "$ethernet" ]; then echo "ethernet : $ethernet" fi #kill掉相关进程 processkill() { a=$(ps -aux |grep -E "hostapd" | grep -v grep | awk '{print $2}') if [ -n "$a" ];then kill -9 $a fi a=$(ps -aux |grep -E "udhcpd" | grep -v grep | awk '{print $2}') if [ -n "$a" ];then kill -9 $a fi a=$(ps -aux |grep -E "wpa_supplicant" | grep -v grep | awk '{print $2}') if [ -n "$a" ];then kill -9 $a fi a=$(ps -aux |grep -E "udhcpc" | grep -v grep | awk '{print $2}') if [ -n "$a" ];then kill -9 $a fi } #创建配置wifi的信息 touch /$PWD/wifi.conf wifi_conf="/$PWD/wifi.conf" #bridge Mode(桥接模式) if [ "$mode" == "bridge" ]; then ifconfig $device down ifconfig $device up ifconfig $ethernet down ifconfig $ethernet up sleep 2 if [ "$WIFI_MODE" == "station" ]; then wpa_supplicant -B -D wext -i $device -c /etc/wpa_supplicant.conf fi processkill sleep 1 sync echo -ne "interface=wlan0\nssid=alientek_bridge\ndriver=rtl871xdrv\nchannel=6\nhw_mode=g\nignore_broadcast_ssid=0\n auth_algs=1\nwpa=3\nwpa_passphrase=12345678\nwpa_key_mgmt=WPA-PSK\nwpa_pairwise=TKIP\nrsn_pairwise=CCMP\nbridge=br0" > $wifi_conf rm -rf /var/lib/misc/* touch /var/lib/misc/udhcpd.leases udhcpd -fS /etc/udhcpd.conf & ifconfig $device 0.0.0.0 brctl addbr br0 ifconfig $ethernet 0.0.0.0 brctl addif br0 $ethernet brctl addif br0 $device ifconfig br0 192.168.1.39 netmask 255.255.255.0 hostapd $wifi_conf -B export WIFI_MODE=bridge fi #softap Mode(热点模式) if [ "$mode" == "softap" ]; then processkill sleep 1 sync echo -ne "interface=wlan0\nssid=alientek_softap\ndriver=rtl871xdrv\nchannel=6\nhw_mode=g\nignore_broadcast_ssid=0\n auth_algs=1\nwpa=3\nwpa_passphrase=12345678\nwpa_key_mgmt=WPA-PSK\nwpa_pairwise=TKIP\nrsn_pairwise=CCMP" > $wifi_conf a=$(ifconfig |grep -E "br0" | grep -v grep | awk '{print $0}') if [ -n "$a" ];then brctl delif br0 $device brctl delif br0 $device ifconfig br0 down fi rm -rf /var/lib/misc/* touch /var/lib/misc/udhcpd.leases ifconfig $device up sleep 2 ifconfig $device 192.168.1.38 netmask 255.255.255.0 udhcpd -fS /etc/udhcpd.conf & hostapd $wifi_conf -B export WIFI_MODE=softap fi #station Mode(上网模式) if [ "$mode" == "station" ]; then processkill sleep 1 sync a=$(ifconfig |grep -E "br0" | grep -v grep | awk '{print $0}') if [ -n "$a" ];then brctl delif br0 $device brctl delif br0 $device ifconfig br0 down fi echo -ne "ctrl_interface=/var/run/wpa_supplicant\n update_config=1\nnetwork={\nssid=\"$ssid\"\npsk=\"$psk\"\n}\n" > $wifi_conf rm -rf /var/lib/misc/* ifconfig eth0 down ifconfig eth1 down ifconfig waln0 down ifconfig wlan0 up sleep 2 wpa_supplicant -B -D wext -i $device -c $wifi_conf udhcpc -R -b -i wlan0 route add default gw 192.168.1.1 export WIFI_MODE=station fi #删除wifi.conf rm -rf /$PWD/wifi.conf case $mode in softap|station|bridge)echo "WIFI设置$mode模式完成!" ;; esac #卸载环境变量 unset device unset wifi_conf unset a unset ethernet unset mode unset ssid unset psk sync
# Sample udhcpd configuration file (/etc/udhcpd.conf) # The start and end of the IP lease block start 192.168.111.20 #default: 192.168.0.20 end 192.168.111.254 #default: 192.168.0.254 # The interface that udhcpd will use interface wlp4s0 #default: eth0 # The maximim number of leases (includes addressesd reserved # by OFFER's, DECLINE's, and ARP conficts #max_leases 254 #default: 254 # If remaining is true (default), udhcpd will store the time # remaining for each lease in the udhcpd leases file. This is # for embedded systems that cannot keep time between reboots. # If you set remaining to no, the absolute time that the lease # expires at will be stored in the dhcpd.leases file. #remaining yes #default: yes # The time period at which udhcpd will write out a dhcpd.leases # file. If this is 0, udhcpd will never automatically write a # lease file. (specified in seconds) #auto_time 7200 #default: 7200 (2 hours) # The amount of time that an IP will be reserved (leased) for if a # DHCP decline message is received (seconds). #decline_time 3600 #default: 3600 (1 hour) # The amount of time that an IP will be reserved (leased) for if an # ARP conflct occurs. (seconds #conflict_time 3600 #default: 3600 (1 hour) # How long an offered address is reserved (leased) in seconds #offer_time 60 #default: 60 (1 minute) # If a lease to be given is below this value, the full lease time is # instead used (seconds). #min_lease 60 #defult: 60 # The location of the leases file #lease_file /var/lib/misc/udhcpd.leases #defualt: /var/lib/misc/udhcpd.leases # The location of the pid file #pidfile /var/run/udhcpd.pid #default: /var/run/udhcpd.pid # Everytime udhcpd writes a leases file, the below script will be called. # Useful for writing the lease file to flash every few hours. #notify_file #default: (no script) #notify_file dumpleases # <--- useful for debugging # The following are bootp specific options, setable by udhcpd. #siaddr 192.168.0.22 #default: 0.0.0.0 #sname zorak #default: (none) #boot_file /var/nfs_root #default: (none) # The remainer of options are DHCP options and can be specifed with the # keyword 'opt' or 'option'. If an option can take multiple items, such # as the dns option, they can be listed on the same line, or multiple # lines. The only option with a default is 'lease'. #Examles opt dns 114.114.114.114 8.8.8.8 option subnet 255.255.255.0 opt router 192.168.111.11 opt wins 192.168.111.10 option dns 129.219.13.81 # appened to above DNS servers for a total of 3 option domain local option lease 864000 # 10 days of seconds # Currently supported options, for more info, see options.c #opt subnet #opt timezone #opt router #opt timesrv #opt namesrv #opt dns #opt logsrv #opt cookiesrv #opt lprsrv #opt bootsize #opt domain #opt swapsrv #opt rootpath #opt ipttl #opt mtu #opt broadcast #opt wins #opt lease #opt ntpsrv #opt tftp #opt bootfile #opt wpad # Static leases map #static_lease 00:60:08:11:CE:4E 192.168.0.54 #static_lease 00:60:08:11:CE:3E 192.168.0.44
start 192.168.111.20 #default: 192.168.0.20 end 192.168.111.254 #default: 192.168.0.254 interface wlp4s0 #default: eth0 opt dns 114.114.114.114 8.8.8.8 option subnet 255.255.255.0 opt router 192.168.111.11 opt wins 192.168.111.10 option dns 129.219.13.81 # appened to above DNS servers for a total of 3 option domain local option lease 864000 # 10 days of seconds
4. 无线网卡应用
无线网卡的应用服务程序为wpa_supplicant,其systemd配置文件为/lib/systemd/system/wpa_supplicant.service,内容如下。
[Unit] Description=WPA supplicant Before=network.target [Service] Type=simple ExecStart=/sbin/wpa_supplicant -Dnl80211 -iwlan0 -c /etc/wpa_supplicant.conf ExecReload=/sbin/wpa_supplicant -Dnl80211 -iwlan0 -c /etc/wpa_supplicant.conf RestartSec=120 Restart=on-failure [Install] WantedBy=multi-user.target Alias=dbus-fi.epitest.hostap.WPASupplicant.service
无线网卡上网方式的配置文件为/etc/wpa_supplicant.conf,样例如下:
ctrl_interface=/var/run/wpa_supplicant update_config=1 network={ scan_ssid=1 ssid="test" psk="123456" key_mgmt=WPA-PSK pairwise=CCMP }
通过修改配置文件可以实现连接不同wifi。
5. wifi配置项
无线WiFi一般需要配置的项如下:
ssid="xxx" 热点名称
psk="xxx" 连接密码
key_mgmt=xxx 认证方式
pairwise=xxx ,这个就是加密方式
注:key_mgmt项有三种取值 auto,wep,wpa2_psk
- 当为wep时,则key_mgmt=WPA-EAP
- 当为wpa2_psk时,则key_mgmt=WPA-PSK
- 当为auto时,则key_mgmt这项去掉
pairwise项有三种取值auto,tkip,aes
- 当为aes时,则pairwise=CCMP
- 当为tkip时,则pairwise=TKIP
- 当为auto时,则pairwise这项去掉
wifi认证方式和加密算法的区别
wifi认证方式相当于身份认证,如同你是警察,要看对方是不是警察,若是则认证通过,可以进一步交流,否则认证失败,不予交流;
这里认证的依据有两个,一个是认证方式要相同或者兼容,认证方式包括WEP,WPA-PSK,WPA2-PSK,WPA/WPA2-PSK,其中WPA/WPA2-PSK是兼容WPA-PSK和WPA2-PSK的,WPA2-PSK是不兼容WPA-PSK的,你是WEP,对方也要是WEP,你是WPA-PSK,对方也要是WPA-PSK,这个清楚就可以了;第二个依据就是每次使用WiFi网络前都需要手动输入的密码,这个要输入正确才能完成认证。
还有就是WPA-PSK,WPA2-PSK,后面带PSK主要是说明是家庭网络或者小公司网络使用的,输入密码就可以使用,而WPA和WPA2是其他大型公司网络使用的,需要输入其他信息例如后台服务器的IP地址等,使用复杂些,需要后台服务器,但是安全性更高。
wifi加密算法是为了保证wifi通信数据的安全,不被窃听,是对wifi通信数据的加密方式;如同你们都是警察了,可以展开交流,但是你们要用暗号交流,才能保证不被别人窃听交流内容。
这时加密方式主要有:
如果是WPA-PSK认证方式,就是TKIP算法;如果是WPA2-PSK模式,就是CCMP算法(注意CCMP算法的核心是AES算法,所以好多时候不提CCMP,就提AES了);同时WPA2-PSK也可以使用TKIP算法,WPA-PSK也可以使用AES算法,可以理解成加密方式大家都可以用,就是一种算法而已,但是AES比TKIP保密性更高,不容易被攻破。
还有就是wifi加密算法采用的秘钥是双方认证通过后,协商好的。这个秘钥和我们手动输入的wifi密码,不是一码事。
不公网络认证方式设置
1)open(开放式认证方式,分为): wpa_cli -iwlan0 set_network 0 ssid '"wlan"'(PS:wlan是无线的ssid号,外面是一对双引号,然后再外面是一对单引号) wpa_cli -iwlan0 set_network 0 key_mgmt NONE 2)wep(分为开放式和共享式): wpa_cli -iwlan0 set_network 0 ssid '"wlan"' wpa_cli -iwlan0 set_network 0 key_mgmt NONE wpa_cli -iwlan0 set_network 0 wep_key0 '"wlan_key"' 如果是共享式,还需要配置:wpa_cli -iwlan0 set_network 0 auth_alg SHARED(默认是开放式,可以不配置) 3)WPA/WPA2-Personal认证方式: wpa_cli -iwlan0 set_network 0 ssid '"wlan"' wpa_cli -iwlan0 set_network 0 key_mgmt WPA-PSK wpa_cli -iwlan0 set_network 0 proto WPA(WPA2) wpa_cli -iwlan0 set_network 0 pairwise TKIP(CCMP) wpa_cli -iwlan0 set_network 0 group TKIP(CCMP) wpa_cli -iwlan0 set_network 0 psk '"wlan_password"' 4)WPA/WPA2-Enterprise认证方式: wpa_cli -iwlan0 set_network 0 ssid '"wlan"' wpa_cli -iwlan0 set_network 0 key_mgmt WPA-EAP wpa_cli -iwlan0 set_network 0 pairwise TKIP(CCMP) wpa_cli -iwlan0 set_network 0 group TKIP(CCMP) wpa_cli -iwlan0 set_network 0 eap PEAP wpa_cli -iwlan0 set_network 0 identity '"username"' wpa_cli -iwlan0 set_network 0 password '"password"' 如果是WPA2-Enterprise认证:需要设置proto:wpa_cli -iwlan0 set_network 0 protoWPA2
参考:
1.https://zhidao.baidu.com/question/262985839589669205.html 配置项解释
5. USB-WIFI模块调试 softAP和station
6. [wpa_supplicant]基于ubuntu的wpa_supplicant工具的安装与使用