1. 程式人生 > >玩轉「Wi-Fi」系列之wpa_supplicant 介紹(七)

玩轉「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版本
versions.png

  • 綠色背景 = 穩定版本
  • 白色背景 = 開發版本
  • 版本後的字母(釋出中包含的內容)
    • 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
}

參考