网络设备抽象层(NetDev)示例

功能说明

本示例演示如何使用 LISA 网络设备抽象层(NetDev)管理多种网络接口,包括:

  • 初始化网络设备子系统

  • 注册和管理多个网络设备(WiFi、4G)

  • 设置网络设备优先级实现自动切换

  • 监听网络状态变化

  • 查询网络设备状态

NetDev 提供了统一的网络设备管理接口,支持多网卡共存和自动切换,应用层无需关心底层使用的是 WiFi 还是 4G 网络。

硬件连接

本示例支持 WiFi 和 4G 两种网络接口:

WiFi(默认启用):

  • 使用芯片内部 WiFi 外设,无需额外接线

4G Modem(可选):

  • 默认使用 uart1 设备与 ML307 模块通信

  • 需要根据实际硬件连接修改 MODEM_UART_DEVICE

串口输出:

  • 串口 TX: PA3

  • 波特率:921600

示例内容

  1. 初始化网络设备子系统

  2. 初始化并注册 WiFi 网络设备(优先级 100)

  3. 初始化并注册 4G 网络设备(优先级 500,可选)

  4. 设置网络状态变化回调

  5. 演示优先级管理(修改和恢复设备优先级)

  6. 演示设备状态查询

  7. 定期打印已注册的网络设备列表

配置修改

使用前请修改 src/main.c 中的配置:

// WiFi 配置
#define TARGET_WIFI_SSID    "your_wifi_ssid"
#define TARGET_WIFI_PWD     "your_wifi_pwd"

// 4G Modem 配置(如果启用)
#define MODEM_UART_DEVICE   "uart1"

启用 4G Modem

如需同时使用 WiFi 和 4G,取消 prj.conf 中的注释:

# 4G Modem 配置(可选,取消注释以启用)
CONFIG_LISA_MODEM=y

编译

重要提示:在编译前,请先确认您使用的开发板型号。SDK 目前支持以下开发板:

  • arcs_evb - ARCS EVB 评估板

  • arcs_mini - ARCS Mini 开发板

根据您的开发板型号,选择对应的编译命令:

在示例目录下执行编译:

# 使用 arcs_evb 开发板
./build.sh -C -DBOARD=arcs_evb

# 或使用 arcs_mini 开发板
./build.sh -C -DBOARD=arcs_mini

Note

如果在 SDK 根目录执行,需要指定示例路径:

# 使用 arcs_evb 开发板
./build.sh -C -S samples/<示例路径> -DBOARD=arcs_evb

# 或使用 arcs_mini 开发板
./build.sh -C -S samples/<示例路径> -DBOARD=arcs_mini

Note

确保已安装对应的工具链。

烧录

编译完成后,使用 SDK tools 目录下的 cskburn 工具烧录固件:

./tools/burn/cskburn -s /dev/ttyUSB0 -b 3000000 0x0 build/arcs.bin -C arcs

Note

烧录参数说明

  • -s /dev/ttyUSB0:串口设备路径,需要根据实际情况修改 - Linux 系统:通常是 /dev/ttyUSB0/dev/ttyACM0 - 可通过 ls /dev/tty* 命令查看可用串口设备 - 不同开发板或 USB 转串口芯片可能使用不同的设备名

  • -b 3000000:烧录波特率(3Mbps)

  • 0x0:烧录起始地址

  • build/arcs.bin:编译生成的固件路径

  • -C arcs:芯片类型

注意事项

  • 确保开发板已正确连接到电脑

  • 如果无法识别串口设备,请检查 USB 连接线是否正常,或尝试其他 USB 端口

预期输出

系统启动后,终端将输出以下内容:

[I][net] === NetDev (Network Device Abstraction) Example ===
[I][net] Initializing NetDev subsystem...
[I][net] NetDev subsystem initialized
[I][net] Initializing WiFi device...
[I][net] WiFi MAC: XX:XX:XX:XX:XX:XX
[I][net] WiFi device initialized and registered
[I][net] Callbacks set for WiFi device
[I][net] Waiting for network devices to be ready...
[I][net] WiFi connection status: 1
[I][net] WiFi connected to AP
[I][net] DHCP Success: IP=192.168.1.100
[I][net] NetDev [wifi0] status changed: LINK_UP
[I][net] NetDev [wifi0] address changed: IP_CHANGED
[I][net] NetDev [wifi0] IP: 192.168.1.100
[I][net] === Priority Management Demo ===
[I][net] === Registered Network Devices ===
[I][net] [0] Name: wifi0, Priority: 100, Flags: 0x01D5
[I][net]     IP: 192.168.1.100
[I][net]     Status: UP=1, LINK=1, INET=1, DHCP=1
[I][net] Default device: wifi0
[I][net] WiFi priority: 100
[I][net] === Device Status Demo ===
[I][net] WiFi device status:
[I][net]   UP: Yes
[I][net]   Link: Up
[I][net]   Internet: Up
[I][net]   DHCP: Enabled
[I][net] First device with LINK_UP: wifi0
[I][net] === Example completed ===

核心 API

API

说明

netdev_init()

初始化网络设备子系统

app_netdev_register()

按名称注册网络设备

netdev_unregister_by_name()

按名称注销网络设备

netdev_get_by_name()

按名称获取网络设备

netdev_get_first_by_flags()

获取具有指定状态的第一个设备

netdev_set_priority()

设置设备优先级

netdev_get_priority()

获取设备优先级

netdev_set_status_callback()

设置状态变化回调

netdev_set_addr_callback()

设置地址变化回调

netdev_is_up()

检查设备是否启用

netdev_is_link_up()

检查链路是否连接

netdev_is_internet_up()

检查互联网是否可用

关键代码

1. 初始化和注册网络设备

/* 初始化网络设备子系统 */
if (netdev_init() != 0) {
    LISA_LOGE(LOG_TAG, "Error: Failed to initialize NetDev");
    return -1;
}

/* 注册 WiFi 网络设备(优先级 100) */
if (app_netdev_register("wifi0", 100) != 0) {
    LISA_LOGE(LOG_TAG, "Error: Failed to register WiFi device");
    return -1;
}

2. 设置状态变化回调

static void netdev_status_callback(struct netdev *netdev, enum netdev_cb_type type)
{
    switch (type) {
    case NETDEV_CB_STATUS_LINK_UP:
        LISA_LOGI(LOG_TAG, "Device %s link up", netdev->name);
        break;
    case NETDEV_CB_STATUS_LINK_DOWN:
        LISA_LOGI(LOG_TAG, "Device %s link down", netdev->name);
        break;
    /* ... */
    }
}

/* 设置回调 */
struct netdev *netdev = netdev_get_by_name("wifi0");
netdev_set_status_callback(netdev, netdev_status_callback);

3. 优先级管理

/* 获取设备优先级 */
int priority = netdev_get_priority("wifi0");

/* 设置设备优先级(数值越小优先级越高) */
netdev_set_priority("ml307", 50);  /* 提升 4G 优先级 */

4. 设备状态查询

struct netdev *netdev = netdev_get_by_name("wifi0");

if (netdev_is_up(netdev)) {
    LISA_LOGI(LOG_TAG, "Device is up");
}

if (netdev_is_link_up(netdev)) {
    LISA_LOGI(LOG_TAG, "Link is connected");
}

if (netdev_is_internet_up(netdev)) {
    LISA_LOGI(LOG_TAG, "Internet is available");
}

配置说明

prj.conf 关键配置

# SAL 网络抽象层
CONFIG_SAL_USING_POSIX=y

# LISA 网络组件
CONFIG_LISA_NETWORK=y

# WiFi 配置
CONFIG_WIFI=y
CONFIG_LISA_WIFI=y
CONFIG_WIFI_MANAGER=y

# LWIP 网络栈
CONFIG_LWIP=y
CONFIG_LWIP_OPTION_LWIP_DNS=y

# 4G Modem(可选)
# CONFIG_LISA_MODEM=y

优先级说明

NetDev 使用优先级来决定默认网络设备:

  • 数值越小,优先级越高

  • WiFi 默认优先级:100

  • 4G 默认优先级:500

当多个网络设备都可用时,系统自动选择优先级最高(数值最小)的设备作为默认设备。

注意事项

  1. 优先级设置:优先级值范围为 0-255,数值越小优先级越高,0 会被设置为默认值 100

  2. 设备名称规范

    • WiFi 设备:wifi0wlan0

    • 4G 设备:ml3074g0lte0

  3. 多网卡共存:同时启用 WiFi 和 4G 时,系统根据优先级自动选择默认设备

  4. 回调线程安全:状态回调可能在不同线程上下文中被调用,注意线程安全

  5. 资源释放:程序退出前应调用 netdev_unregister_by_name() 注销设备

相关文档