背景:今天想玩一玩wpa_cli,以瞭解wpa_supplicant的一些流程,結果卻一直連接不上。。。記錄一下如何使用wpa_cli來進行wifi調試。
1、啓動WLAN
(1)加載驅動
一般來說,android系統裏面,打開wifi的時候會加載驅動,關閉則會卸載wifi驅動。手動調試的時候,先調用insmod命令加載指定的wifi驅動。
再調用iwconfig可以看到驅動是否加載成功,如下,可以看到wlan0已經有了,則驅動加載成功。
eth0 no wireless extensions.
wlan0 IEEE 802.11bgn ESSID:off/any
Mode:Managed Access Point: Not-Associated Tx-Power=12 dBm
Retry short limit:7 RTS thr:off Fragment thr:off
Encryption key:off
Power Management:on
sit0 no wireless extensions.
lo no wireless extensions.
wlan1 IEEE 802.11bgn ESSID:off/any
Mode:Managed Access Point: Not-Associated Tx-Power=12 dBm
Retry short limit:7 RTS thr:off Fragment thr:off
Encryption key:off
Power Management:on
tunl0 no wireless extensions.
(2)打開wlan0
這個沒什麼好說的,ifconfig wlan0 up
2、啓動wpa_supplicant
命令如下:可以參考下自己init.xxx.rc是如何配置的,參數可能會不一樣。
wpa_supplicant –iwlan0 –Dnl80211 –c 配置文件 &
-i:指定網口;
-D:指定驅動類型;
-c:指定了wpa_supplicant的配置文件。
例如:
wpa_supplicant -d –iwlan0 –Dnl80211 –c/etc/wifi/wpa_supplicant.conf &
配置文件爲/etc/wifi/wpa_supplicant.conf,-d參數是打開wpa_supplicant的打印。
配置文件如下:
update_config=1
ctrl_interface=/data/misc/wifi/sockets
eapol_version=1
ap_scan=1
fast_reauth=1
ps:一開始老是運行不起來,在已經加載驅動,也已up wlan0的情況下,很可能是/data/misc/wifi/sockets的權限不足,導致無法創建wlan0 socket。
確保wpa_supplicant已經運行起來了,可以ps看下。
3、啓動wpa_cli
wpa_cli -i網口 -p socket所在路徑
例如像我剛纔那麼調用的話,則用下面命令啓動:
wpa_cli -iwlan0 -p /data/misc/wifi/sockets/
進入如下界面則已經可以正常調試了。
wpa_cli v2.0-devel-4.4.2_rtw_r12456.20141113_beta
Copyright (c) 2004-2013, 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
>
如果一直顯示如果出現“Could not connect to wpa_supplicant - re-trying”,那表示 wpa_cli 不能和wpa_supplicant 建立 socket 連接,這時要檢查 wpa_supplicant 進程是否還在,還有socket所在路徑wlan0是否存在(在我的例子是/data/misc/wifi/sockets/wlan0)。
4、掃描ap
輸入scan命令
> 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>CTRL-EVENT-STATE-CHANGE id=-1 state=0 BSSID=00:00:00:00:00:00 SSID=
>
wpa_supplicant有“CTRL-EVENT-SCAN-RESULTS ”的回覆,則可以輸入scan_results可以看到掃描結果,如下圖。
scan_results
bssid / frequency / signal level / flags / ssid
0c:72:2c:44:10:9e 2437 -70 [WPS][ESS] SS
d4:61:2e:a2:b9:e5 2437 -57 [WPA2-PSK-CCMP][ESS] HUAWEI G9 Youth
9c:21:6a:d3:9e:a2 2437 -72 [WPA-PSK-CCMP][WPA2-PSK-CCMP][WPS][ESS] helezu
5c:63:bf:5f:9c:be 2462 -82 [WPA-PSK-CCMP][WPA2-PSK-CCMP][ESS] TOPVISION
5、連接
從掃描結果看HUAWEI G9 Youth這個熱點是信號最強的。我們選擇連接這個ap。
> add_network
1
> set_network 1 ssid "HUAWEI G9 Youth"
OK
> set_network 1 key_mgmt WPA-PSK
OK
> set_network 1 psk "xx123456"
OK
> set_network 1 pairwise CCMP
OK
> set_network 1 group CCMP
OK
> set_network 1 proto WPA2
OK
> 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 d4:61:2e:a2:b9:e5 (SSID='HUAWEI G9 Youth' freq=2437 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=HUAWEI G9 Youth
<3>Associated with d4:61:2e:a2:b9:e5
<3>CTRL-EVENT-STATE-CHANGE id=1 state=7 BSSID=d4:61:2e:a2:b9:e5 SSID=HUAWEI G9 Youth
<3>CTRL-EVENT-STATE-CHANGE id=1 state=8 BSSID=d4:61:2e:a2:b9:e5 SSID=HUAWEI G9 Youth
<3>WPA: Key negotiation completed with d4:61:2e:a2:b9:e5 [PTK=CCMP GTK=CCMP]
<3>CTRL-EVENT-CONNECTED - Connection to d4:61:2e:a2:b9:e5 completed (auth) [id=1 id_str=]
<3>CTRL-EVENT-STATE-CHANGE id=1 state=9 BSSID=d4:61:2e:a2:b9:e5 SSID=HUAWEI G9 Youth
步驟如下:
(1)“add_network”,這裏返回網絡ID 爲 1。
(2) 配置網絡的 SSID,執行 set_network 1 ssid AP 的 SSID。
(3)配置網絡的加密方式和密碼。
(4)啓動網絡,執行“enable_network 0”。
(5)收到“CTRL-EVENT-CONNECTED”表示連接成功。
6、分配IP
此時已經連接上ap,dhcp分配一個IP即可。
輸入 q 退出 wpa_cli,執行命令:dhcpcd wlan0
此時已經可以ping通了,在Android系統裏,還需要設置DNS這些,在Android裏,這些流程會有netd來完成,這裏就不說了。