Linux学习系列九:使用WIFI

1.引言

随着物联网的蓬勃发展,WIFI被广泛的应用在各种嵌入式系统中。WIFI一般有两种工作模式,一个是工作在AP模式下,另外一个是Station模式。以你的手机WIFI为例,你最经常使用的功能是去连接某个WIFI热点上网,这时它工作在Station模式下。有时你也会共享个热点,让自己的手机被其他手机连接上网,这时就是工作在AP模式下。本篇以Realtek USB接口的RTL8188 WIFI模块为例,对Linux下WIFI使用做个简单总结,希望对大家有所帮助。

2.环境介绍

2.1.硬件

1) 网上的一个第三方做的NUC972开发板:

2) WIFI模块,

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模块厂家提供的

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://pan.baidu.com/s/1VqN4qdVxNHJDf1Z0Tzm6Hw  提取码:5npd

里面包含了如下内容:

本系列往期文章见:

1:Linux学习系列一:开发环境搭建

2:Linux 学习系列二:运行 Hello World

3:Linux学习系列三:uboot编译下载

4:Linux学习系列四:Kernel编译下载

5:Linux学习系列五:Nand Flash根文件系统制作

6:Linux学习系列六:操作GPIO

7:Linux学习系列七:操作UART

8: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

2+

Linux学习系列九:使用WIFI》上有7条评论

  1. 李贝

    如果按您的教程设置好WIFI后,我想发自己的数据,比如串口收到的数据该如何做?另外可以把开发环境重新发一下吗,用 buildroot 生成的文件系统SYS文件夹内是空的,不知是什么原因造成的,所以想直接用您的开发环境.

    0
      1. 李贝

        就是用rootfs.tar文件 通过 mkyaffs2打包生成根文件系统,通过putty软件
        # ls
        bin lib media root tmp
        dev lib32 mnt run usr
        etc linuxrc opt sbin var
        init lost+found proc sys

        cd 进入sys文件夹,文件夹中为空,而用您的文件系统则有内容
        # cd sys
        # ls
        block class devices fs module
        bus dev firmware kernel
        用我自己生成的根文件系统没有上面的内容.

        很奇怪的现象,网上找了很久没有找到原因

        0
  2. Topsemic 文章作者

    整个buildroot打包我这边老出错,我把Buildroot的.config文件和其中busybox的.config文件(output/build/busybox-1.25.1)放到上述百度网盘里了,你替换你的后,编译试试。

    1+

发表评论