9.RT-thread 项目实战--添加wifi和net双网卡
一. ART-PI网络功能
ART-PI具有两种网络连接方式:
- 一种是使用自带的wifi模块AP6212,该模块是蓝牙和wifi一体的,使用SDIO接口。
- 另一种是通过工业扩展板上的网口,网口芯片使用的是LAN8720A。
二. RT-studio中进行网络配置
- 在studio中直接打开开关即可。进行代码编译和下载。可以看到打印信息,网络初始化成功。但此时网络还未连接成功。
- 进行wifi网络连接,通过终端命令进行扫描。 进行网络加入后,通过网页进行wifi的扫描和配置。查看IP,已经能够查看到了。尝试ping百度,但ping不通,配置可能有误。
- 在此之前,先插上网线测试网口功能是否正常。 网口功能正常。
- 怀疑网口作为e0,wifi作为w0,在切换时需要切换网卡来指定使用哪个模块进行网络连接。将网口的驱动卸载后,只剩下一个wifi网卡,确实可以ping通了,说明确实需要切换网卡。那么如何切换到指定的网卡呢? 注:参考了一位大神的文章。官网的网卡说明(netdev):复习了一下RT-thread网络框架。通过简单的配置,确实可以实现双网卡,但需要手动切换网卡才能确保网络的正常匹配和运行。同时,在此基础上还有很多优化的方面,例如如何在上电时默认连接之前的wifi,如何通过网页配置扫描wifi,如何实现自动切换网卡?
三. 程序优化
对接easyflash,使网络上电默认连接之前的wifi(参考上一节的文章)。现在我们的wifi已经能够正常上网了,但是断电重启后不会自动重连到之前的网络,因为网络信息并没有存储到flash中,所以我们需要借助easyflash进行网络信息的存储。参考官方的artpiwifi示例。 将wificonfig.c拷贝到我们工程的文件夹下,然后在main.c中添加几行代码。进行编译时,efportinit()出现了报错,通过debug发现是falpartitionfind(FALEFPARTNAME)这个名称报错,修改为正确的名称后,正常编译。 现在我们可以扫描和加载wifi,使其成功入网。此时是正常的,自动重连功能也已开启。断电重启后发现自动重连了。
实现多网卡管控,wifi和网口的自动切换(优先使用网口)
在某些环境下,wifi质量不好时,我们希望使用网线,那么如何实现自动切换呢?这里需要补充一些知识: 打开官方文档:netdev 网卡。netdev(network interface device),即网络接口设备,又称网卡。每一个用于网络连接的设备都可以注册成网卡。为了适配更多种类的网卡,避免系统对单一网卡的依赖,RT-Thread系统提供了netdev组件用于网卡管理和控制。
我们知道,并不是wifi不能联网,只是默认的网卡为网口,虽然已经开启了自动切换,但网卡没有网络,按理说应该切换到wifi,为什么不行呢?我们明确几个函数:在netdev.c文件中的static void netdevautochange_default(struct netdev *netdev)函数用于设置默认网卡。 自动切换网卡开启后,只有默认网卡自身的状态发生改变才能从有联网能力的网卡中配置默认网卡,但发现两个网卡的状态一直没有发生改变。知道了接口后,我们可以手动判断网络状态,并通过函数进行状态切换。下面是切换的代码,在main.c中添加如下代码。 这样我们就可以通过网页切换、按键切换等多种方法进行切换。实际上,当我们插拔网线时,会触发状态切换,自动切换到wifi网卡。但如果不插拔网线,岂不是无法上网。所以想出了一个办法:
- 上电时默认网卡为e0(网口)。
- 当wifi连接成功后,自动将默认网卡改为wifi。在wlandev.c文件的rtwlaneventdispatch函数中实现。
- 当有网线插入后,再将网卡改为e0。在drveth.c文件的static void phylink_change()函数中实现。
- 当网线拔掉后,程序的自动切换程序会自动切换到wifi。 这样就可以愉快地进行两个网卡的自由切换。