linux下WIFI模塊使用:wpa_supplicant工具交叉編譯以及配置


安裝依賴庫openssl

源碼下載:https://github.com/openssl/openssl/releases/tag/OpenSSL_1_1_1b

1) 配置

cd /root/wifi
tar -xvf openssl-OpenSSL_1_1_1b.tar.gz 
cd openssl-OpenSSL_1_1_1b/
./config shared no-asm --prefix=$PWD/build

./config表示根據后面的編譯選項生成一Makefile文件,“shared”表示生成共享庫;“no-asm”表示去掉匯編部分;“–prefix=”后面跟着生成的項目所存放的路徑。

2)修改Makefile:

PLATFORM=arm-linux
CROSS_COMPILE=arm-linux-
CNF_CFLAGS=-pthread
CNF_CXXFLAGS=-std=c++11 -pthread

3)編譯&&安裝

make 
make install

編譯安裝后在/root/wifi/openssl-OpenSSL_1_1_1b/build/lib/目錄內容如下:

# ls /root/wifi/openssl-OpenSSL_1_1_1b/build/lib/
engines-1.1  libcrypto.a  libcrypto.so  libcrypto.so.1.1  libssl.a  libssl.so  libssl.so.1.1  pkgconfig

 4) 復制庫文件到開發板文件系統/usr/lib目錄下

這里需要注意的是,拷貝時使用cp -rf,連同軟鏈接一起拷貝。

 

交叉編譯wpa_supplicant

源碼下載:http://w1.fi/wpa_supplicant/

下載最新版本:http://w1.fi/releases/wpa_supplicant-2.9.tar.gz

1)創建一個.config文件

cd /root/wifi/
tar -xvf wpa_supplicant-2.9.tar.gz
cd wpa_supplicant-2.9/wpa_supplicant
cp defconfig .config

 

2) 修改.config文件

修改如下部分:

# Additional directories for cross-compilation on Linux host for mingw target
#CFLAGS += -I/opt/mingw/mingw32/include/ddk
#LIBS += -L/opt/mingw/mingw32/lib
#CC=mingw32-gcc

 # Additional directories for cross-compilation on Linux host for mingw target
 CFLAGS += -I/root/wifi/openssl-OpenSSL_1_1_1b/build/include
 LIBS += -L/root/wifi/openssl-OpenSSL_1_1_1b/build/lib
 CFLAGS += -I/root/wifi/libnl-3.2.23/build/include
 LIBS += -L/root/wifi/libnl-3.2.23/build/lib
 CC=arm-linux-gcc

CFLAGS為編譯安裝好的openssl的include目錄 和 libnl的include目錄
LIBS為編譯安裝好的openssl的lib目錄 和 libnl的include目錄
CC為交叉編譯工具

libnl庫的交叉編譯見:https://www.cnblogs.com/wanglouxiaozi/p/12828823.html

3)添加環境變量

export PKG_CONFIG_PATH=/root/wifi/libnl-3.2.23/build/lib/pkgconfig:$PKG_CONFIG_PATH

4)編譯

執行make后會出現以下錯誤:

dbus/dbus_dict_helpers.c:10:23: warning: dbus/dbus.h: No such file or directory
In file included from dbus/dbus_dict_helpers.c:14:

修改.config文件,注釋掉以下兩個選項:

#CONFIG_CTRL_IFACE_DBUS_NEW=y
#CONFIG_CTRL_IFACE_DBUS_INTRO=y

繼續執行make,又出現如下錯誤:

../src/drivers/driver_wext.c: In function 'wpa_driver_wext_set_key_ext':
../src/drivers/driver_wext.c:1780: error: 'IW_ENCODE_ALG_AES_CMAC' undeclared (first use in this function)
../src/drivers/driver_wext.c:1780: error: (Each undeclared identifier is reported only once
../src/drivers/driver_wext.c:1780: error: for each function it appears in.)
../src/drivers/driver_wext.c: In function 'wpa_driver_wext_associate':
../src/drivers/driver_wext.c:2215: error: 'IW_AUTH_MFP_DISABLED' undeclared (first use in this function)
../src/drivers/driver_wext.c:2218: error: 'IW_AUTH_MFP_OPTIONAL' undeclared (first use in this function)
../src/drivers/driver_wext.c:2221: error: 'IW_AUTH_MFP_REQUIRED' undeclared (first use in this function)
../src/drivers/driver_wext.c:2224: error: 'IW_AUTH_MFP' undeclared (first use in this function)
Makefile:1990: recipe for target '../src/drivers/driver_wext.o' failed

解決辦法:

在kernel源碼里搜索上述宏:

grep "IW_ENCODE_ALG_AES_CMAC" * -nR /root/linux-3.4.2

得到以下內容:

/root/linux-3.4.2/include/linux/wireless.h:626:#define IW_ENCODE_ALG_AES_CMAC    5
/root/linux-3.4.2/net/wireless/wext-compat.c:699:    case IW_ENCODE_ALG_AES_CMAC:

在/root/linux-3.4.2/include/linux/wireless.h里找出上述未定義的幾個宏,添加到../src/drivers/driver_wext.c的開頭。

下面列出以下幾個宏:

#define IW_ENCODE_ALG_AES_CMAC  5
/* IW_AUTH_MFP (management frame protection) values */
#define IW_AUTH_MFP_DISABLED    0   /* MFP disabled */
#define IW_AUTH_MFP_OPTIONAL    1   /* MFP optional */
#define IW_AUTH_MFP_REQUIRED    2   /* MFP required */
#define IW_AUTH_MFP         12

繼續make,編譯成功。

在當前目錄下(/root/wifi/wpa_supplicant-2.9/wpa_supplicant)生成了wpa_cli、wpa_passphrase、wpa_supplicant可執行程序。

wpa_supplicant是核心程序,它和wpa_cli的關系就是服務和客戶端的關系

wpa_cli用來搜索、設置、和連接網絡。

wpa_passphrase網絡配置可以使用wpa_passphrase工具自動生成並添加到配置文件中。
把這三個文件復制到開發板的根文件/user/bin目錄下就可以使用了。

 使用wpa_supplicant工具連接WIFI

    1) 創建配置文件
wpa_supplicant連接WIFI的時候會從配置文件中讀取賬號和密碼,以及加密方式等, 所以我們再運行wpa_supplicant工具的時候要提前寫好配置文件。
配置文件名稱自定,但是要以 .conf 為后綴,並保存在 /etc/ 目錄下,這邊給出一個配置文件的例子。

ctrl_interface=/var/run/wpa_supplicant  # 一個目錄,用於wpa_supplicant和wpa_cli的socket通信
network={
        ssid="dswei" # WIFI名稱
        psk="baiwenwang123" # WIFI密碼
}

在一般使用中我們只要設置ssidpsk,其他全部使用默認的,就可以連接上WIFI。

2)打開wlan0

ifconfig wlan0 up

3)創建一個socket通信的目錄

mkdir -p /var/run/wpa_supplicant

4)測試和連接WIFI

wpa_supplicant -B -c/etc/plaintext.conf -iwlan0

-B為后台運行,-c為配置文件目錄,plaintext.conf為配置文件的名稱,根據實際情況填寫。其他配置選項可以看wpa_supplicant-2.9/wpa_supplicant/README,然后我們就可以看到開發板和路由器連接上了。

5)測試wifi網絡連通性

ifconfig wlan0 192.168.0.10
ping -I wlan0 192.168.0.1 //192.168.0.1為路由器的IP

 

訪問外網

1)修改/etc/resolv.conf添加DNS:

nameserver 192.168.0.1  #192.168.0.1是路由器的LAN口IP地址

下面兩個DNS是通用的:

nameserver 8.8.8.8 #google域名服務器 
nameserver 8.8.4.4 #google域名服務器

2)設置網關:

route add default gw 192.168.0.1 dev wlan0
route add default gw 192.168.0.1 dev eth0

設置完成后可以查看一下網關是否設置正確:

route -n

或者

netstat -r

3)測試網絡連通性

ping -I wlan0 www.baidu.com
ping -I eth0 www.baidu.com


免責聲明!

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



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