linux下使用shell命令通過wpa_cli控制wpa_supplicant連接wifi


最近在調試wifi,已經把wpa_supplicant 工具編譯打包好了,為了測試wif驅動及wifi模塊是否ok,需要用shell命令臨時啟動wifi服務連接wifi熱點測試。

首先板子啟動用ifconfig后先把wlan0啟動起來

root@p1:/ # busybox-smp ifconfig wlan0 up                          
root@p1:/ # busybox-smp ifconfig                                   
lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:13931 errors:0 dropped:0 overruns:0 frame:0
          TX packets:13931 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1 
          RX bytes:773000 (754.8 KiB)  TX bytes:773000 (754.8 KiB)

wlan0     Link encap:Ethernet  HWaddr 7C:DD:90:EC:F2:1E  
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:2 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

現在wlan0已經up起來了。

然后啟動wpa服務,需要一個wpa_supplicant.conf,我的配置如下

update_config=1
ctrl_interface=/data/misc/wifi/wlan0
eapol_version=1
ap_scan=1
fast_reauth=1

其中的ctrl_interface就是用來和wpa_cli通信使用,其原理是wpa_supplicant是個干活的wifi服務器(比如連接wifi,斷開wifi,啟動熱點等),wpa_cli就是個客戶端,通過本地socket通信連接上wpa_supplicant服務器,發命令叫他干活。

現在把wpa_supplicant服務啟動起來

root@p1:/ # wpa_supplicant -iwlan0 -c/system/etc/wifi/wpa_supplicant.conf -B

-B是在后台運行,如果想要看過程中的詳細log,可以加上參數-dd,然后用logcat同時看log。

現在wpa服務已經起來了,下面用wpa_cli客戶端連接到wpa

wpa_cli -iwlan0 -p/data/misc/wifi/wlan0                
wpa_cli v2.1-devel-4.4.2
Copyright (c) 2004-2013, Jouni Malinen <j@w1.fi> and contributors

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



Interactive mode

> 

以上log顯示已經連接上wpa了

如果wpa異常,cli就無法連接會看到一下log,然后wpa_cli處於阻塞狀態

Could not connect to wpa_supplicant: wlan0 - re-trying

現在我們的wpa_cli已經連上了,可以通過命令來查看當前的wifi狀態

> status
wpa_state=DISCONNECTED
p2p_device_address=7c:dd:90:ec:f2:1e
address=7c:dd:90:ec:f2:1e
<3>CTRL-EVENT-STATE-CHANGE id=-1 state=0 BSSID=00:00:00:00:00:00 SSID=

現在我們還沒有連接網絡,首先使用scan命令掃描一下附近的wifi網絡,然后使用scan_results顯示掃描的結果

> scan
OK
<3>CTRL-EVENT-STATE-CHANGE id=-1 state=3 BSSID=00:00:00:00:00:00 SSID=
<3>CTRL-EVENT-SCAN-RESULTS 
<3>WPS-AP-AVAILABLE 
<3>CTRL-EVENT-STATE-CHANGE id=-1 state=2 BSSID=00:00:00:00:00:00 SSID=
scan scan_interval scan_results
> scan_results 
bssid / frequency / signal level / flags / ssid
50:fa:84:50:31:5e       2472    -75     [WPA-PSK-CCMP][WPA2-PSK-CCMP][ESS]      \xe6\xb5\xb7\xe8\xb1\x9a
28:6c:07:41:ec:32       5745    -83     [WPA-PSK-CCMP+TKIP][WPA2-PSK-CCMP+TKIP][WPS][ESS]       AirFly_5G
5e:ea:1d:8b:2b:58       5745    -86     [WPA2-PSK-CCMP][WPS][ESS]       DIRECT-58-HP M130 LaserJet
f2:85:c1:92:1e:41       5765    -86     [WPA2-PSK-CCMP][ESS]    AIRFLY-921E52
28:6c:07:41:ec:31       2417    -85     [WPA-PSK-CCMP+TKIP][WPA2-PSK-CCMP+TKIP][WPS][ESS]       AirFly
2a:6c:07:41:ec:31       2417    -86     [WPA-PSK-CCMP+TKIP][WPA2-PSK-CCMP+TKIP][WPS][ESS]       AirFly_Guest
dc:fe:18:14:e4:65       5805    -92     [WPA-PSK-CCMP+TKIP][WPA2-PSK-CCMP+TKIP][ESS]    632-5G
f4:28:53:b9:dc:00       5745    -92     [WPA-PSK-CCMP+TKIP][WPA2-PSK-CCMP+TKIP][WPS][ESS]       Tony_5G_O
c0:21:0d:45:10:c1       5260    -76     [ESS]   X-Link 10C1
f4:28:53:a6:ed:f1       5220    -90     [ESS]   PIX-LINK_5G
2a:6c:07:40:ec:31       2417    -89     [ESS]
f4:28:53:a6:ed:f0       2437    -92     [ESS]   PIX-LINK_2.4G

這里也支持命令的tab補全功能,現在已經掃描到附近的一些wifi熱點了,比如AirFly,AirFly_5G等是我們辦公室的無線網,由於這個wifi模塊不支持5G頻道,現在只能連接2.4G的,AirFly

下面我們來添加一個剛才掃描的網絡進來

> add_network 
0
> add_network
1
<network id> <variable> <value> = set network variables (shows
  list of variables when run without arguments)
<network id> <variable> <value> = set network variables (shows
  list of variables when run without arguments)
<network id> <variable> <value> = set network variables (shows
  list of variables when run without arguments)
> set_network 1 ssid "AirFly"
OK
> set_network 1 psk "********"
OK

現在只是添加了網絡,還沒連接,真正連接命令是

enable_network n

后面的參數n就是剛才設置的那個網絡 1

> enable_network 1
OK
<3>CTRL-EVENT-STATE-CHANGE id=-1 state=3 BSSID=00:00:00:00:00:00 SSID=
<3>CTRL-EVENT-SCAN-RESULTS 
<3>WPS-AP-AVAILABLE 
<3>Trying to associate with 28:6c:07:41:ec:31 (SSID='AirFly' freq=2417 MHz)
<3>CTRL-EVENT-STATE-CHANGE id=-1 state=5 BSSID=00:00:00:00:00:00 SSID=
<3>CTRL-EVENT-ASSOC-REJECT status_code=1
<3>CTRL-EVENT-STATE-CHANGE id=1 state=0 BSSID=00:00:00:00:00:00 SSID=AirFly
<3>CTRL-EVENT-ASSOC-REJECT status_code=1
<3>CTRL-EVENT-STATE-CHANGE id=-1 state=3 BSSID=00:00:00:00:00:00 SSID=
<3>CTRL-EVENT-SCAN-RESULTS 
<3>WPS-AP-AVAILABLE 
<3>Trying to associate with 28:6c:07:41:ec:31 (SSID='AirFly' freq=2417 MHz)
<3>CTRL-EVENT-STATE-CHANGE id=-1 state=5 BSSID=00:00:00:00:00:00 SSID=
<3>CTRL-EVENT-ASSOC-REJECT status_code=1
<3>CTRL-EVENT-STATE-CHANGE id=1 state=0 BSSID=00:00:00:00:00:00 SSID=AirFly
<3>CTRL-EVENT-ASSOC-REJECT status_code=1
<3>CTRL-EVENT-STATE-CHANGE id=-1 state=3 BSSID=00:00:00:00:00:00 SSID=
<3>CTRL-EVENT-SCAN-RESULTS 
<3>WPS-AP-AVAILABLE 
<3>Trying to associate with 28:6c:07:41:ec:31 (SSID='AirFly' freq=2417 MHz)
<3>CTRL-EVENT-STATE-CHANGE id=-1 state=5 BSSID=00:00:00:00:00:00 SSID=
<3>CTRL-EVENT-STATE-CHANGE id=1 state=6 BSSID=00:00:00:00:00:00 SSID=AirFly
<3>Associated with 28:6c:07:41:ec:31
<3>CTRL-EVENT-STATE-CHANGE id=1 state=7 BSSID=28:6c:07:41:ec:31 SSID=AirFly
<3>CTRL-EVENT-STATE-CHANGE id=1 state=8 BSSID=28:6c:07:41:ec:31 SSID=AirFly
<3>WPA: Key negotiation completed with 28:6c:07:41:ec:31 [PTK=CCMP GTK=TKIP]
<3>CTRL-EVENT-CONNECTED - Connection to 28:6c:07:41:ec:31 completed (auth) [id=1 id_str=]
<3>CTRL-EVENT-STATE-CHANGE id=1 state=9 BSSID=28:6c:07:41:ec:31 SSID=AirFly
<3>CTRL-EVENT-DISCONNECTED bssid=28:6c:07:41:ec:31 reason=15
<3>CTRL-EVENT-STATE-CHANGE id=1 state=0 BSSID=28:6c:07:41:ec:31 SSID=AirFly
<3>CTRL-EVENT-STATE-CHANGE id=-1 state=3 BSSID=00:00:00:00:00:00 SSID=
<3>CTRL-EVENT-SCAN-RESULTS 
<3>WPS-AP-AVAILABLE 
<3>Trying to associate with 28:6c:07:41:ec:31 (SSID='AirFly' freq=2417 MHz)
<3>CTRL-EVENT-STATE-CHANGE id=-1 state=5 BSSID=00:00:00:00:00:00 SSID=
<3>CTRL-EVENT-STATE-CHANGE id=1 state=6 BSSID=00:00:00:00:00:00 SSID=AirFly
<3>Associated with 28:6c:07:41:ec:31
<3>CTRL-EVENT-STATE-CHANGE id=1 state=7 BSSID=28:6c:07:41:ec:31 SSID=AirFly
<3>CTRL-EVENT-STATE-CHANGE id=1 state=8 BSSID=28:6c:07:41:ec:31 SSID=AirFly
<3>WPA: Key negotiation completed with 28:6c:07:41:ec:31 [PTK=CCMP GTK=TKIP]
<3>CTRL-EVENT-CONNECTED - Connection to 28:6c:07:41:ec:31 completed (auth) [id=1 id_str=]
<3>CTRL-EVENT-STATE-CHANGE id=1 state=9 BSSID=28:6c:07:41:ec:31 SSID=AirFly

這個過程有點長,好幾秒到最后顯示

CTRL-EVENT-CONNECTED - Connection to 28:6c:07:41:ec:31 completed

的時候才是真正連接上了,現在再用status看一下wifi的狀態

> status 
bssid=28:6c:07:41:ec:31
ssid=AirFly
id=1
mode=station
pairwise_cipher=CCMP
group_cipher=TKIP
key_mgmt=WPA2-PSK
wpa_state=COMPLETED
p2p_device_address=7c:dd:90:ec:f2:1e
address=7c:dd:90:ec:f2:1e
<3>CTRL-EVENT-STATE-CHANGE id=1 state=9 BSSID=28:6c:07:41:ec:31 SSID=AirFly
<3>CTRL-EVENT-CONNECTED - connection to 28:6c:07:41:ec:31 completed (auth) [id=1 id_str=]
> quit

現在顯示已經連接上了wifi了,使用quit命令可以退出wpa_cli。

接下來用udhcpc處理ip地址的

root@p1:/ # busybox-smp ifconfig
lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:295043 errors:0 dropped:0 overruns:0 frame:0
          TX packets:295043 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1 
          RX bytes:16374716 (15.6 MiB)  TX bytes:16374716 (15.6 MiB)

wlan0     Link encap:Ethernet  HWaddr 7C:DD:90:EC:F2:1E  
          inet6 addr: fe80::7edd:90ff:feec:f21e/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:468 errors:0 dropped:203 overruns:0 frame:0
          TX packets:10 errors:0 dropped:1 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:136293 (133.0 KiB)  TX bytes:1248 (1.2 KiB)

root@p1:/ # busybox-smp udhcpc -iwlan0
udhcpc (v1.20.0) started
Sending discover...
Sending select for 192.168.11.55...
Lease of 192.168.11.55 obtained, lease time 43200

現在獲取到一個可用的ip地址,使用ifconfig設置給wlan0

root@p1:/ # busybox-smp ifconfig wlan0 192.168.11.55
root@p1:/ # busybox-smp ifconfig
lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:326867 errors:0 dropped:0 overruns:0 frame:0
          TX packets:326867 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1 
          RX bytes:18140948 (17.2 MiB)  TX bytes:18140948 (17.2 MiB)

wlan0     Link encap:Ethernet  HWaddr 7C:DD:90:EC:F2:1E  
          inet addr:192.168.11.55  Bcast:192.168.11.255  Mask:255.255.255.0
          inet6 addr: fe80::7edd:90ff:feec:f21e/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:765 errors:0 dropped:253 overruns:0 frame:0
          TX packets:12 errors:0 dropped:1 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:225470 (220.1 KiB)  TX bytes:1960 (1.9 KiB)

網絡現在算是簡單的配好了,可以和電腦端用ping命令來看下是否連通

在pc上通過cmd窗口ping 192.158.11.55

C:\Users\LXN>ping 192.168.11.55

正在 Ping 192.168.11.55 具有 32 字節的數據:
來自 192.168.11.55 的回復: 字節=32 時間=23ms TTL=64
來自 192.168.11.55 的回復: 字節=32 時間=31ms TTL=64
來自 192.168.11.55 的回復: 字節=32 時間=27ms TTL=64
來自 192.168.11.55 的回復: 字節=32 時間=18ms TTL=64

192.168.11.55 的 Ping 統計信息:
    數據包: 已發送 = 4,已接收 = 4,丟失 = 0 (0% 丟失),
往返行程的估計時間(以毫秒為單位):
    最短 = 18ms,最長 = 31ms,平均 = 24ms

C:\Users\LXN>ping 192.168.11.55

正在 Ping 192.168.11.55 具有 32 字節的數據:
來自 192.168.11.55 的回復: 字節=32 時間=627ms TTL=64
來自 192.168.11.55 的回復: 字節=32 時間=580ms TTL=64
來自 192.168.11.55 的回復: 字節=32 時間=275ms TTL=64
請求超時。

192.168.11.55 的 Ping 統計信息:
    數據包: 已發送 = 4,已接收 = 3,丟失 = 1 (25% 丟失),
往返行程的估計時間(以毫秒為單位):
    最短 = 275ms,最長 = 627ms,平均 = 494ms

已經可以ping通,不過貌似不是很穩定,兩次ping測試有一次丟掉了一個包。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM