安裝依賴庫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密碼
}
在一般使用中我們只要設置ssid和psk,其他全部使用默認的,就可以連接上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