详细记录丨Realtek RTL8188FU WiFi 命令编译
Hello 大家好,上篇文章我总结了 WiFi 驱动移植及内核配置的教程。
本篇文章介绍一下 WiFi 相关命令的交叉编译,希望对您能有帮助!
1 参考资料
1、编译过程,部分参考资料如下:
【推荐】Linux 添加 WiFi 驱动(https://blog.csdn.net/sbddbfm/article/details/101222266) linux下wifi工具iw的交叉编译(https://blog.csdn.net/weixin_42432281/article/details/85786866) rtl8188 驱动移植 wifi工具移植(https://blog.csdn.net/wmdshhzsmile/article/details/102792811) rtl8188 驱动移植 wifi工具移植(https://blog.csdn.net/wmdshhzsmile/article/details/102792811) rtl8188etv 无线网卡驱动移植(https://blog.csdn.net/imlsq/article/details/72844532)
2、解决问题,部分参考资料如下:
【问题1】line 1: syntax error: unexpected word (expecting ")")(https://blog.csdn.net/qq_26093511/article/details/78932765) 【问题2】wifi模块配置ap模式下出现的问题(https://blog.csdn.net/qq_41877422/article/details/103194360)
3、还有一些其他前辈的教程,十分感谢!
2 环境介绍
1、Ubuntu18.04 ,不加密环境,版本信息如下:
zhaoc@Ubuntu1804:~$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 18.04.5 LTS
Release: 18.04
Codename: bionic
zhaoc@Ubuntu1804:~$ uname -a
Linux Ubuntu1804 5.4.0-54-generic #60~18.04.1-Ubuntu SMP Fri Nov 6 17:25:16 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
2、Linux 内核版本:4.4.179 ;
3、交叉编译链版本
arm-none-linux-gnueabi-gcc
gcc version 4.8.3 20140320 (prerelease) (Sourcery CodeBench Lite 2014.05-29)
3 简要说明
1、简要记录驱动移植过程中,交叉编译的命令、依赖库。
2、简要说明作用及版本等信息。
3.1 iw
1、使用的命令版本:4.9
目前发现 5.0 及以上版本用 arm-linux-gcc 编译都会报错,疑似交叉编译工具的 gcc 版本太低;
2、iw
命令是 iwconfig
命令的替代者,是 Linux 系统上的一款无线配置工具;
(1)参考资料:https://blog.csdn.net/qq_26602023/article/details/106115823
3、文件系统路径:/sbin
4、教程按照 v0.8.x_rtw_r24647.20171025
版本进行编译;
3.2 wpa_cli
1、使用的命令版本:wpa_cli v0.8.x_rtw_r24647.20171025
2、wpa_cli
用来查看设备当前连接 WiFi 状态;
3、文件系统路径:/usr/sbin
3.3 wpa_passphrase
1、使用的命令版本:未知;(应该与 wpa_cli
一致,即 v0.8.x_rtw_r24647.20171025
,使用的同一个源码包)
2、暂时未用到此命令;
3、文件系统路径:/usr/sbin
3.4 wpa_supplicant
1、使用的命令版本:wpa_supplicant v2.9
2、命令作用:
(1)用于连接 WPA/WPA2
加密方式的 WiFi ;
(2)非加密方式的 WiFi ,也可使用此命令连接;
3、文件系统路径:/usr/sbin
3.5 hostapd
1、使用的命令版本:hostapd v2.9
2、命令作用:
(1)配置 WiFi 开启 AP 模式;
(2)参考帮助文档,描述如下:
User space daemon for IEEE 802.11 AP management,
IEEE 802.1X/WPA/WPA2/EAP/RADIUS Authenticator
3、文件系统路径:/bin
3.6 hostapd_cli
1、使用的命令版本:hostapd_cli v2.9
2、暂未使用;
3、文件系统路径:/bin
3.7 依赖库
1、libnl-3.so.200
(1)使用的库版本:libnl-3.5.0.tar.gz
(2)作用:WiFi 相关命令依赖库;
(3)文件系统路径:/lib
2、libnl-genl-3.so.200
(1)使用的库版本:libnl-3.5.0.tar.gz
(2)作用:WiFi 相关命令依赖库;
(3)文件系统路径:/lib
3、libssl.so.1.1
(1)使用的库版本:openssl-1.1.1h.tar.gz
(2)作用:WiFi 相关命令依赖库;
(3)文件系统路径:/lib
4、libcrypto.so.1.1
(1)使用的库版本:openssl-1.1.1h.tar.gz
(2)作用:WiFi 相关命令依赖库;
(3)文件系统路径:/usr/lib
5、补充说明
(1)需要在实际使用命令时,查看缺少的依赖库;
(2)上述 4 个依赖库,是我自己在测试时,发现缺少的;
(3)测试方法:直接运行命令,查看错误提示,根据错误提示添加相应的库文件;
(4)示例代码如下:
[root]#hostapd
hostapd: error while loading shared libraries: libssl.so.1.1: cannot open shared object file: No such file or directory
[root]#
4 交叉编译
进行依赖库、命令的交叉编译。
4.1 openssl
1、解压并进入对应路径
# 解压文件
tar -zxvf openssl-1.1.1h.tar.gz
# 进入文件路径
cd openssl-1.1.1h/
2、配置环境变量文件
(1)创建并编辑 env_nuc980 文件
vim env_nuc980
(2)填入如下内容
export MACHINE=armv4
export RELEASE=4.4.179
export SYSTEM=linux2
export ARCH=arm
export CROSS_COMPILE="arm-none-linux-gnueabi-" # 指定交叉编译链
export HOSTCC=gcc # 指定gcc
(3)保存退出
(4)使用 source 命令使环境变量生效
source env_nuc980
3、修改相关编译配置选项
./config no-asm no-async shared --prefix=/home/zhaoc/11-Soft/13-NUC980/12-armCompileLib_2/11-install/openssl-1.1.1h_nuc980
(1)相关配置项说明
no-asm:在交叉编译过程中不使用汇编代码加速编译过程; shared:生成动态连接库。 no-async:交叉编译工具链没有提供 GNU C 的 ucontext 库 --prefix=:安装路径
(2)安装路径需要修改为自己的安装路径;
4、make 编译;-j6 :使用 6 个逻辑内核同时编译,速度更快;
make -j6
5、安装编译后的文件,到对应路径
make install
4.2 libnl
1、解压并进入对应路径
# 解压文件
tar -zxvf libnl-3.5.0.tar.gz
# 进入对应路径
cd libnl-3.5.0/
2、Ubuntu 需安装必备工具,否则会报错
sudo aptitude install bison
sudo aptitude install flex
(1)没有安装对应软件时,报错内容如下
checking for dlfcn.h... (cached) yes
checking for pthread_mutex_lock in -lpthread... yes
checking for strerror_l... no
configure: WARNING: bison not found. Please install before continuing.
configure: WARNING: flex not found. Please install before continuing.
configure: error: Required packages are missing. Please install them and rerun /configure
root@qddytt:/opt/IPC3516EV200/libnl-3.5.0#
3、修改相关编译配置选项;注意修改为自己的安装路径
./configure --host=arm-none-linux-gnueabi --prefix=/home/zhaoc/11-Soft/13-NUC980/12-armCompileLib_2/11-install/libnl-3.5.0_nuc980
(1)相关配置项说明
--host:指定交叉编译链 --prefix=:安装路径
(2)安装路径需要修改为自己的安装路径;
4、make 编译;-j6 :使用 6 个逻辑内核同时编译,速度更快;
make -j6
5、安装编译后的文件,到对应路径
make install
4.3 iw
1、解压并进入对应路径
# 解压文件
tar -zxvf iw-4.9.tar.gz
# 进入对应路径
cd iw-4.9/
2、配置环境变量;对应 libnl 的安装路径下的 lib/
export PKG_CONFIG_PATH=/home/zhaoc/11-Soft/13-NUC980/12-armCompileLib_2/11-install/libnl-3.5.0_nuc980/lib/pkgconfig:$PKG_CONFIG_PATH
3、使用指定交叉编译链编译
make CC=arm-none-linux-gnueabi-gcc
4、编译完成后,可以使用 file
命令,查看下 iw 文件的属性
(1)本次使用 arm-none-linux-gnueabi-gcc
的属性如下
zhaoc@Ubuntu1804:~/11-Soft/13-NUC980/12-armCompileLib_2/12-sourcecode/iw-4.9$ file iw
iw: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /li
(2)之前使用 arm-linux-gcc
时(错误版本),类似文件( wpa_supplicant )属性如下
wpa_supplicant: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 3.2.0, BuildID[sha1]=abd215c0dc5a490e088db5fc57f26b1efa8b670e, not stripped
(3)命令属性,必须为 ARM
类型的才可以,否则 不能在板子上正常运行 。
4.4 wpa_supplicant
1、解压并进入对应路径
# 解压文件
tar -zxvf wpa_supplicant_hostapd-0.8_rtw_r24647.20171025.tar.gz
# 进入对应路径
cd wpa_supplicant_hostapd-0.8_rtw_r24647.20171025/wpa_supplicant/
2、编辑 Makefile 文件,修改使用的交叉编译链(两处修改),保存退出;
ifndef CC
CC=arm-none-linux-gnueabi-gcc
endif
ifndef CFLAGS
CFLAGS = -MMD -O2 -Wall -g
endif
CC=arm-none-linux-gnueabi-gcc
export LIBDIR ?= /usr/local/lib/
make 编译;-j6 :使用 6 个逻辑内核同时编译,速度更快;
make -j6
4.5 hostapd
1、解压并进入对应路径
# 解压文件
tar -zxvf hostapd-2.9.tar.gz
# 进入对应路径
cd hostapd-2.9/hostapd/
2、使用默认配置文件,创建 config 文件
cp defconfig .config
3、使用 vim 修改 .config ,(取消注释)
#CONFIG_IEEE80211N=y
改为
CONFIG_IEEE80211N=y
否则后续会报错:
~ # hostapd ./hostapd.conf
Configuration file: ./hostapd.conf
Line 7: unknown configuration item 'ieee80211n'
1 errors found in configuration file './hostapd.conf'
Failed to set up interface with ./hostapd.conf
Failed to initialize interface
显示行号路径如下:
156
157 # IEEE 802.11n (High Throughput) support
158 CONFIG_IEEE80211N=y
159
4、备份 Makefile 文件,免得误操作之后还要重新解压一份文件;
cp Makefile Makefile.bak
5、编辑 Makefile 文件,新增如下内容,注意是 新增内容 ;
CC=arm-none-linux-gnueabi-gcc
CFLAGS += -I /home/zhaoc/11-Soft/13-NUC980/14-armCompileLib_20201201/11-install/libnl-3.5.0_nuc980/include
LIBS += -L /home/zhaoc/11-Soft/13-NUC980/14-armCompileLib_20201201/11-install/libnl-3.5.0_nuc980/lib
CFLAGS += -I /home/zhaoc/11-Soft/13-NUC980/14-armCompileLib_20201201/11-install/openssl-1.1.1h_nuc980/include
LIBS += -L /home/zhaoc/11-Soft/13-NUC980/14-armCompileLib_20201201/11-install/openssl-1.1.1h_nuc980/lib -lcrypto -lssl
LDFLAGS += -lpthread
LDFLAGS += -lm
6、添加环境变量,如下所示;
export PKG_CONFIG_PATH=/home/zhaoc/11-Soft/13-NUC980/14-armCompileLib_20201201/11-install/libnl-3.5.0_nuc980/lib/pkgconfig:$PKG_CONFIG_PATH
7、make 编译;-j6 :使用 6 个逻辑内核同时编译,速度更快;
make -j6
8、编译完成后,就会在当前目录生成所需的 hostapd
,hostapd_cli
文件,不需要 make install
即可;
9、使用 file 命令,查看编译后的文件属性,如果属性为 ARM ,即代表可以在开发板上运行;
zhaoc@Ubuntu1804:~/11-Soft/13-NUC980/13-armCompileLib_20201130/12-sourcecode/hostapd-2.9/hostapd$ file hostapd
hostapd: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.3, for GNU/Linux 2.6.16, with debug_info, not stripped
至此,所有使用到的命令均已编译完毕。
5 测试验证
分两步进行,第一步将命令放到文件系统中;第二步测试连接 WiFi 是否正常。
5.1 命令替换
1、替换 wpa_cli wpa_passphrase wpa_supplicant
进入对应目录
# 进入对应目录
cd /usr/sbin/
查看当前目录文件
# 查看当前目录文件
ls -l
删除文件
# 删除文件
rm wpa_cli wpa_passphrase wpa_supplicant
拷贝交叉编译好的命令到当前目录(其他方式均可)
# 拷贝交叉编译好的命令到当前目录
lrz
赋予可执行权限
# 赋予可执行权限
chmod 777 wpa_cli wpa_passphrase wpa_supplicant
直接输入命令,测试是否缺少依赖库
# wpa_supplicant 测试
wpa_supplicant
# wpa_passphrase 测试
wpa_passphrase
# wpa_cli 测试
wpa_cli
2、替换 iw
进入对应目录
# 进入对应目录
cd /sbin/
拷贝 iw 到此目录(其他方式均可)
# 拷贝 iw 到此目录
lrz
可以看到拷贝进来的文件没有执行权限,修改文件权限
chmod 777 iw
直接输入命令,测试是否缺少依赖库
# 输入命令
iw
我的开发板提示缺少库文件: libnl-genl-3.so.200
;则去编译好的 libnl
安装路径中拷贝对应库文件进来即可;相对路径: 11-install\libnl-3.5.0_nuc980\lib
修改新拷贝的库文件权限
chmod 755 libnl-genl-3.so.200
接着再次从命令行输入 iw
测试命令,提示缺少库文件:libnl-3.so.200
;参考上述方法,拷贝文件到对应路径,同样修改库文件权限为 755 ; 再次使用 iw 测试命令,发现没有异常提示,可以正常打印相关配置信息; 此时代表命令已可以正常运行;
5.2 连接 WiFi
1、新增连接 WiFi 的配置文件
(1)创建新文件
# 开发板没有 vim
vi r8000.conf
(2)填入如下内容
ctrl_interface=/var/run/wpa_supplicant
ap_scan=1
network={
ssid="WIFI名称"
psk="WIFI密码明文"
}
2、配置连接 WiFi
# 查看网卡连接状态
wpa_cli -iwlan0 status
# 使用配置文件连接 WiFi
wpa_supplicant -iwlan0 -c ./r8000.conf -B
# 开启网卡(可选)
ifconfig wlan0 up
# 再次查看网卡连接状态
wpa_cli -iwlan0 status
# 设置固定 IP 地址,子网掩码
ifconfig wlan0 192.168.60.1 netmask 255.255.255.0
# 设置默认网关
route add default gw 192.168.60.254
# 修改 DNS ,根据参考资料进行配置;
echo nameserver 223.5.5.5 > /etc/resolv.conf
3、使用 ping 测试 WiFi ,验证是否正常;
ping baidu.com
4、如果可以能 ping 通,则表示命令可以正常运行。
6 总结
本教程为自己在实际使用过程中的经验总结,希望能够帮到您。
好了,本期内容就是这样,祝您一切顺利,我们下期再见!