宿主機開發環境:Ubuntu 10.10 /Fedora 12 32 bits
目標開發板:Mini6410 arm-linux
內核Kernel: 2.6.38
交叉編譯器CROSS_COMPILE:arm-linux-gcc-4.5.1
4. 編譯wpa_supplicant(增加WPS功能)
#cp defconfig .config
CONFIG_DRIVER_WEXT=y
CONFIG_IEEE8021X_EAPOL=y
CONFIG_EAP_FAST=y
CONFIG_TLS=openssl
CONFIG_TLS=internal
CONFIG_INTERNAL_LIBTOMMATH=y
ifndef CONFIG_INTERNAL_LIBTOMMATH
LTM_PATH=/usr/src/libtommath-0.39
CFLAGS += -I$(LTM_PATH)
LIBS += -L$(LTM_PATH)
LIBS_p += -L$(LTM_PATH)
endif
CONFIG_WPS=y
CONFIG_EAP_WPS=y
#vim .config
CC= gcc -L/usr/local/ssl/lib/
CFLAGS += -I/usr/local/ssl/include/
LIBS += -L/usr/local/ssl/lib/
#make CC=arm-linux-gcc install
※修正WEP中open/share 無法正確選擇
WPA_SUPPLICANT當遇到WEP加密時,由於無法判斷是採用OPEN/SHARE,通常會在聲稱.conf檔中加入auth_alg=OPEN SHARED(至少Android遇到),但事實上某些wifi網卡驅動不能實現同時OPEN和SHARED同時設置,任意時刻只能用一個,這裏給出解決不能同時設置的方法,在wpa_supplicant.c:wpa_supplicant_associate()中加入以下內容:
if (ssid->auth_alg) {
algs = 0;
if (ssid->auth_alg & WPA_AUTH_ALG_OPEN)
algs |= AUTH_ALG_OPEN_SYSTEM;
if (ssid->auth_alg & WPA_AUTH_ALG_SHARED)
algs |= AUTH_ALG_SHARED_KEY;
if (ssid->auth_alg & WPA_AUTH_ALG_LEAP)
algs |= AUTH_ALG_LEAP;
wpa_printf(MSG_DEBUG, "Overriding auth_alg selection: 0x%x",
algs);
//新增這段
if ((algs & AUTH_ALG_OPEN_SYSTEM) && (algs & AUTH_ALG_SHARED_KEY) ) {
algs = AUTH_ALG_SHARED_KEY;
G_TRY_CONNECT ++;
if (G_TRY_CONNECT >= 4) {
algs = AUTH_ALG_OPEN_SYSTEM;
wpa_printf(MSG_DEBUG, "RAYDEBUG--------------------change to ALG_OPEN_SYSTEM");
}
}
}
Wpa_supplicant.conf 說明
#Arm-linux/linux //建立socket
ctrl_interface=/var/run/wpa_supplicant
ctrl_interface_group=wheelupdate_config=1 (可以在wpa_cli中保存配置檔)
#ap_scan=1
#Android //建立socket
ctrl_interface=DIR=/data/misc/wifi
ctrl_interface_group=wifi
update_config=1 (可以在wpa_cli中保存配置檔)
#ap_scan=1
##WPA/WPA2
# WPA-PSK, PSK use ASCII (只要密碼正確就允許)
#network={
# ssid="AcSiP" //AP名稱
#psk="1111111111" //密碼
# #Higher priority use first
# priority=5
#}
# The same as above, assign SSID for AP without brocast SSID(針對那些拒絕廣播SSID的AP)
#network={
#network={
# ssid="second ssid"
# scan_ssid=1
# psk="very secret passphrase"
# priority=2
#}
# Allow WPA-PSK only. Allow any valid password set(允許使用任何合法的加密方式的組合)
#network={
# ssid="example"
# proto=WPA
# key_mgmt=WPA-PSK
# pairwise=CCMP TKIP
# group=CCMP TKIP WEP104 WEP40
# psk=06b4be19da289f475aa46a33cb793029d4ab3db7a23ee92382eb0106c72ac7bb
# priority=2
#}
# Plaintext( Not use 802.1X )明文连接方式(不使用WPA和IEEE802.1X)
#network={
# ssid="plaintext-test"
# key_mgmt=NONE
#}
# Shared WEP, Not use IEEE 802.11 Shared Key(不使用WPA和IEEE802.1X)
network={
ssid=""Test1"
key_mgmt=NONE
# 引號包含的密鑰是ASCII密鑰
wep_key0="abcde"
# 沒有引號包含的密鑰是十六進位密鑰
wep_key1=0102030405
wep_key2="1234567890123"
wep_tx_keyidx=0
priority=5
}
#Shared WEP, Use IEEE 802.11 Shared Key
#network={
# ssid="Test1"
# key_mgmt=NONE
# wep_key0="aaaaa"
# wep_key1="aaaaa"
# wep_key2="aaaaa"
# wep_key3="aaaaa"
# wep_tx_keyidx=0
# priority=5
# auth_alg=SHARED
#}
#IBSS/ad-hoc with WPA-None/TKIP
#network={
# ssid="test adhoc"
# mode=1
# proto=WPA
# key_mgmt=WPA-NONE
# pairwise=NONE
# group=TKIP
# psk="secret passphrase"
#}
wpa_cli說明
# wpa_cli -i <interface> status (看看目前的狀態)
# wpa_cli -i <interface> help (查看參數與指令)
# wpa_cli -i <interface> terminate (關閉wpa_supplicant)
# wpa_cli -i <interface> interface (查看有那些無線網卡介面)
# wpa_cli -i <interface> list_networks (查看wpa_supplicant.conf檔裡的設定)
# wpa_cli -i <interface> select_network (選擇不同的AP,id為AP代號0,1,2,3...)
# wpa_cli -i <interface> enable_network
# wpa_cli -i <interface> disable_network
# wpa_cli -i <interface> remove_network (刪除AP資訊)
# wpa_cli -i <interface> reconfigure (重新讀取wpa_supplicant.conf設定內容)
# wpa_cli -i <interface> save_config (儲存寫入到wpa_supplicant.conf中,否責變更無效)
# wpa_cli -i <interface> disconnect (斷線)
# wpa_cli -i <interface> reconnect (重新連線)
# wpa_cli -i <interface> scan (掃描附近的AP)
# wpa_cli -i <interface> scan_results (印出附近AP的相關資訊)
以上常常用到的差不多是disconnect, reconnect, scan, scan_results, select_network, list_networks, status, reconfigure
測試WPS
wpa_supplicant.conf
##Arm-linux/linux:建立socket
ctrl_interface=/var/run/wpa_supplicant
ctrl_interface_group=0update_config=1
#ap_scan=1
eapol_version=1
fast_reauth=1
##Android:建立socket
ctrl_interface=DIR=/data/misc/wifi
ctrl_interface_group=wifi
update_config=1
#ap_scan=1
eapol_version=1
fast_reauth=1
wpa_cli使用
wpa_supplicant -dd -Dwext -iwlan0 -c/etc/wpa_supplicant/wpa_supplicant.conf&
wpa_cli terminate
Interactive mode
>scan //獲得BSSID
>wps_pbc [BSSID] //開始WPS Push button
>wps_pin <BSSID> [PIN] // 開始WPS PIN方法, PIN
[ 此帖被kazaya在2012-09-19 16:41重新编辑 ]