1 引言
随着物联网的蓬勃发展,WIFI被广泛的应用在各种嵌入式系统中。WIFI一般有两种工作模式,一个是工作在AP模式下,另外一个是Station模式。以你的手机WIFI为例,你最经常使用的功能是去连接某个WIFI热点上网,这时它工作在Station模式下。有时你也会共享个热点,让自己的手机被其他手机连接上网,这时就是工作在AP模式下。本篇以Realtek USB接口的RTL8188 WIFI模块为例,对Linux下WIFI使用做个简单总结,希望对大家有所帮助。
2 环境介绍
2.1.硬件
1) 网上的一个第三方做的NUC972开发板:
有兴趣购买的朋友,可以去他们的淘宝店购买:
https://s.click.taobao.com/X8mza8w
2) WIFI模块,
https://s.click.taobao.com/Lbx7e5w
3) 1根USB转RS232线、1根网线、1根电源线、1根Micrco USB线,下载和调试使用。
2.2.软件
1) Uboot继续使用之前文章用的,无需改动。
2) Kernel在上一篇基础上,要做一定的修改
3) Rootfs在上一篇用Buildroot生成的基础上,要做一定的修改,用来支持
iwconfig、iwlist、udhcpc、udhcpd指令。官网提供了wireless_tool 源代码https://github.com/OpenNuvoton/NUC970_Linux_Applications/tree/master/wireless_tools.29 编译这个也可以生成iwconfig、iwlist指令,但是因为我们用Buildroot,所以直接在Buildroot里做就可以了。
4) WIFI模块驱动源码rtl8188.tar.gz,这个是由WIFI模块厂家提供的
https://github.com/lwfinger/rtl8188eu
5) hostapd 源码,把wifi设置为AP模式需要用这个。Buildroot也可以生成,但是用起来有点问题,我没有解决,猜测是版本兼容性问题,这里没有深入研究。
6)交叉工具链arm_linux_4.8.tar.gz,还是之前使用的不变
7)上一节我们把Vmvare虚拟机网络模式做了改动,这里我们要改回去,如果是虚拟机开启的情况下修改的,改完后要重启下虚拟机。然后保证可以ping通外网,不然buildroot没法使用了。因为Buildroot需要联网的。
3 内核配置
• TCP/IP设置
• WIFI无线网络设置和外部WIFI 驱动使能
• USB Host 设置
要支持 USB Host, 请先勾选打开 USB Host 端支持。NUC970 USB Host包含EHCI(USB2.0)及OHCI(USB1.1)两个USB Host控制器,必须同时打开。以下所列之项目都全部勾选上:
• 挂载和卸载模块支持设置
这样是为了将WIFI模块的驱动编译成模块后被insmod[模块名称]来加载和通过rmmod[模块名称]来卸载
4 Buildroot配置
• Wireless tools 配置
Wireless tools for Linux是一个Linux命令行工具包,用来设置支持Linux Wireless
Extension的无线设备。
Wireless Tools包括以下工具:
iwconfig:设置基本无线参数
iwlist:扫描、列出频率,比特率,密钥等
iwspy:获取每个节点链接的质量(只能查阅不之相连的节点)
iwpriv:操作Wireless Extensions 特定驱劢
ifrename:基于各种静态标准命名接口
我们这里用到iwconfig,iwlist
进入到Buildroot目录,输入make menuconfig进入到配置界面,勾选上wireless tools。
• hostapd配置
hostapd 是一个用户态用于AP和认证服务器的守护进程。它实现了IEEE 802.11相关的接入管理,IEEE 802.1X/WPA/WPA2/EAP 认证, RADIUS客户端,EAP服务器和RADIUS 认证服务器。
• wpa_supplicant
wpa_supplicant是一个连接、配置WIFI的工具,它主要包含wpa_supplicant与wpa_cli两个程序。通常情况下,可以通过wpa_cli来进行WIFI的配置与连接,如果有特殊的需要,可以编写应用程序直接调用wpa_supplicant的接口直接开发。
注意:iwconfig工具只能支持开放网络和具有WEP加密的无线网络;
如果需要支持WPA或WPA2 PSK加密的无线网络,需要安装wpa_supplicant。
• Busybox配置
使用下面命令来调用busybox的menuconfig:
make busybox-menuconfig
选中udhcpd和udhcpc:
以上配置完之后,编译即可。
5 驱动编译
进入到wifi驱动所在路径,make编译即可,生产8188eu.ko文件,将其放入板子里注意要修改它的可执行权限。
6 WIFI使用
6.1.做Station连接AP
1) 将上述生成的新的内核、根文件系统下载到板子里,把8188eu.ko文件放到/usr/目录下。
insmod /usr/8188eu.ko
驱动加载成功.
lsmod可以用来查看已经加载的驱动
如果要卸载掉该驱动,使用rmmod 8188eu.ko即可。
输入ifconfig -a可以看到
但是输入ifconfig是看不到这个的,因为ifconfig只显示激活状态的网络设备信息,ifconfig -a显示的是全部接口信息。
2) 开启无线网卡,输入:
ifconfig wlan0 up
出现wlan网卡相关信息,说明wifi模块驱动编译加载成功了。
3) 输入下面命令,搜索当前环境下热点的信息
iwlist wlan0 scanning
我用的自己华为手机开一个wifi热点,设置为不加密网络:
4) 输入下面命令,连接到手机热点上,
iwconfig wlan0 essid "Honor 8"
连接成功之后,一是我们在手机上可以看到有设备连入,另外在板子上输入iwconfig也可以看到相应的接入信息。
5) 执行下面命令,动态生成IP地址
udhcpc -i wlan0
6) 最后就可以上外网了:
ping www.topsemic.com
如果用的默认的加密方式:
因为网络是加密的,密码是12345678,那么就输入命令
iwconfig wlan0 essid "Honor 8" key 1234-5678
也可以连接上,但是udhcpc时一直不成功,我之前就在这里卡了好多天。
wpa_supplicant支持wpa/wpa2加密方式,由于时间关系,暂时先不研究了,后面再补充。
6.2.做AP被Station连接
1) 加载驱动模式,insmod /usr/8188eu.ko
2) 打开无线网卡,ifconfig wlan0 up
3) 使用udhcpd自动分配ip功能
udhcpd -f /etc/udhcpd.conf &
其中udhcpd.conf需要自己新建,内容如下:
# Sample udhcpd configuration file (/etc/udhcpd.conf)
# Values shown are defaults
start 192.168.2.20
end 192.168.2.254
interface wlan0
opt dns 192.168.10.2 192.168.10.10
option subnet 255.255.255.0
opt router 192.168.10.2
opt wins 192.168.10.10
option dns 129.219.13.81 # appened to above DNS servers for a total of 3
option domain local
option lease 864000 # 10 days of seconds
会遇到一个错误,提示Unable to open /var/lib/misc/udhcpd.leases for reading. 解决方法是直行下面两条命令:
mkdir -p /var/lib/misc/ touch /var/lib/misc/udhcpd.leases
4) 创建AP
hostapd -B /etc/ rtl_hostapd.conf -d
一开始老不成功,
后来重新断电板子、插拔了一下WIFI模块,就可以了。
手机连接上之后,可以ping通。
7 结束语
本篇为大家介绍了Linux下wifi接口的简单使用,大家有什么经验欢迎多分享交流,可以在网页下方留言讨论,或者发邮件:Topsemic@sina.com ,微信公众号如下,欢迎关注:
本期相关的资料在链接: https://github.com/TopSemic/NUC972_Linux 中
8 参考资料
本篇参考了网上大量的文章,感谢广大网友的贡献
1) https://blog.csdn.net/wsclinux/article/details/52095582
2) https://www.linuxidc.com/Linux/2011-10/44885.htm
3) https://www.zybuluo.com/SiberiaBear/note/424840
4) https://www.twblogs.net/a/5bf71833bd9eee18cf8a9c7d/zh-cn
5) https://www.ibm.com/developerworks/cn/linux/l-wifiencrypthostapd/
6) https://blog.csdn.net/strugglelg/article/details/18987053
7)https://unix.stackexchange.com/questions/400101/how-to-get-the-wifi-working-with-r8188eu-driver-on-my-raspberry-pi