跳转至

01 Air8101外挂Air780EPM使用4G上网

作者:魏健强 | 最后修改:2026-04-09

一、引言

本指南所演示的是 Air8101 模块通过外挂 Air780EPM 模块,基于 airlink 核心库实现 4G 联网的功能,通过 exnetif 扩展库实现多网卡网络优先级设置功能。

二、准备硬件环境

参考:硬件环境清单,准备以及组装好基本硬件环境。

2.1 Air8101 核心板

2.2 Air780EPM V1.2 开发板

三、准备软件环境

参考:Air8101 软件环境清单,准备好软件环境。

1.烧录工具:参考 Luatools 工具使用说明

2.本demo开发测试时使用的固件为Air8101 V2002 版本固件,(请使用大于等于 2002 版本号的固件),所以你如果要测试本demo时,可以直接使用最新版本的内核固件;如果发现最新版本的内核固件测试有问题,可以使用我们开发本demo时使用的内核固件版本来对比测试;

脚本文件:https://gitee.com/openLuat/LuatOS/tree/master/module/Air8101/demo/airlink

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

准备好软件环境之后,接下来查看烧录 Air8101 核心板的介绍如何烧录项目文件到 Air780EPM 开发板,将本篇文章中演示使用的项目文件烧录到 Air8101 核心板和 Air780EPM 开发板中。

四、常用 API 接口介绍

本文仅介绍程序中使用到的 API 接口,详细接口说明请查看:LuatOS 库函数开发手册 - 合宙模组资料中心

全部 airlink 相关 API 接口介绍可参考:airlink,本文只着重介绍代码中用到的 API 接口。

4.2 netdrv 相关 API 接口介绍

全部 netdrv 相关 API 接口介绍可参考:netdrv,本文只着重介绍代码中用到的 API 接口。

4.3 exnetif 扩展库相关 API 接口介绍

全部 exnetif 扩展库相关 API 接口介绍可参考:exnetif,本文只着重介绍代码中用到的 API 接口。

五、硬件资料及接线说明

5.1 硬件资料说明

Air8101 实现 4G 上网的硬件资料可参考:https://docs.openluat.com/air8101/luatos/hardware/design/4gnet/

5.2 Air8101 与 Air780EPM 接线说明

下列表格为 SPI0 的接线说明,本次测试使用 SPI0 接法进行演示。

5.2 Air8101 实物接线图

5.3 Air780EPM 实物接线图

六、整体功能演示

6.1 功能概述

  1. Air8101 外挂 Air780EPM 实现 4G 联网。
  2. Air8101 与 Air780EPM 数据信息互传。
  3. Air8101 实现 4G 联网后进行 HTTP GET 请求,通过 exnetif 扩展库实现多网卡网络优先级设置功能。

6.2 演示

6.2.1 代码实现

由于本文需要用到的代码内容过多,大家可通过链接跳转到仓库代码中查看,本文只展示 Air8101 和 Air780EPM 的主要功能代码。

Air8101 主要功能代码

下列为 network_airlink.lua 文件中代码内容。

--[[
@module  network_airlink
@summary airlink多网融合模块
@version 1.0
@date    2025.10.15
@author  魏健强
@usage
本demo演示的核心功能为:
1. 初始化4G和WiFi网络连接。
2. Air8101与对端设备进行数据交互。
3. 自动切换网络连接模式。
4. 通过HTTP GET请求测试网络连接情况。
]]
exnetif = require "exnetif"

-- 初始化网络,使得Air8101可以外挂Air780EPM实现4G联网功能。
local function init_airlink_net()
    exnetif.set_priority_order({
    -- {
    --     WIFI = { -- WiFi配置
    --         ssid = "test", -- WiFi名称(string)
    --         password = "HZ88888888" -- WiFi密码(string)
    --     }
    -- }, 
    { -- 开启4G虚拟网卡
        airlink_4G = {
            auto_socket_switch = false -- 切换网卡时是否断开之前网卡的所有socket连接并用新的网卡重新建立连接
        }
    }})
end

local function netdrv_multiple_notify_cbfunc(net_type,adapter)
    if type(net_type)=="string" then
        log.info("netdrv_multiple_notify_cbfunc", "use new adapter", net_type, adapter)
    elseif type(net_type)=="nil" then
        log.warn("netdrv_multiple_notify_cbfunc", "no available adapter", net_type, adapter)
    else
        log.warn("netdrv_multiple_notify_cbfunc", "unknown status", net_type, adapter)
    end
end

-- 设置网卡状态变化通知回调函数netdrv_multiple_notify_cbfunc
exnetif.notify_status(netdrv_multiple_notify_cbfunc)

-- Air8101发送数据信息给Air780EPM。
local function airlink_sdata_Air780EPM()
    -- 设置网络时间同步。
    socket.sntp()
    while true do
        -- rtos.bsp():设备硬件bsp型号;os.date():本地时间。
        local data = rtos.bsp() .. " " .. os.date()
        log.info("发送数据给对端设备", data, "当前airlink状态", airlink.ready())
        airlink.sdata(data)
        sys.wait(1000)
        log.info("ticks", mcu.ticks(), hmeta.chip(), hmeta.model(), hmeta.hwver())
        airlink.statistics()
    end
end
-- 一个简单的HTTP GET请求测试程序,用于判断Air8101的网络连接情况。
local function http_get_test()
    while true do
        sys.wait(10000)
        -- 发起一个HTTP GET请求。
        log.info("发起HTTP GET请求", "https://httpbin.air32.cn/bytes/2048")
        local code, headers, body = http.request("GET", "https://httpbin.air32.cn/bytes/2048", nil, nil, {
            timeout = 3000
        }).wait()

        -- 打印HTTP请求的结果,包括响应码code和响应体长度#body。
        if code == 200 then
            log.info("HTTP请求成功", "响应码", code, "响应体长度", body and #body)
            sys.publish("打印网卡信息", "succeeded")
        else
            log.error("HTTP请求失败", "错误码", code)
            sys.publish("打印网卡信息", "failed")
        end
    end
end

-- 订阅airlink的SDATA事件,打印收到的信息。
local function airlink_sdata(data)
    -- 打印收到的信息。
    log.info("收到AIRLINK_SDATA!!", data)
end

-- 开启airlink
sys.taskInit(init_airlink_net)
-- Air8101发送数据信息给Air780EPM。
sys.taskInit(airlink_sdata_Air780EPM)
sys.taskInit(http_get_test)
-- 订阅airlink的SDATA事件,打印收到的信息。
sys.subscribe("AIRLINK_SDATA", airlink_sdata)

Air780EPM 主要功能代码

下列为 network_airlink.lua 文件中代码内容。

--[[
@module  network_airlink
@summary airlink多网融合模块
@version 1.0
@date    2025.10.15
@author  魏健强
@usage
本demo演示的核心功能为:
1. 初始化网络,使得Air8101可以外挂Air780EPM实现4G联网功能
2. Air780EPM与对端设备进行数据交互。
3. 通过HTTP GET请求测试Air780EPM的网络访问外网是否正常。
]]

-- 加载需要用到的功能模块。
dnsproxy = require("dnsproxy")

-- 初始化网络,使得Air8101可以外挂Air780EPM实现4G联网功能。
local function init_airlink_net()
    -- 延时100毫秒。
    sys.wait(100)
    -- 初始化airlink。
    airlink.init()
    -- 创建桥接网络设备。
    log.info("创建桥接网络设备")
    netdrv.setup(socket.LWIP_GP_GW, netdrv.WHALE)
    -- 启动airlink,配置Air780EPM作为SPI主机模式。
    airlink.start(airlink.MODE_SPI_SLAVE) 
    -- 配置IPv4地址。
    log.info("配置IPv4地址", "192.168.111.2", "255.255.255.0", "192.168.111.1")
    netdrv.ipv4(socket.LWIP_GP_GW, "192.168.111.2", "255.255.255.0", "192.168.111.1")
    -- 延时100毫秒。
    sys.wait(100)
    -- 等待网络就绪,默认事件主题为IP_READY,设置超时时间为10秒。
    sys.waitUntil("IP_READY", 10000)
    -- 配置网络地址端口转换(NAPT),此处使用4G网络作为主网关出口。
    netdrv.napt(socket.LWIP_GP)
    -- 设置DNS代理。
    dnsproxy.setup(socket.LWIP_GP_GW, socket.LWIP_GP)
end

-- Air780EPM发送数据信息给Air8101。
local function airlink_sdata_Air8101()
    while true do
        -- rtos.bsp():设备硬件bsp型号;os.date():本地时间。
        local data = rtos.bsp() .. " " .. os.date()

        log.info("发送数据给对端设备", data, "当前airlink状态", airlink.ready())
        airlink.sdata(data)

        -- 此处代码用于实现Air780EPM网络状态的持续检测,并持续给对端设备发送网络状态信息,方便对端设备作应对处理。
        -- 如果有需要,可以打开注释。
        -- local net_state = socket.adapter(socket.LWIP_GP)
        -- if net_state then
        --     airlink.sdata("Air780EPM_IP_READY!!")
        -- else
        --     airlink.sdata("Air780EPM_IP_LOSE!!")
        -- end

        sys.wait(1000)
        log.info("ticks", mcu.ticks(), hmeta.chip(), hmeta.model(), hmeta.hwver())
        airlink.statistics()
    end
end

-- 一个简单的HTTP GET请求测试程序,用于判断Air780EPM的网络访问外网是否正常。
local function http_get_test()
    -- 循环发起HTTP GET请求,测试Air780EPM的网络访问外网是否正常。
    while true do
        log.info("发起HTTP GET请求", "https://httpbin.air32.cn/bytes/2048")
        local code, headers, body = http.request("GET", "https://httpbin.air32.cn/bytes/2048", nil, nil, { timeout = 3000 }).wait()

        -- 打印HTTP请求的结果,包括响应码code和响应体长度#body。
        if code == 200 then
            log.info("HTTP请求成功", "响应码", code, "响应体长度", body and #body)
        else
            log.error("HTTP请求失败", "错误码", code)
        end

        -- 加点延时,避免请求过快。
        sys.wait(5000)
    end
end

-- 订阅airlink的SDATA事件,打印收到的信息。
local function airlink_sdata(data)
    log.info("收到AIRLINK_SDATA!!", data)
end

-- 初始化网络,使得Air8101可以外挂Air780EPM实现4G联网功能。
sys.taskInit(init_airlink_net)

-- 一个简单的HTTP GET请求测试程序,用于判断Air780EPM的网络访问外网是否正常。
-- sys.taskInit(http_get_test)

-- Air780EPM发送数据信息给Air8101。
sys.taskInit(airlink_sdata_Air8101)

-- 订阅airlink的SDATA事件,打印收到的信息。
sys.subscribe("AIRLINK_SDATA", airlink_sdata)

6.2.2 程序烧录

  1. 参考第二、三章节完成硬件与软件环境搭建。
  2. 参考烧录 Air8101 核心板的介绍如何烧录项目文件到 Air780EPM 开发板分别烧录测试固件和脚本代码。

6.2.3 演示效果

下图为 Air780EPM 日志输出截图。

下图为 Air8101 日志输出截图。

关闭 wifi 后程序切换网卡为 4G

七、总结

通过该指南,用户可以很方便进行测试和使用 Air8101-4G 上网及数据交互功能。