玩轉「Wi-Fi」系列之wpa_supplicant 介紹(七)
簡介
wpa_supplicant是Linux BSD, Mac OSX和Windows的WPA的服務,支援WPA和WPA2(IEEE 802.11i/RSN),它適用於桌上型電腦/筆記本和嵌入式系統,Supplicant是在客戶端站中使用的IEEE 802.1X/WPA元件,它使用WPA身份驗證器實現祕鑰協商,並控制漫遊和IEEEE802.11認證/關聯的WLAN驅動程式
wpa_supplicant被設計成一個在後臺執行的"守護程序"程式,並作為控制無線連線的後端元件,wpa_supplicant支援單獨的前端程式,包含基於文字的前端(wpa_cli)和GUI(wpa_gui)
wpa_supplicant使用靈活的構建配置,可用於選擇包含哪些功能.允許最小程式碼大小(WPA/WPA2-Personal 50kb 130kb的WPA/WPA2-Enterprise中沒有除錯程式碼,450kb大小具有大多數功能和全面的除錯支援,這些示例大小來自X86平臺的構建)
編譯安裝
Installation Environment : Ubuntu 16.04
Download (HTTP): https://w1.fi/releases/wpa_supplicant-2.6.tar.gz
Download MD5 sum: 091569eb4440b7d7f2b4276dbfc03c3c
Download size: 2.6 MB
Estimated disk space required: 36 MB
Estimated build time: 0.4 SBU (includes optional gui)
如圖所示wpa_supplicant的迭代版本 ,最新的版本為2016年10月的2.6版本
- 綠色背景 = 穩定版本
- 白色背景 = 開發版本
- 版本後的字母(釋出中包含的內容)
- d = Host AP driver
- u = Host AP driver utilities
- h = hostapd
- w = wpa_supplicant
第三方依賴
wpa_supplicant 依賴於 openssl , libnl , 需要提前進行安裝。安裝方法自行百度
配置
由於wpa_supplicant 已經許久不更新,配置的方式和通用的開源庫不一樣。
- wpa_supplicant目錄中cp defconfig .config 拷貝生成編譯配置,
- 配置檔案中可以針對功能進行裁剪,適應更多的平臺, 如指定openssl 庫的路徑, 配置libnl的版本
# Uncomment following two lines and fix the paths if you have installed OpenSSL
# or GnuTLS in non-default location
#CFLAGS += -I/usr/local/openssl/include
#LIBS += -L/usr/local/openssl/lib
# Use libnl v2.0 (or 3.0) libraries.
#CONFIG_LIBNL20=y
# Use libnl 3.2 libraries (if this is selected, CONFIG_LIBNL20 is ignored)
#CONFIG_LIBNL32=y
- 指定編譯器,預設的編譯器為GCC,如需要交叉編譯需要修改Makefile
CC=arm-linux-gnueabihf-gcc
- 指定安裝路徑, 預設的安裝路徑為/usr/local/目錄下,交叉編譯的時候需要指定路徑來存放, 方便打包製作檔案系統,同時也不會影響系統, 指定路徑需要修改Makefile 中
20 export LIBDIR ?= /usr/local/lib/
21 export INCDIR ?= /usr/local/include/
22 export BINDIR ?= /usr/local/sbin/
安裝
前面的配置完成之後, 執行make編譯, make install 進行安裝
最終生成的二進位制可執行檔案: wpa_supplicant 和wpa_cli 。
常用操作
wpa_supplicant是一個連線、配置WiFi的工具,它主要包含wpa_supplicant與wpa_cli兩個程式。 可以通過wpa_cli來進行WiFi的配置與連線,前提要保證wpa_supplicant正常啟動。
相當於wpa_supplicant 是服務端,wpa_cli 是客戶端。
- 啟動wpa_supplicant應用
wpa_supplicant -D nl80211 -i wlan0 -c /etc/wpa_supplicant.conf -B
- -D 驅動程式名稱(可以是多個驅動程式:nl80211,wext)
- -i 介面名稱
- -c 配置檔案
- -B 在後臺執行守護程序
ctrl_interface=/var/run/wpa_supplicant //
update_config=1 // 強制更新覆蓋配置
-
ctrl_interface指向的是一個目錄,在這個目錄中預設會生成一個檔案/var/run/wpa_supplicant/wlan0,這是local socket address,相當於UNIX Domain Socket,程式和後臺程式wpa_supplicant進行通訊(其實是wpa_supplicant作為後臺服務程式是通過本地socket和客戶端進行通訊的)
-
update_config = 1時會在(客戶端傳送SAVE_CONFIG命令)更新這個配置檔案。
啟動wpa_cli應用
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> scan_ssid 1
wpa_cli set_network <network id> priority 1 //優先順序
- 新增無密碼的連線
//連線無密碼的ssid 欄位,需要新增key_mgmt=NONE去連線這個網路
network={
key_mgmt=NONE
ssid="wifi-name"
}
set_network num ssid "wifi-name"
set_network num key_mgmt NONE
- 儲存連線
wpa_cli -i wlan0 save_config //資訊儲存到預設的配置檔案中,前面提到的/etc/wpa_supplicant.conf
- 斷開連線
wpa_cli -i wlan0 disable_network <network id>
- 連線已有連線
wpa_cli -i wlan0 list_network //列舉儲存過得連線
wpa_cli -i wlan0 select_network <network id> //連線指定的ssid
wpa_cli -i wlan0 enable_network <network id> //使能制定的ssid
- 網路連線成功的配置檔案示例
ctrl_interface=/var/run/wpa_supplicant/
ap_scan=1
network={
scan_ssid=1
ssid="xxxx"
psk="xxxx"
bssid=
priority=2
}