本帖最后由 翠花儿 于 2021-6-21 12:18 编辑
1 实验环境使用到的硬件是迅为电子的 imx6Q开发板(板载 RTL8723wifi 模块),开发板上运行的操作系统是升级版的QT5.7设备树文件系统(所以开发环境搭建可以参考《i.mx6Q开发板使用手册》“搭建交叉编译环境”的章节)。如果大家使用的是其它的文件系统,需要注意的是搭建交叉编译环境所需要的交叉编译器一定要和制作文件系统使用的交叉编译器一致。 2 交叉编译 openssl使用 ssh 上传本压缩包里面的“openssl-1.0.1s.tar.gz”到 UBuntu 系统,如图所示: 然后在终端输入“tar -xvf openssl-1.0.2h.tar.gz”,开始解压 openssl,如图所示: 解压完成会生成“openssl-1.0.2h”目录,如图所示: 我们使用“cd openssl-1.0.2h”命令,进入“openssl-1.0.2h”目录,如图所示: 然后我们在终端输入“./config no-asm shared --prefix=$(pwd)/install”命令 no-asm:是在交叉编译过程中不使用汇编代码代码加速编译过程,原因是它的汇编代码 是对 arm 格式不支持的; Shared:生成动态连接库; file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml3944\wps170.png--prefix:指定 make install 后生成目录的路径(我们安装到当前目录的 install 文件夹里面); 运行结果如图所示: 然后我们使用“vi Makefile”命令,打开 Makefile 文件,如图所示: 我们需要修改 Makefile 文件里面的“CC,AR,RANLIB,MM,SHARED_LDFLAGS“这几个变量,这几个变量分别改成: CC= arm-linux-gnueabihf-gcc 删除 CFLAGS=中的 m64 AR= arm-linux-gnueabihf-ar $(ARFLAGS) r RANLIB= arm-linux-gnueabihf-ranlib NM= arm-linux-gnueabihf-nm SHARED_LDFLAGS= 最终修改结果如图所示: 按照上面的修完完成以后保存并退出,接着在终端输入“make”命令,可以编译 openssl,运行结果如图所示: 编译完成如图所示: 接着我们在终端输入“make install”安装命令,如图所示: 执行完“make install”命令,会将编译生成的库文件,以及一些头文件拷贝到“install” 文件夹,如图所示: 至此关于 openssl 的安装完成了。 3 交叉编译 libnl 使用 ssh 上传本压缩包里面的“libnl-3.2.25.tar.gz”到 Ubuntu 系统(与上面的 openssl 在同一个目录下),如图所示: 然后在终端输入“tar -xvf libnl-3.2.25.tar.gz”解压命令,如图所示: 解压完成以后使用“cd libnl-3.2.25”进入到 libnl 目录,如图所示: 然后我们在终端输入“./configure --host= arm-linux --prefix=$(pwd)/install --enable-shared --enable-static CC=arm-linux-gnueabihf-gcc”命令。 --prefix=$(pwd)/install:指定编译出来的库存放的路径(当前目录下的install 文件夹) 运行结果如图所示: 接着我们在终端输入“make CC=arm-linux-gnueabihf-gcc”编译命令,如图所示: 编译完成如图所示: 然后我们在终端输入“make install”命令,安装编译生成的库文件到当前目录的“install” 文件夹,如图所示: 我们可以使用“cd install”命令,进入到“install”文件夹查看编译生成的文件,如图所示: 至此 libnl 交叉编译就完成了。 4 交叉编译 hostapd使用 ssh 上传本压缩包里面的“hostapd-2.9.tar.gz”到 Ubuntu 系统(与上面的 openssl 和 libnl在同一个目录下),如图所示: 然后我们在终端输入“tar -xvf hostapd-2.9.tar.gz”开始解压 hostapd,如图所示: 接着我们使用“cd hostapd-2.9/hostapd”命令,进入到 hostapd 目录,如图所示: 然后我们在终端输入“cp defconfig .config”生成配置文件,如图所示: 然后我们使用“vi Makefile”打开 Makefile 文件,将 ifndef CC CC=gcc Endif 修改为: #ifndef CC CC=arm-linux-gnueabihf-gcc #endif 如图所示: 然后在 Makefile 文件里面添加: CFLAGS += -I../../libnl-3.2.25/install/include/libnl3/ CFLAGS += -I../../openssl-1.0.2h/install/include/ LIBS += -L../../libnl-3.2.25/install/lib/ LIBS += -L../../openssl-1.0.2h/install/lib/ 指定 hostapd 依赖的头文件和库文件(前面编译 openssl 和 libnl 安装到的目录),添加完成后如图所示: 然后退出并保存,接着在终端输入“make”命令,开始编译,如图所示: 编译完成后如图所示: 我们在终端输入“ls”命令可以看到生成了“hostap”文件,如图所示: 至此,hostap 编译完成了。 5 交叉编译iptables拷贝iptables-1.4.19.tar.bz2 压缩包到到 Ubuntu 系统(与上面的 openssl 在同一个目录下),并输入命令“tar -vxf iptables-1.4.19.tar.bz2” 解压到当前目录下,如下图所示: 输入命令cd iptables-1.4.19进入到iptables-1.4.19目录下,在此目录下输入mkdir install 命令创建安装目录。如下图所示: 在iptables-1.4.19目录下输入命令./configure --host=arm-linux-gnueabihf --prefix=/home/topeet/hostapd/iptables-1.4.19/install/ --enable-static --disable-shared 注意修改为自己的安装路径。如下图所示: 成功后如下图所示: 在iptables-1.4.19目录输入make进行编译,编译成功后如下图所示: 在iptables-1.4.19目录输入make install进行安装,安装成功后如下图所示: 进入到install目录下,可以看到安装目录下生成了文件。 进入到lib目录下,使用命令tar zcvf lib_iptables.tar.gz * 压缩lib下的文件。如下图所示: 6 准备所需库文件,配置文件和执行文件经过前面二,三,四,五章节的步骤我们已经编译出了hostapd 运行所需的库文件以及hostapd 可执行程序,接下来我们需要拷贝这些文件到开发板上。 6.1 打包 openssl 库使用“cd openssl-1.0.2h/install/lib”命令进入到 openssl 的库文件夹,如图 所示: 然后使用“tar zcvf openssl.tar.gz engines libcrypto.a libcrypto.so libcrypto.so.1.0.0 libssl.a libssl.so libssl.so.1.0.0 pkgconfig”打包命令(因为该目录下有些是链接文件,通过 ssh 拷贝可能会有问题,所以我们先打包),如下图所示: 运行完,会在当前目录下生成“openssl.tar.gz”压缩包,如下图所示: 6.2 打包 libnl 库用“cd libnl-3.2.25/install/lib”命令进入到 libnl 的库文件夹,如下图所示: 然后我们在终端输入“tar zcvf lib_nl.tar.gz libnl*”压缩命令,如下图所示: 运行完会在当前目录下生成“lib_nl.tar.gz”压缩包,如下图所示: 6.3 拷贝库文件和 hostap1.我们使用ssh(大家可以使用nfs或者U盘拷贝到开发板上面),将“lib_nl.tar.gz”压缩包和“openssl.tar.gz”压缩包拷贝到开发板的“/usr/lib”目录下,,然后分别输入“tar -xvf lib_nl.tar.gz”和 “tar -vxf openssl.tar.gz ”两个命令,解压 libnl 和openssll库文件到当前目录下。 2.然后将文档对应的压缩包资料里面“hostapd.conf”,“udhcpd.conf”,“udhcpd.leases”配置文件拷贝到开发板的“/etc”目录下。 3.然后拷贝“hostapd”到开发板的“/usr/sbin”目录下。 4.然后将 “iptables-1.4.19/__install/sbin”下的xtables-multi拷贝到到开发板的bin目录下,输入chmod 777 xtables-multi修改权限,并改名为iptables。 5.将压缩包lib_iptables.tar.gz拷贝到开发板lib目录下并解压。 6 然后我们分别进入开发板的“/usr/lib”“/etc”“/usr/sbin”“/bin”“/lib”目录下,分别输入命令“chmod 777 -R *”,赋予权限给我们刚刚拷贝的文件。 至此所需的文件我们已经准备好了。 hostapd.conf 文件是设置 AP 热点的网络名字,以及密码,其内容如下: ctrl_interface=/var/run/hostapd interface=wlan0 driver=nl80211 ssid=Topeet_TEST channel=1 macaddr_acl=0 auth_algs=1 hw_mode=g ignore_broadcast_ssid=0 #wpa=2 wpa_passphrase=12345678 #wpa_key_mgmt=WPA-PSK wpa_pairwise=TKIP rsn_pairwise=CCMP 上面的 ssid 是 wifi 的名称(Topeet_test),wpa_passphrase 是 wifi 的密码(1234567890)。udhcpd.conf 文件是配置 dhcp 的,内容如下: start 192.168.0.1 end 192.168.0.100 interface wlan0 max_leases 20 #default: 254 remaining yes #default: yes auto_time 7200 decline_time 3600 conflict_time 3600 offer_time 60 min_lease 60 lease_file /etc/udhcpd.leases opt dns 114.114.114.114 option subnet 255.255.255.0 opt router 192.168.0.1 Start 和 end 指定了 wifi 分配的 IP 地址范围(192.168.0.1-192.168.0.100),其它的参数大家可以网上查阅下,这里就不再具体讲述了。 7 内核配置iptables34.6.3章我们已经把所需要的文件拷贝到了开发板的文件系统,但是网盘资料里面的内核镜像是没有配置iptables的,这一章我们开始配置内核。 首先设置交叉编译器为gcc-linaro-4.9.4-2017.0.1-x86_64_arm-linux-gnueabihf,设置交叉编译器的方法请查看本手册相关章节。 编译 kernel,则进入源码解压的到的“iTOP-iMX6_android6.0.1/kernel_imx”目录,如下图所示。 修改之前我们输入“./build_qt_kernel.sh 6q”先编译一遍源码。 file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml3944\wps211.jpg 源码编译完毕如下图所示: 先将需要配置的缺省文件覆盖.config 文件,然后使用“export ARCH=arm”设置环境变量,如下图所示: cp arch/arm/configs/imx_v7_linux_defconfig .config export ARCH=arm 然后使用“make menuconfig”命令开启配置界面,如下图所示。 我们依次选中选项,如下图所示; Core Netfilter Configuration --->(全部选上) IP: Netfilter Configuration ---> (全部选上) 注意:这里的所有选项一定选为built-in,而不能选为Module [M],如果选为Module,重新烧制的系统内核里用modprobe ip_tables 命令将不能找到iptables模块。上一步还有一点要注意的是IP: Netfilter configuration中的FULL NAT选项一定要选中,否则将不能使用 iptables -t nat命令。 选中选项以后保存退出,然后输入命令“cp -r .config arch/arm/configs/imx_v7_linux_defconfig”,然后输入命令“./build_qt_kernel.sh”开始编译内核。 内核编译完如下图所示: 如下图所示,在arch/arm/boot/目录下生成了zImage 在arch/arm/boot/dts下可以看到生成的设备树文件,如下图所示: 到这里内核已经支持iptables了。我们将生成的内核和设备树文件烧写到开发板中,文件系统用我们第32章节配置好的升级版的qt5.7文件系统,路径为:i.MX6Q开发板\4_iTOP-i.MX6开发板资料汇总(不含光盘资料)\03_iTOP-iMX6开发板QtE系统源码以及镜像\05_QtE5.7系统升级目录\20180522。 8 开发板上配置 AP 热点开发板连接好电源和调试串口,我们插入网线连接到路由器,然后打开调试串口终端,然后给开发板上电,等待系统启动完成,如图所示: 首先请确认,底板是否有 RTL8723BU 的 usb-wifi 模组,老版本上使用的是 SDIO mt6620 的 wifi,请参考 mt6620 的文档。 和文档打包一起的有“iTOP-iMX6-QT-usbwifi.tar.gz”压缩包,解压之后得到 “topeet_8723bu_wapstart.conf”脚本和“8723bu.ko”驱动文件。在开发板上,使用命令“mkdir /topeet/usb_wifi_8723bu”,新建“usb_wifi_8723bu”文件夹。将“topeet_8723bu_wapstart.conf”脚本和“8723bu.ko”驱动拷贝到新建的“usb_wifi_8723bu”文件夹下,接着使用命令“chmod 777 -R *”修改权限,如下图所示。 使用命令“insmod 8723bu.ko”加载驱动,如下图所示。 使用命令“ifconfig -a”可以看到有“wlan0”网络节点,如下图所示。 然后在调试串口输入“ifconfig wlan0 192.168.0.1 up”命令,配置 wlan0 的 ip,并启用 wlan0,如图所示: 然后我们输入命令“ifconfig”,发现wlan0的信息,如下图所示: 所有的准备就绪后,我们要用前面移植的iptables来实现linux平台实现网络数据的转发和网络数据共享的功能。首先我们一定要记得先实现eth0能上网,将开发板的网线连上路由器,如果eth0都上不了网,自然谈不上转发。我们要将eth0的网络数据转发给wlan0,从而实现wlan0可以上网的功能。 整体结构和测试环境如下图所示: 输入下面的命令,配置nat转发表。 // 将局域网内地址通过eth0接口伪装后转发出去 iptables -A FORWARD -s 192.168.0.1/24 -o eth0 -j ACCEPT //对于已经建立连接的包以及该连接相关的包都允许通过! iptables -A FORWARD -d 192.168.0.1/24 -j ACCEPT // 配置数据包转发时候的接口 iptables -t nat -A POSTROUTING -s 192.168.0.1/255.255.255.0 -o eth0 -j MASQUERADE echo 1 >/proc/sys/net/ipv4/ip_forward 然后在调试串口输入“hostapd -B /etc/hostapd.conf”开始 AP 热点,运行结果如下图所示: 然后在调试串口输入“udhcpd -fS /etc/udhcpd.conf &”,开启 dhcp server 服务(udhcpd 这个程序是我们在制作文件系统的时候 busybox 里面默认提供的,如果大家的文件系统没有这个程序,可以重新配置下 busybox 或者是单独移植一下 udhcpd 这个程序,具体的移植步骤这里就不在介绍了),运行结果如图所示: 至此 AP 热点功能已经开启了,我们可以在调试串口输入“ps -el”查看所有进程,能够看到hostapd 和 udkcpd 两个进程在后台运行,如图所示: 然后我们可以使用手机或笔记本扫描 wifi,能够查找到“Topeet_TEST”网络,并连接该 wifi 网络,密码输入“123456780”,最后会连接到“Topeet_TEST”网络,同时我们在调试串口会看到 dhcp 为我们的手机分配的 ip 地址“192.168.0.2”,如图所示: 手机连接上以后,串口控制台打印信息如下: 至此开发板上创建热点可以连接,并且可以访问外网了。
|