跳转至

Index

作者:王城钧 | 最后修改:2026-10-16

一、引言

Air8101 核心板通过外接 AirPHY_1000 配件板实现连接 http 测试网络连通性

二、准备硬件环境

1、Air8101 核心板一块

2、TYPE-C USB 数据线一根

3、USB 转串口数据线一根

4、Air8101 核心板和数据线的硬件接线方式为

  • Air8101 核心板通过 TYPE-C USB 口供电;(核心板背面的功耗测试开关拨到 OFF 一端)
  • 如果测试发现软件频繁重启,重启原因值为:poweron reason 0,可能是供电不足,此时再通过直流稳压电源对核心板的 vbat 管脚进行 4V 供电,或者 VIN 管脚进行 5V 供电;
  • TYPE-C USB 数据线直接插到核心板的 TYPE-C USB 座子,另外一端连接电脑 USB 口;

5、 AirPHY_1000 配件板一块,Air8101 核心板和 AirPHY_1000 配件板的硬件接线方式为:

Air8101 核心板购买链接:Air8101 核心板 WiFi 4G 以太网 蓝牙 720P显示屏 200万拍照-淘宝网

三、准备软件环境

  1. 烧录工具:Luatools 下载调试工具

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

  3. 脚本文件:Air8101 脚本文件

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

准备好软件环境之后,接下来查看 Air8101 核心板使用说明中的《4.2 烧录项目文件到 Air8101 核心板中》章节内容,将本篇文章中演示使用的项目文件烧录到 Air8101 核心板中。

四、软硬件资料

4.1 api

本文仅介绍程序中使用到的 API 接口,详细接口说明请查看:核心库 API 索引 - luatos@air8101 - 合宙模组资料中心。

exnetif.setproxy(adapter, main_adapter, other_configs)

配置网络代理实现多网融合;

4.2 以太网电路介绍

以太网电路介绍请查看:以太网 RJ45 电路介绍 - luatos@air8101 - 合宙模组资料中心

五、整体功能演示

5.1 运行结果展示

5.2 源码展示

http_app.lua

local function http_app_get()
    -- https get请求https://httpbin.luatos.com/get的网页内容
    -- 如果请求成功,请求的数据保存到body中
    local code, headers, body = http.request("GET", "https://httpbin.luatos.com/get").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.luatos.com/get网页内容,超时时间为3秒
    -- 请求超时时间为3秒,用户自己写代码时,不要照抄3秒,根据自己业务逻辑的需要设置合适的超时时间
    -- 回调函数为http_cbfunc,回调函数使用的第三个回调参数为"http_app_get3"
    -- 如果请求成功,请求的数据保存到body中
    code, headers, body = http.request("GET", "http://httpbin.luatos.com/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_rmii.lua **

local function ip_ready_func(ip, adapter)
    if adapter == socket.LWIP_ETH then
        log.info("netdrv_eth_rmii.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_rmii.ip_lose_func", "IP_LOSE")
    end
end


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


-- 设置默认网卡为socket.LWIP_ETH
socket.dft(socket.LWIP_ETH)


-- 本demo测试使用的是核心板的VDD 3V3引脚对AirPHY_1000配件板进行供电
-- VDD 3V3引脚是Air8101内部的LDO输出引脚,最大输出电流300mA
-- GPIO13在Air8101内部使能控制这个LDO的输出
-- 所以在此处GPIO13输出高电平打开这个LDO
gpio.setup(13, 1, gpio.PULLUP)


--初始化以太网卡

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

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

--在以太网卡上开启动态主机配置协议
netdrv.dhcp(socket.LWIP_ETH, true)

main.lua

PROJECT = "HTTP"
VERSION = "001.000.000"


-- 在日志中打印项目名和项目版本号
log.info("main", PROJECT, VERSION)


-- 如果内核固件支持wdt看门狗功能,此处对看门狗进行初始化和定时喂狗处理
-- 如果脚本程序死循环卡死,就会无法及时喂狗,最终会自动重启
if wdt then
    --配置喂狗超时时间为9秒钟
    wdt.init(9000)
    --启动一个循环定时器,每隔3秒钟喂一次狗
    sys.timerLoopStart(wdt.feed, 3000)
end


-- 如果内核固件支持errDump功能,此处进行配置,【强烈建议打开此处的注释】
-- 因为此功能模块可以记录并且上传脚本在运行过程中出现的语法错误或者其他自定义的错误信息,可以初步分析一些设备运行异常的问题
-- 以下代码是最基本的用法,更复杂的用法可以详细阅读API说明文档
-- 启动errDump日志存储并且上传功能,600秒上传一次
-- if errDump then
--     errDump.config(true, 600)
-- end


-- 使用LuatOS开发的任何一个项目,都强烈建议使用远程升级FOTA功能
-- 可以使用合宙的iot.openluat.com平台进行远程升级
-- 也可以使用客户自己搭建的平台进行远程升级
-- 远程升级的详细用法,可以参考fota的demo进行使用


-- 启动一个循环定时器
-- 每隔3秒钟打印一次总内存,实时的已使用内存,历史最高的已使用内存情况
-- 方便分析内存使用是否有异常
-- sys.timerLoopStart(function()
--     log.info("mem.lua", rtos.meminfo())
--     log.info("mem.sys", rtos.meminfo("sys"))
-- end, 3000)

-- 加载网络驱动设备功能模块
require "netdrv_device"

-- 加载http应用功能模块
require "http_app"

-- 用户代码已结束---------------------------------------------
-- 结尾总是这一句
sys.run()
-- sys.run()之后不要加任何语句!!!!!因为添加的任何语句都不会被执行

六、总结

至此,我们已使用 Air8101 核心板 通过外接 AirPHY_1000 配件板实现连接 http 测试网络连通性演示了的功能

搜索