ART-PI中有两种网络连接方式:
1.一个是他自带的wifi模块AP6212,这个模块是蓝牙和wifi一体的,使用的是SDIO接口。
2.一个是通过工业扩展板,的网口,网口芯片使用的是LAN8720A
1.在studio中直接打开开关就可以了。
这时候进行代码编译,下载。
可以看到打印信息,网络初始化成功。
但是此时网络还是没有连接成功的。
2.wifi 网络连接,通过终端命令进行扫描,
进行网络加入:
之后通过网页进行wifi的扫描和配置。
查看IP,已经能够查看到了。
ping 下百度。
此时是ping不通的,配置没有配置对?
3.在此,我们先插上网线试一下网口的功能。
网口功能是正常的。
4.这个时候怀疑,网口作为e0,wifi作为w0,切换的时候需要切换网卡,来指定哪个模块来进行网络连接。
将网口的驱动卸载后,只有一个wifi网卡,
确实是可以ping通了,说明确实是需要切换一下,网卡。那么怎么切换到指定的网卡呢??
注:
看到了大神的文章。
https://blog.csdn.net/sinat_31039061/article/details/104200110
https://club.rt-thread.org/ask/article/2429.html
官网的网卡说明(netdev):
https://www.rt-thread.org/document/site/programming-manual/netdev/netdev/
复习了下RT-thread网络框架。
这个时候可以明确通过简单的配置,确实可以实现双网卡,但是需要自己切换网卡,才能确保网络的正常匹配及运行
同时在此基础上,我们还有很多要优化的,例如怎么上电默认连接之前的wifi, 怎么网页配置扫描wifi, 怎么自动切换网卡?
在上面我们的wifi已经能够正常上网了,但是此时断电重启,是不会自动重连到之前的网络,
网络信息是其实并没有存储到flash中,这里我们需要借助easyflash进行网络信息的存储。
参考官方art_pi_wifi实例。
将wifi_config.c拷贝到我们工程的文件夹下。
然后在main.c中添加几行代码:
进行编译:
下载的时候ef_port_init() 出现了报错。卡死了
通过debug,part = fal_partition_find(FAL_EF_PART_NAME);这个报错
改为这个名称后,正常:
现在我们扫描,加载wifi,使成功入网:
此时是正常的,看下
自动重连功能也变为了开启状态。此时断电重启下试试:
发现自动重连了。。。哈哈
有时在一些环境下wifi质量不好,我们想使用网线,那么怎么实现自动切换呢?
这里就需要补充一下知识了:
打开官方的文档:
https://www.rt-thread.org/document/site/programming-manual/netdev/netdev/
netdev 网卡
netdev(network interface device),即网络接口设备,又称网卡。每一个用于网络连接的设备都可以注册成网卡,为了适配更多的种类的网卡,避免系统中对单一网卡的依赖,RT-Thread 系统提供了 netdev 组件用于网卡管理和控制。
在上面我们也知道,并不是wifi不能联网,只是默认的网卡为网口,但是已经开启了自动切换啊,网卡没有网络,按说就应该切换到wifi,为什么不行呢??
我们明确几个函数:
在netdev.c文件中static void netdev_auto_change_default(struct netdev *netdev)这个函数进行了默认网卡的设置。
自动切换网卡开启之后,只有默认网卡自己的状态发生改变才能从有联网能力的网卡中配置默认网卡,但是发现两个网卡状态一直没有发生改变。
知道了接口我们可以自己人为的去判断网络状态,通过函数进行状态切换。
下面为切换的代码
直接在main.c中添加如下代码
#include
#include /* 当需要网卡操作是,需要包含这两个头文件 */
static int netdev_set_default_test(int argc, char **argv)
{
struct netdev *netdev = RT_NULL;
if (argc != 2)
{
rt_kprintf("netdev_set_default [netdev_name] --set default network interface device.\n");
return -1;
}
/* 通过网卡名称获取网卡对象,名称可以通过 ifconfig 命令查看 */
netdev = netdev_get_by_name(argv[1]);
if (netdev == RT_NULL)
{
rt_kprintf("not find network interface device name(%s).\n", argv[1]);
return -1;
}
/* 设置默认网卡对象 */
netdev_set_default(netdev);
rt_kprintf("set default network interface device(%s) success.\n", argv[1]);
return 0;
}
#include
/* 导出命令到 FinSH 控制台 */
MSH_CMD_EXPORT_ALIAS(netdev_set_default_test, netdev_set_default, set default network interface device);
这样我们就可以通过网页切换,按键切换等多种方法。
其实我们不手动切换,当我们的网线插拔一下,触发了状态切换,也会自动切换到wifi网卡。
但是我们不插拔的情况下,岂不是连不上网。
于是想了个办法:
(1)首先上电默认网卡为e0(网口)
(2)当wifi连接成功后,自动将默认网卡改为wifi.
wlan_dev.c文件,rt_wlan_event_dispatch 函数
(3)当有网线插入后,然后再将网卡改为e0.
drv_eth.c文件中的static void phy_linkchange()函数
(4)当网线拔掉后,程序的自动切换程序会自动切换到wifi。
这样就可以愉快的进行两个网卡的自由切换。