跳转至

01 使用WAN功能或者多网切换模式连接http测试网络连通性

作者:王城钧 | 最后修改:2026-04-30

一、概述

本章节演示 Air780EGH 核心板的以太网功能

Air780EGH 核心板通过 AirETH_1000 配件板和网线连接路由器,访问公网获取数据。

二、准备硬件环境

Air780EGH 核心板一块 + 可上网的 sim 卡一张 + 网线一根 +AirETH_1000 配件板一个,硬件连接示意图,如下图所示:

TYPE-C USB 数据线一根 + 杜邦线若干;

  • Air780EGH 核心板通过 TYPE-C USB 口供电;(USB 供电 拨动开关 拨到 USB ON 一端,充电供电 拨码开关 选择充电)
  • TYPE-C USB 数据线直接插到核心板的 TYPE-C USB 座子,另外一端连接电脑 USB 口;
  • AirETH_1000 板子网口与路由器通过网线连接;

3、Air780EGH 核心板和 AirETH_1000 配件板的硬件接线方式为:

Air780EXX核心板 AirETH_1000配件板
3V3 3.3v
gnd gnd
86/SPI0CLK SCK
83/SPI0CS CSS
84/SPI0MISO SDO
85/SPI0MOSI SDI
22/GPIO1 INT

三、准备软件环境

  1. 烧录工具:Luatools 工具

  2. Air780EGH 烧录需要的固件和脚本文件:

内核固件:Air780EGH V2012 版本固件(理论上,2025 年 7 月 26 日之后发布的固件都可以)

脚本文件:demo 点这里

  1. LuatOS 运行所需要的 lib 文件:使用 Luatools 烧录时,勾选 添加默认 lib 选项,使用默认 lib 脚本文件。

准备好软件环境之后,接下来参考 Air780EGH 核心板烧录说明将本篇文章中演示使用的项目文件烧录到 Air780EGH 核心板中。

四、实现功能概述

4.1 通过外挂 AirETH_1000 配件板使用 WAN 功能或者多网切换模式连接 http 测试网络连通性。

http_app.lua

-- 普通的http get请求功能演示
-- 请求的body数据保存到内存变量中,在内存够用的情况下,最大支持32KB的数据存储到内存中
-- timeout可以设置超时时间
-- callback可以设置回调函数,可用于实时检测body数据的下载进度
local function http_app_get()
    -- https get请求https://www.air32.cn/网页内容
    -- 如果请求成功,请求的数据保存到body中
    local code, headers, body = http.request("GET", "https://www.air32.cn/").wait()
    log.info("http_app_get1",
        code == 200 and "success" or "error",
        code,
        json.encode(headers or {}),
        body and (body:len() > 512 and body:len() or body) or "nil")

    -- https get请求https://www.luatos.com/网页内容,超时时间为10秒
    -- 请求超时时间为10秒,用户自己写代码时,不要照抄10秒,根据自己业务逻辑的需要设置合适的超时时间
    -- 回调函数为http_cbfunc,回调函数使用的第三个回调参数为"http_app_get2"
    -- 如果请求成功,请求的数据保存到body中
    code, headers, body = http.request("GET", "https://www.luatos.com/", nil, nil,
        { timeout = 10000, userdata = "http_app_get2", callback = http_cbfunc }).wait()
    log.info("http_app_get2",
        code == 200 and "success" or "error",
        code,
        json.encode(headers or {}),
        body and (body:len() > 512 and body:len() or body) or "nil")

    -- http get请求http://httpbin.air32.cn/get网页内容,超时时间为3秒
    -- 请求超时时间为3秒,用户自己写代码时,不要照抄3秒,根据自己业务逻辑的需要设置合适的超时时间
    -- 回调函数为http_cbfunc,回调函数使用的第三个回调参数为"http_app_get3"
    -- 如果请求成功,请求的数据保存到body中
    code, headers, body = http.request("GET", "http://httpbin.air32.cn/get", nil, nil,
        { timeout = 3000, userdata = "http_app_get3", callback = http_cbfunc }).wait()
    log.info("http_app_get3",
        code == 200 and "success" or "error",
        code,
        json.encode(headers or {}),
        body and (body:len() > 512 and body:len() or body) or "nil")
end

-- http app task 的任务处理函数
local function http_app_task_func()
    while true do
        -- 如果当前时间点设置的默认网卡还没有连接成功,一直在这里循环等待
        while not socket.adapter(socket.dft()) do
            log.warn("http_app_task_func", "wait IP_READY", socket.dft())
            -- 在此处阻塞等待默认网卡连接成功的消息"IP_READY"
            -- 或者等待1秒超时退出阻塞等待状态;
            -- 注意:此处的1000毫秒超时不要修改的更长;
            -- 因为当使用exnetif.set_priority_order配置多个网卡连接外网的优先级时,会隐式的修改默认使用的网卡
            -- 当exnetif.set_priority_order的调用时序和此处的socket.adapter(socket.dft())判断时序有可能不匹配
            -- 此处的1秒,能够保证,即使时序不匹配,也能1秒钟退出阻塞状态,再去判断socket.adapter(socket.dft())
            sys.waitUntil("IP_READY", 1000)
        end

        -- 检测到了IP_READY消息
        log.info("http_app_task_func", "recv IP_READY", socket.dft())

        -- 普通的http get请求功能演示
        http_app_get()

        -- 50秒之后,循环测试
        sys.wait(50000)
    end
end

--创建并且启动一个task
--运行这个task的处理函数http_app_task_func
sys.taskInit(http_app_task_func)

netdrv_eth_spi.lua

local exnetif = require "exnetif"

local function ip_ready_func(ip, adapter)    
    if adapter == socket.LWIP_ETH then
        -- 在位置1和2设置自定义的DNS服务器ip地址:
        -- "223.5.5.5",这个DNS服务器IP地址是阿里云提供的DNS服务器IP地址;
        -- "114.114.114.114",这个DNS服务器IP地址是国内通用的DNS服务器IP地址;
        -- 可以加上以下两行代码,在自动获取的DNS服务器工作不稳定的情况下,这两个新增的DNS服务器会使DNS服务更加稳定可靠;
        -- 如果使用专网卡,不要使用这两行代码;
        -- 如果使用国外的网络,不要使用这两行代码;
        socket.setDNS(adapter, 1, "223.5.5.5")
        socket.setDNS(adapter, 2, "114.114.114.114")

        log.info("netdrv_eth_spi.ip_ready_func", "IP_READY", socket.localIP(socket.LWIP_ETH))
    end
end

local function ip_lose_func(adapter)    
    if adapter == socket.LWIP_ETH then
        log.warn("netdrv_eth_spi.ip_lose_func", "IP_LOSE")
    end
end


-- 以太网联网成功(成功连接路由器,并且获取到了IP地址)后,内核固件会产生一个"IP_READY"消息
-- 各个功能模块可以订阅"IP_READY"消息实时处理以太网联网成功的事件
-- 也可以在任何时刻调用socket.adapter(socket.LWIP_ETH)来获取以太网是否连接成功

-- 以太网断网后,内核固件会产生一个"IP_LOSE"消息
-- 各个功能模块可以订阅"IP_LOSE"消息实时处理以太网断网的事件
-- 也可以在任何时刻调用socket.adapter(socket.LWIP_ETH)来获取以太网是否连接成功

--此处订阅"IP_READY"和"IP_LOSE"两种消息
--在消息的处理函数中,仅仅打印了一些信息,便于实时观察“通过SPI外挂CH390H芯片的以太网卡”的连接状态
--也可以根据自己的项目需求,在消息处理函数中增加自己的业务逻辑控制,例如可以在连网状态发生改变时更新网络图标
sys.subscribe("IP_READY", ip_ready_func)
sys.subscribe("IP_LOSE", ip_lose_func)


local function netdrv_eth_spi_task_func()
-- 配置SPI外接以太网芯片CH390H的单网卡,exnetif.set_priority_order使用的网卡编号为socket.LWIP_ETH
-- 本demo使用Air780EHM/EHV/EGH核心板+AirETH_1000配件板测试,核心板上的硬件配置为:
-- 核心板的VDD 3V3管脚对AirETH_1000配件板进行供电;3V3管脚是作为LDO 3.3V输出,供测试用的,仅在使用DCDC供电时有输出,默认打开,无需控制
-- 使用spi0,片选引脚使用GPIO8
-- 如果使用的硬件和以上描述的环境不同,根据自己的硬件配置修改以下参数
-- INT中断引脚,使用中断模式提高响应速度,此参数为可选参数,若不填默认不使用中断模式而是使用轮询模式
    exnetif.set_priority_order({
        {
            ETHERNET = {
                pwrpin = nil,
                tp = netdrv.CH390,
                opts = {spi = 0, cs = 8,irq = 1}
            }
        }
    })
end

-- 启动一个task,task的处理函数为netdrv_eth_spi_task_func
-- 在处理函数中调用exnetif.set_priority_order设置网卡优先级
-- 因为exnetif.set_priority_order要求必须在task中被调用,所以此处启动一个task
sys.taskInit(netdrv_eth_spi_task_func)

五、功能演示

5.1 http 连通性测试

Air780EGH 核心板通过外接 AirETH_1000 连接连接到路由器 LAN 口。

硬件连接完毕后开机开始烧录代码,出现如下打印说明连接状态正常。

常见问题

  1. 日志打印 pid/vid 失败,请检查连线,如下图所示

可按下面的思路进行排查:

1.1. 检查 ch390 供电。

1.2. 检查 AirETH_1000 与 Air780EGH 之间的 SPI 连线是否正常,线序连接有无问题。

1.3. 检查路由器自身状态是否正常。

1.4. 检查网线本身水晶头连接是否正常。