《Linux操作系统-系统移植》第11章 WiFi模块移植-第1节 USB WiFi模块移植(RT3070)(B-wpa_supplicant移植与使用)

删除回忆录丶 提交于 2019-12-01 15:35:45

1.5 wpa_supplicant移植与使用

所需包下载地址:
Libnl:http://www.infradead.org/~tgr/libnl/files/
Openssl:http://mirrors.ibiblio.org/openssl/source/
wpa_supplicant:http://w1.fi/releases/

1.5.1交叉编译libnl-3.2.25.tar.gz

libnl是为了方便应用程序使用netlink接口而开发的一个库。这个库为原始netlink消息传递以及不同的netlink family专用接口提供了一个统一的接口。
1.解压
$ tar -xvf libnl-3.2.25.tar.gz

2.配置
$ cd libnl-3.2.25/
$ mkdir install
$ ./configure --host=arm-none-linux-gnueabi --prefix=$PWD/install

配置libnl用到bison and flex工具,使用下面的命令安装:
$ sudo apt-get install bison
$ sudo apt-get install flex

3.编译
$ make
$ make install

4.移植文件
将编译出的库文件拷贝到交叉编译器默认库文件搜索目录下
$cd install/lib
在这里插入图片描述
将编译出的库文件拷贝到根文件系统的lib目录下
$ scp .so. root@192.168.20.230:/lib/
【注】可以使用很多方式将库拷贝到开发板的lib库。笔者使用的是scp。
在这里插入图片描述

1.5.2交叉编译openssl-1.1.1c.tar.gz

1.解压
$ tar -xvf openssl-1.1.1c.tar.gz

2.配置
$ cd openssl-1.1.1c/
$ mkdir install
$ ./config no-asm shared no-async --prefix=$(pwd)/install --cross-compile-prefix=arm-none-linux-gnueabi-

其参数说明如下:
no-asm: 在交叉编译过程中不使用汇编代码代码加速编译过程;
shared: 生成动态连接库。
no-async: 交叉编译工具链没有提供GNU C的ucontext库
–prefix=: 安装路径
–cross-compile-prefix=: 交叉编译工具
修改Makefile:删除里面所有的-m64和-m32编译选项。

3.编译
$make
$make install

4.移植文件
将编译出的库文件拷贝到交叉编译器默认库文件搜索目录下
$cd install/lib
在这里插入图片描述
将编译出的库文件拷贝到根文件系统的lib目录下
$ scp .so. root@192.168.20.230:/lib/

在这里插入图片描述

1.5.3交叉编译wpa_supplicant-2.8.tar.gz

1.解压
$ tar -xvf wpa_supplicant-2.8.tar.gz

2.配置
$ cd wpa_supplicant-2.8/wpa_supplicant/
配置环境变量:

export PKG_CONFIG_PATH=/home/bruceou/tools/wifi/tools/libnl-3.2.25/install/lib/pkgconfig:$PKG_CONFIG_PATH
export PKG_CONFIG_PATH=/home/bruceou/tools/wifi/tools/openssl-1.1.1c/install/lib/pkgconfig:$PKG_CONFIG_PATH

$ cp defconfig .config
修改.config
CFLAGS +=-I/home/bruceou/tools/wifi/tools/libnl-3.2.25/install/include // CONFIG_DRIVER_NL80211=y时。需指定libnl头文件
LIBS +=-L/home/bruceou/tools/wifi/tools/libnl-3.2.25/install/lib // CONsFIG_DRIVER_NL80211=y时,需指定libnl库
CONFIG_LIBNL32=y // CONFIG_DRIVER_NL80211=y时,需指定libnl库版本
CC =arm-none-linux-gnueabi-gcc // 配置编译器
//配置TLS实现,可选有openssl、internal,选择penssl时需指定openssl库,移植步 骤请参考Openssl 移植,由于开发板flash空间较小,出于节省空间的考虑,选择 internal
CONFIG_TLS = internal
CONFIG_INTERNAL_LIBTOMMATH = y //CONFIG_TLS = internal时,需使能
CFLAGS +=-I/home/bruceou/tools/wifi/tools/openssl-1.1.1c/install/include/ //CONFIG_TLS = openssl时,需指定openssl头文件
LIBS +=-L/home/bruceou/tools/wifi/tools/openssl-1.1.1c/install/lib // CONFIG_TLS = openssl时,需指定openssl库
【注】可以根据自己的需求选择配置 CONFIG_DRIVER_WEXT 、CONFIG_DRIVER_NL80211 、CONFIG_TLS。

注释以下配置,否则需要移植DBUS库。
#CONFIG_CTRL_IFACE_DBUS=y
#CONFIG_CTRL_IFACE_DBUS_NEW=y

3.编译
$ make -j4
$ mkdir install
$ make
$ make DESTDIR=$PWD/install install

我们可以在子install/usr/local/sbin目录下看到wpa_cli,wpa_passphrase和wpa_supplicant三个文件。
在这里插入图片描述
wpa_supplicant是核心程序,它和wpa_cli的关系就是服务和客户端的关系
wpa_cli用来搜索、设置、和连接网络。
wpa_passphrase网络配置可以使用wpa_passphrase工具自动生成并添加到配置文件中。

【注】wpa_supplicant依赖gcc-multilib库
$sudo apt-get install gcc-multilib

4.复制文件
$ cd install/usr/local/sbin/
将wpa_cli wpa_passphrase wpa_supplicant拷贝到根文件系统的bin目录
$ scp * root@192.168.20.230:/bin

在这里插入图片描述
5.创建一个socket通信的目录
#mkdir -p /var/run/wpa_supplicant

1.5.4使用wpa_supplicant工具连接WIFI(手动获取IP)

1.打开wlan0
#ifconfig wlan0 up

2.启动wpa_supplicant
#wpa_supplicant -Dwext -iwlan0 -c/etc/wpa_supplicant.conf -B

3.wpa_supplicant启动后,可以手动/自动连接。
手动连接:
通过wpa_cli来操作设置;wpa_cli有两种方法,
第一种:直接进入cli控制台操作,如下:
#wpa_cli
在这里插入图片描述
scan:扫描网络

scan
scan_results

在这里插入图片描述
add_network:增加网络

add_network
list_network

在这里插入图片描述
set_network:设定网络连接的ssid和密码

set_network 1 ssid “TP_LINK_LAB”
set_network 1 psk “12345678”

在这里插入图片描述
enable_network:使能网络连接

enable_network 0

在这里插入图片描述
看到CTRL-EVENT-CONNECTED,表示连接完成
status:查看状态

states

在这里插入图片描述
save:保存当前的连接设置,下次wifi启动时会自动连接,保存在wpa_supplicant.config中。
quit或q:退出cli模式。

在这里插入图片描述
使用ifconfig wlan0 192.168.20.123给模块配置IP地址
$ ifconfig wlan0 192.168.20.123
在这里插入图片描述
连接成功以后可以ping通路由器。
在这里插入图片描述
第二种方法:
直接在终端中敲完整命令操作,如下:
在这里插入图片描述
两种方法都可以,方法一输错不可以删除,得重新输入;方法二在输入ssid和密码时要用单引号括起双引号

断开WiFi。
#ifconfig wlan0 down

#killall wpa_supplicant

1.5.5移植DHCP(动态获取ip和自动设置DNS)

地址:http://ftp.isc.org/isc/dhcp/
1.解压文件
$tar -xvf dhcp-4.4.1.tar.gz
$cd dhcp-4.4.1

2.配置
$./configure --host=arm-none-linux-gnueabi ac_cv_file__dev_random=yes --with-randomdev=no
$cd bind
修改Makefile添加:
BUILD_CC=gcc ac_cv_file__dev_random=yes

3.编译
$ make
$ make DESTDIR=$PWD/install install
【注】可以忽略,make之后就会在client目录下生成dhclient和配置文件

4.文件复制
$ cd install/usr/local
$ scp etc/dhclient.conf.example root@192.168.20.230:/etc
$ scp sbin/dhclient root@192.168.20.230:/sbin
将将client/scripts/linux拷贝到目标板的/etc目录下

5.配置开发板
将开发板/etc/下的dhclient.conf.example文件名修改为dhclient.conf。
将linux脚本改名为dhclient-script。
输入命令chmod +x dhclient-script,为dhclient-script添加可执行属性。

修改dhclient-script
#!/bin/bash该为#!/bin/sh,因为嵌入式的shell为bin/sh

创建目录/var/db/
#mkdir -p /var/db

1.5.6使用wpa_supplicant工具连接WIFI(自动获取IP)

【注】如果是编译后能的模块需要加载驱动。
1.打开wlan0
#ifconfig wlan0 up

2.设置连接的热点和密码
#wpa_passphrase testap “12345” >> /etc/wpa_supplicant.conf
testap为wifi热点,密码为12345,执行完上以命令后会在/etc/目录下生成wpa_supplicant.conf配置文件,修改如下:

ctrl_interface=/var/run/wpa_supplicant
network={
	 ssid="testap"
	 scan_ssid=1
	 key_mgmt=WPA-EAP WPA-PSK IEEE8021X NONE
	 pairwise=TKIP CCMP
	 group=CCMP TKIP WEP104 WEP40
	 #psk="12345"
	 psk=f7c8f9ad253fefcd5c9344522efb569214e05a2c1d1adcfdbbe28c3db394d705
}

3.连接WIFI
执行下面的命令使用WEXT连接wifi
#wpa_supplicant -Dwext -iwlan0 -c/etc/wpa_supplicant.conf -B
执行下面的命令使用NL80211连接wifi
#wpa_supplicant -Dnl80211 -iwlan0 -c/etc/wpa_supplicant.conf -B

【注】wpa_supplicant -B -c/etc/plaintext.conf -iwlan0
默认是使用nl80211。

4.查看连接状态
#wpa_cli -iwlan0 status

5.使用DHCP动态获取ip
#dhclient -d wlan0

6.测试
#ping 192.168.20.1

#ping www.baidu.com
成功访问外网。

在这里插入图片描述

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!