wap_cli连接wifi(wpa_cli与wpa_supplicant的理解)

前言:

在使用wpa_cli去连接wifi之前我们先了解一下wpa_supplicant。
wpa_supplicant是什么:
是一个项目开源源码,被谷歌修改后加入了Andriod移动平台,它实现了Station对无线网络进行管理和控制的功能,wpa_supplicant是linux系统下一个非常强大的无线网卡管理程序
wpa_supplicant有什么作用:
主要用来加密的,主要支持OPEN,WEP,WPA(TKIP),WPA2(AES)等类型的无线协议与加密认证
wpa_supplicant工作内容:
通过socket(不管是wpa_supplicant与上层还是wpa_supplicant与驱动都采用socket通讯)与驱动交互上报数据给用户,而用户可以通过socket发送命令给wpa_supplicant调动驱动来对WiFi芯片操作。
wpa_supplicant三个成果:

  1. 是WiFi驱动和用户的中转站
  2. 对协议的支持。
  3. 加密认证的支持

wap_cli与wpa_supplicant关系

经过编译后的wpa_supplicant源程序可以看到两个主要的可执行工具:wpa_supplicant和wpa_cli。wpa_supplicant是核心程序,它和wpa_cli的关系就是服务和客户端的关系:后台运行wpa_supplicant,使用wpa_cli来搜索、设置、和连接网络。
换句话说:

wpa_supplicant工具包含wpa_supplicant和wpa_cli这2个程序,其中wpa_supplicant程序作为服务端在后台运行,服务wpa_cli客户端的请求,从而实现WiFi的配置连接

wap_supplicant软件架构
在这里插入图片描述
安卓wifi框架图
在这里插入图片描述
由上图知,wpa_cli是位于Framework中的WifiService,wpa_supplicant也清晰可见,位于kernel智商。

wap_cli连接wifi

在进行wpa_cli连接之前,运行wpa_supplicant,wpa_supplicant程序作为wpa_cli的服务端,必须先启动后,才能给wpa_cli访问使用。

  1. 检查自己的网口(如wlan0)是否开启,可以进入adb shell后,使用如下命令
 #:ifconfig

如果没有开启,可以使用以下命令(效果相当于wifi setting的开启):

#: ifconfig wlan0 up

开启成功执行ifconfig有以下显示:

wlan0     Link encap:Ethernet  HWaddr 36:1b:02:76:0b:91  Driver icnss
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0 
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 
          collisions:0 txqueuelen:3000 
          RX bytes:0 TX bytes:0 
  1. 启动wpa_supplicant服务器: bash #: /vendor/bin/hw/wpa_supplicant -iwlan0 -c/data/vendor/wifi/wpa/wpa_supplicant.conf -B

解释一下上面的命令:

  • /vendor/bin/hw/wpa_supplicant :表示wpa_supplicant可执行程序,并非wpa_supplicant.conf配置文件
  • -B:表示将守护进程wpa_supplicant 挂到后台运行
  • -iwlan0:网络接口wlan0
  • 注意:wpa_supplicant的路径各有不同,wpa_supplicant.conf 路径也各有不同 ,因为AndroidPie9.0 改变了wpa_supplicant.conf 和 ctrl_interface 的路径,所以能正确启动wpa_supplicant的关键就是这边要指定正确的参数路径。
  • -i:指定网口;
  • -D:指定驱动类型(可以是多个驱动程序:nl80211,wext)
  • -c:指定了wpa_supplicant的配置文件。
  • -C : ctrl_interface parameter

开启wpa_cli

格式:wpa_cli -i网口 -p socket所在路径
wpa_cli -i wlan0 -p/data/vendor/wifi/wpa/sockets/

当然,p/data/vendor/wifi/wpa/sockets/默认情况下可以省略,为了更好的解释,这个是wlan0的路径
成功开启wpa_cli的情况:

wpa_cli v2.10-devel-11
Copyright (c) 2004-2019, Jouni Malinen <[email protected]> and contributors

This software may be distributed under the terms of the BSD license.
See README for more details.


Interactive mode
  1. 添加新的网络连接:

add_network
1
set_network 1 ssid “HUAWEI”//ssid
OK
set_network 1 key_mgmt WPA-PSK//设置密码管理方式
OK
set_network 1 psk “xx123456”//设置密码
OK
save_config//保存配置
OK
enable_network 1//使能网络
OK

我们使用list_network看下我们已经加入的网络信息:

> list_network
network id / ssid / bssid / flags
0	HUAWEI	any	

此时应该如果出现了错误:此时是网口(wlan0)未打开,那表示 wpa_cli 没有和wpa_supplicant 建立 socket 连接

status
wpa_state=INTERFACE_DISABLED
p2p_device_address=5e:52:ea:b4:8b:c2
address=fa:8a:fa:16:55:bf
uuid=02e63f31-bd2c-5cc3-9346-5baf6ff11365
<3>CTRL-EVENT-STATE-CHANGE id=0 state=1 BSSID=00:00:00:00:00:00 SSID=thundersoft

如果正确,应该是如下情况:

> status
bssid=9c:3a:9a:87:00:20
freq=2437
ssid=HUAWEI
id=0
mode=station
wifi_generation=4
pairwise_cipher=CCMP
group_cipher=CCMP
key_mgmt=WPA2-PSK
wpa_state=COMPLETED
p2p_device_address=5e:52:ea:b4:8b:c2
address=fa:8a:fa:16:55:bf
uuid=02e63f31-bd2c-5cc3-9346-5baf6ff11365
<3>CTRL-EVENT-STATE-CHANGE id=0 state=9 BSSID=9c:3a:9a:87:00:20 SSID=HUAWEI
<3>CTRL-EVENT-CONNECTED - connection to 9c:3a:9a:87:00:20 completed (auth) [id=0 id_str=]
<3>CTRL-EVENT-STATE-CHANGE id=0 state=6 BSSID=9c:3a:9a:87:00:20 SSID=HUAWEI
<3>Associated with 9c:3a:9a:87:00:30
<3>CTRL-EVENT-CONNECTED - Connection to 9c:3a:9a:87:00:30 completed [id=0 id_str=]
<3>CTRL-EVENT-STATE-CHANGE id=0 state=9 BSSID=9c:3a:9a:87:00:30 SSID=HUAWEI
<3>CTRL-EVENT-SUBNET-STATUS-UPDATE status=0

现在就已经连接成功了,通过wpa_cli连接到指定AP后,此时是不能上网的,因为还未分配正确的IP地址,要分配正确IP地址。

  1. 给连接上网络的手机分配ip:
# ifconfig wlan0 192.168.18.11 

执行ifconfig:

# ifconfig     
wlan0     Link encap:Ethernet  HWaddr fa:8a:fa:16:55:bf  Driver icnss
          inet addr:192.168.18.11  Bcast:192.168.18.255  Mask:255.255.255.0 
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:266 errors:0 dropped:0 overruns:0 frame:0 
          TX packets:6 errors:0 dropped:0 overruns:0 carrier:0 
          collisions:0 txqueuelen:3000 
          RX bytes:37944 TX bytes:750 

看到了我们分配到的ip了
我们ping一下:

# ping 192.168.18.11
PING 192.168.18.11 (192.168.18.11) 56(84) bytes of data.
64 bytes from 192.168.18.11: icmp_seq=1 ttl=64 time=0.371 ms
64 bytes from 192.168.18.11: icmp_seq=2 ttl=64 time=0.290 ms
64 bytes from 192.168.18.11: icmp_seq=3 ttl=64 time=0.289 ms
64 bytes from 192.168.18.11: icmp_seq=4 ttl=64 time=0.274 ms
64 bytes from 192.168.18.11: icmp_seq=5 ttl=64 time=0.282 ms
64 bytes from 192.168.18.11: icmp_seq=6 ttl=64 time=0.288 ms
--- 192.168.18.11 ping statistics ---
6 packets transmitted, 6 received, 0% packet loss, time 5186ms
rtt min/avg/max/mdev = 0.274/0.299/0.371/0.032 ms

未丢包!
到这里我们的连接就结束了
如果只想知道一种,就可以不看下面了,下面这些命令都是在客户端中进行:

  • scan : 扫描附近AP
  • scan_result :列出最近一次扫描的结果
  • list_networks : 列出添加的所有AP
  • add_network :添加一个AP
  • set_network :设置指定AP的相关参数,如 ssid、密码等,具体可参考文件:wpa_supplicant.conf
  • enable_network : 连接指定AP,成功执行该命令后,将会连接到指定的AP,如果未成功连接,请检查AP参数是否有误。

不进入wpa_cli,直接在adb shell内进行连接

启动wpa_cli

wpa_cli -i wlan0 scan          //搜索附件wifi热点
wpa_cli -i wlan0 scan_result   //显示搜索wifi热点
wpa_cli -i wlan0 status        //当前WPA/EAPOL/EAP通讯状态
wpa_cli -i wlan0 ping          //pings wpa_supplicant

添加新的连接

wpa_cli -i wlan0 add_network   //添加一个网络连接,会返回<network id> 
wpa_cli set_network <network id>  ssid '"name"'  //ssid名称 
wpa_cli set_network <network id>  psk '“psk”'  //密码
wpa_cli set_network <network id>  key_mgmt  WPA-PSK   

保存连接

wpa_cli -i wlan0 save_config   //信息保存到默认的配置文件中

断开连接

wpa_cli -i wlan0 disable_network <network id> 

连接已有连接

wpa_cli -i wlan0 list_network  //列举保存过得连接
wpa_cli -i wlan0 select_network  <network id>  //连接指定的ssid 

使能制定的ssid

wpa_cli -i wlan0 enable_network  <network id>  

猜你喜欢

转载自blog.csdn.net/weixin_42271802/article/details/109852902