一.ART-PI网络功能

ART-PI中有两种网络连接方式:

1.一个是他自带的wifi模块AP6212,这个模块是蓝牙和wifi一体的,使用的是SDIO接口。

android 开启双wifi_android 开启双wifi

 

2.一个是通过工业扩展板,的网口,网口芯片使用的是LAN8720A

 

android 开启双wifi_网口 net_02

二.RT-studio中进行网络配置

1.在studio中直接打开开关就可以了。

android 开启双wifi_网线_03

 

这时候进行代码编译,下载。

android 开启双wifi_网线_04

 

可以看到打印信息,网络初始化成功。

但是此时网络还是没有连接成功的。

2.wifi 网络连接,通过终端命令进行扫描,

android 开启双wifi_网线_05

进行网络加入:

android 开启双wifi_RT-thread 网络_06

之后通过网页进行wifi的扫描和配置。

查看IP,已经能够查看到了。

android 开启双wifi_网口 net_07

ping 下百度。

此时是ping不通的,配置没有配置对?

3.在此,我们先插上网线试一下网口的功能。

android 开启双wifi_网线_08

android 开启双wifi_网卡切换_09

 

网口功能是正常的。

4.这个时候怀疑,网口作为e0,wifi作为w0,切换的时候需要切换网卡,来指定哪个模块来进行网络连接。

将网口的驱动卸载后,只有一个wifi网卡,

android 开启双wifi_网卡切换_10

 

确实是可以ping通了,说明确实是需要切换一下,网卡。那么怎么切换到指定的网卡呢??

注:

 

 

这个时候可以明确通过简单的配置,确实可以实现双网卡,但是需要自己切换网卡,才能确保网络的正常匹配及运行

同时在此基础上,我们还有很多要优化的,例如怎么上电默认连接之前的wifi,   怎么网页配置扫描wifi,  怎么自动切换网卡?

 

三.程序优化

1.对接easyflash,使网络上电默认连接之前的wifi.(查看上节文章)

在上面我们的wifi已经能够正常上网了,但是此时断电重启,是不会自动重连到之前的网络,

网络信息是其实并没有存储到flash中,这里我们需要借助easyflash进行网络信息的存储。

参考官方art_pi_wifi实例。

android 开启双wifi_android 开启双wifi_11

 

将wifi_config.c拷贝到我们工程的文件夹下。

然后在main.c中添加几行代码:

android 开启双wifi_RT-thread 网络_12

 

进行编译:

android 开启双wifi_网线_13

下载的时候ef_port_init() 出现了报错。卡死了

通过debug,part = fal_partition_find(FAL_EF_PART_NAME);这个报错

改为这个名称后,正常:

android 开启双wifi_android 开启双wifi_14

android 开启双wifi_网卡切换_15

 

现在我们扫描,加载wifi,使成功入网:

android 开启双wifi_网线_16

此时是正常的,看下

android 开启双wifi_网卡切换_17

 

自动重连功能也变为了开启状态。此时断电重启下试试:

android 开启双wifi_android 开启双wifi_18

发现自动重连了。。。哈哈

 

2.实现多网卡管控,wifi和网口自动切换(网口优先)

有时在一些环境下wifi质量不好,我们想使用网线,那么怎么实现自动切换呢?

 

netdev(network interface device),即网络接口设备,又称网卡。每一个用于网络连接的设备都可以注册成网卡,为了适配更多的种类的网卡,避免系统中对单一网卡的依赖,RT-Thread 系统提供了 netdev 组件用于网卡管理和控制。

android 开启双wifi_android 开启双wifi_19

android 开启双wifi_RT-thread 网络_20

 

在上面我们也知道,并不是wifi不能联网,只是默认的网卡为网口,但是已经开启了自动切换啊,网卡没有网络,按说就应该切换到wifi,为什么不行呢??

android 开启双wifi_网线_21

我们明确几个函数:

android 开启双wifi_android 开启双wifi_22

android 开启双wifi_网卡切换_23

android 开启双wifi_网线_24

android 开启双wifi_网线_25

android 开启双wifi_网线_26

 

 

 

 

在netdev.c文件中static void netdev_auto_change_default(struct netdev *netdev)这个函数进行了默认网卡的设置。

android 开启双wifi_网线_27

自动切换网卡开启之后,只有默认网卡自己的状态发生改变才能从有联网能力的网卡中配置默认网卡,但是发现两个网卡状态一直没有发生改变。

android 开启双wifi_网线_28

知道了接口我们可以自己人为的去判断网络状态,通过函数进行状态切换。

下面为切换的代码

直接在main.c中添加如下代码

#include <arpa/inet.h>
#include <netdev.h>       /* 当需要网卡操作是,需要包含这两个头文件 */

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.h>
/* 导出命令到 FinSH 控制台 */
MSH_CMD_EXPORT_ALIAS(netdev_set_default_test, netdev_set_default, set default network interface device);

 

android 开启双wifi_android 开启双wifi_29

这样我们就可以通过网页切换,按键切换等多种方法。

 

其实我们不手动切换,当我们的网线插拔一下,触发了状态切换,也会自动切换到wifi网卡。

但是我们不插拔的情况下,岂不是连不上网。

于是想了个办法:

(1)首先上电默认网卡为e0(网口)

(2)当wifi连接成功后,自动将默认网卡改为wifi.

wlan_dev.c文件,rt_wlan_event_dispatch 函数

android 开启双wifi_RT-thread 网络_30

(3)当有网线插入后,然后再将网卡改为e0.

drv_eth.c文件中的static void phy_linkchange()函数

android 开启双wifi_网线_31

 

(4)当网线拔掉后,程序的自动切换程序会自动切换到wifi。

这样就可以愉快的进行两个网卡的自由切换。