init: Air780EPM 官方 LuatOS 项目代码基线

- 来源: 合宙 LuatOS 官方仓库 air780epm 模块完整代码
- 路径: luatos/air780epm/module/Air780EPM/demo 含官方 demo(含 mqtt/mqtts/socket/uart 等)
- 后续: 基于 demo 开发 UART<->MQTT 数据上报功能
This commit is contained in:
wangfq
2026-08-31 08:53:49 +08:00
commit 173dd6874f
813 changed files with 125484 additions and 0 deletions
@@ -0,0 +1,70 @@
--[[
@module main
@summary LuatOS用户应用脚本文件入口,总体调度应用逻辑
@version 1.0
@date 2025.10.20
@author 魏健强
@usage
本demo演示的核心功能为:
1.开启以太网功能
2.开启多网融合功能
更多说明参考本目录下的readme.md文件
]]
--[[
必须定义PROJECT和VERSION变量,Luatools工具会用到这两个变量,远程升级功能也会用到这两个变量
PROJECT:项目名,ascii string类型
可以随便定义,只要不使用,就行
VERSION:项目版本号,ascii string类型
如果使用合宙iot.openluat.com进行远程升级,必须按照"XXX.YYY.ZZZ"三段格式定义:
X、Y、Z各表示1位数字,三个X表示的数字可以相同,也可以不同,同理三个Y和三个Z表示的数字也是可以相同,可以不同
因为历史原因,YYY这三位数字必须存在,但是没有任何用处,可以一直写为999
如果不使用合宙iot.openluat.com进行远程升级,根据自己项目的需求,自定义格式即可
]]
PROJECT = "netdrv"
VERSION = "001.999.000"
-- 在日志中打印项目名和项目版本号
log.info("main", PROJECT, VERSION)
-- 如果内核固件支持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)
-- 开启以太网wan
-- require "netdrv_eth_wan"
-- 开启以太网lan
-- require "netdrv_eth_lan"
-- 4G连接外部网络,支持以太网lan模式为其他以太网设备提供接入
-- require "netdrv_4g_multiple"
-- 双网口模式,以太网wan连接外部网络,以太网lan口为其他以太网设备提供接入
require "netdrv_eth_multiple"
-- 用户代码已结束---------------------------------------------
-- 结尾总是这一句
sys.run()
-- sys.run()之后后面不要加任何语句!!!!!
@@ -0,0 +1,68 @@
--[[
@module netdrv_4g_multiple
@summary 多网卡(4G网卡、通过SPI外挂CH390H芯片的以太网卡)驱动模块
@version 1.0
@date 2025.10.20
@author 魏健强
@usage
本文件为多网卡驱动模块 ,核心业务逻辑为:
1、4G连接外部网络,以太网lan模式为其他以太网设备提供接入 ;
直接使用Air780EPM V1.3开发板硬件测试即可;
本文件没有对外接口,直接在其他功能模块中require "netdrv_4g_multiple"就可以加载运行;
]]
dhcpsrv = require "dhcpsrv"
dnsproxy = require "dnsproxy"
local function lte_eth_setup()
log.info("ch390", "打开LDO供电")
gpio.setup(20, 1, gpio.PULLUP) -- 打开ch390供电
local result = spi.setup(0, -- spi_id
nil, 0, -- CPHA
0, -- CPOL
8, -- 数据宽度
25600000 -- ,--频率
)
log.info("main", "open", result)
if result ~= 0 then -- 返回值为0,表示打开成功
log.info("main", "spi open error", result)
return
end
-- 初始化指定netdrv设备,
-- socket.LWIP_ETH 网络适配器编号
-- netdrv.CH390外挂CH390
-- SPI ID 1, 片选 GPIO12, 中断引脚 GPIO22
netdrv.setup(socket.LWIP_ETH, netdrv.CH390, {
spi = 0,
cs = 8,
irq = 22
})
-- 确保ch390初始化完成,否则会出现netdrv.ipv4设置失败的情况
sys.wait(1000)
-- 设置ip, 子网掩码,网关
local ipv4, mark, gw = netdrv.ipv4(socket.LWIP_ETH, "192.168.4.1", "255.255.255.0", "192.168.4.1")
log.info("LWIP_ETH", ipv4, mark, gw)
-- 开启dhcp服务器
dhcpsrv.create({adapter = socket.LWIP_ETH})
-- 设置dns转发
dnsproxy.setup(socket.LWIP_ETH, socket.LWIP_GP)
end
local function netdrv_multiple_task_func()
-- 等待4G网络连接成功
while not socket.adapter() do
-- 在此处阻塞等待4G网卡连接成功的消息"IP_READY"
-- 或者等待1秒超时退出阻塞等待状态;
-- 注意:此处的1000毫秒超时不要修改的更长;
sys.waitUntil("IP_READY", 1000)
end
-- 开启4G->以太网的多网融合
lte_eth_setup()
-- 设置4G为数据出口
netdrv.napt(socket.LWIP_GP)
end
-- 启动一个tasktask的处理函数为netdrv_multiple_task_func
sys.taskInit(netdrv_multiple_task_func)
@@ -0,0 +1,56 @@
--[[
@module netdrv_eth_lan
@summary “通过SPI外挂CH390H芯片的以太网卡”驱动模块
@version 1.0
@date 2025.10.20
@author 魏健强
@usage
本文件为“通过SPI外挂CH390H芯片的以太网卡”驱动模块 ,核心业务逻辑为:
1、开启以太网lan
直接使用Air780EPM V1.3开发板硬件测试即可;
本文件没有对外接口,直接在其他功能模块中require "netdrv_eth_lan"就可以加载运行;
]]
dhcps = require "dhcpsrv"
local function eth_lan_setup()
-- 本demo使用Air8000开发板测试,开发板上的硬件配置为:
-- GPIO140为CH390H以太网芯片的供电使能控制引脚
-- 使用spi1,片选引脚使用GPIO12
-- 如果使用的硬件不是Air8000开发板,根据自己的硬件配置修改以下参数
log.info("ch390", "打开LDO供电")
gpio.setup(20, 1, gpio.PULLUP) -- 打开ch390供电
local result = spi.setup(0, -- spi_id
nil, 0, -- CPHA
0, -- CPOL
8, -- 数据宽度
25600000 -- ,--频率
)
log.info("main", "open", result)
if result ~= 0 then -- 返回值为0,表示打开成功
log.info("main", "spi open error", result)
return
end
-- 初始化指定netdrv设备,
-- socket.LWIP_ETH 网络适配器编号
-- netdrv.CH390外挂CH390
-- SPI ID 1, 片选 GPIO12, 中断引脚 GPIO22
netdrv.setup(socket.LWIP_ETH, netdrv.CH390, {
spi = 0,
cs = 8,
irq = 22
})
-- 确保ch390初始化完成,否则会出现netdrv.ipv4设置失败的情况
sys.wait(1000)
-- 设置ip, 子网掩码,网关
local ipv4, mark, gw = netdrv.ipv4(socket.LWIP_ETH, "192.168.4.1", "255.255.255.0", "192.168.4.1")
log.info("ipv4", ipv4, mark, gw)
-- 开启dhcp服务器
dhcps.create({
adapter = socket.LWIP_ETH
})
end
sys.taskInit(eth_lan_setup)
@@ -0,0 +1,116 @@
--[[
@module netdrv_eth_multiple
@summary 双以太网驱动模块
@version 1.0
@date 2025.10.20
@author 魏健强
@usage
本文件为多网卡驱动模块 ,核心业务逻辑为:
1、以太网WAN连接外部网络, 其他需要上网的设备连接模块以太网LAN口上网;
直接使用Air780EPM V1.3开发板硬件测试即可;
本文件没有对外接口,直接在其他功能模块中require "netdrv_eth_multiple"就可以加载运行;
]]
dhcpsrv = require "dhcpsrv"
dnsproxy = require "dnsproxy"
local static_ip = false
local function eth_wan_setup()
log.info("ch390", "打开LDO供电")
gpio.setup(20, 1, gpio.PULLUP) -- 打开ch390供电
local result = spi.setup(0, -- spi_id
nil, 0, -- CPHA
0, -- CPOL
8, -- 数据宽度
25600000 -- ,--频率
-- spi.MSB,--高低位顺序 可选,默认高位在前
-- spi.master,--主模式 可选,默认主
-- spi.full--全双工 可选,默认全双工
)
log.info("main", "open", result)
if result ~= 0 then -- 返回值为0,表示打开成功
log.info("main", "spi open error", result)
return
end
-- 初始化指定netdrv设备,
-- socket.LWIP_ETH 网络适配器编号
-- netdrv.CH390外挂CH390
-- SPI ID 1, 片选 GPIO12
netdrv.setup(socket.LWIP_ETH, netdrv.CH390, {
spi = 0,
cs = 8
})
sys.wait(1000) -- 等待以太网模块初始化完成,去掉会导致以太网初始化失败
if static_ip then
-- 静态ip配置
log.info("静态ip", netdrv.ipv4(socket.LWIP_ETH, "192.168.4.100", "255.255.255.0", "192.168.4.1"))
else
-- 使用dhcp动态获取ip地址
netdrv.dhcp(socket.LWIP_ETH, true)
end
log.info("LWIP_ETH", "mac addr", netdrv.mac(socket.LWIP_ETH))
end
local function eth_lan_setup()
log.info("ch390", "打开LDO供电")
gpio.setup(21, 1, gpio.PULLUP) -- 打开ch390供电
local result = spi.setup(1, -- spi_id
nil, 0, -- CPHA
0, -- CPOL
8, -- 数据宽度
25600000 -- ,--频率
)
log.info("main", "open", result)
if result ~= 0 then -- 返回值为0,表示打开成功
log.info("main", "spi open error", result)
return
end
-- 初始化指定netdrv设备,
-- socket.LWIP_USER0 网络适配器编号
-- netdrv.CH390外挂CH390
-- SPI ID 1, 片选 GPIO12, 中断引脚 GPIO222
netdrv.setup(socket.LWIP_USER0, netdrv.CH390, {
spi = 1,
cs = 12,
irq = 22
})
-- 确保ch390初始化完成,否则会出现netdrv.ipv4设置失败的情况
sys.wait(1000)
-- 设置ip, 子网掩码,网关
local ipv4, mark, gw = netdrv.ipv4(socket.LWIP_USER0, "192.168.5.1", "255.255.255.0", "192.168.5.1")
log.info("ipv4", ipv4, mark, gw)
-- 开启dhcp服务器
dhcpsrv.create({
adapter = socket.LWIP_USER0
})
end
local function netdrv_multiple_task_func()
eth_wan_setup()
eth_lan_setup()
-- 设置dns转发
dnsproxy.setup(socket.LWIP_USER0, socket.LWIP_ETH)
-- 设置以太网为数据出口
netdrv.napt(socket.LWIP_ETH)
end
local function http_test()
-- sys.waitUntil("IP_READY")
while 1 do
sys.wait(6000)
log.info("http", http.request("GET", "http://httpbin.luatos.com/bytes/4096", nil, nil, {
adapter = socket.LWIP_ETH
}).wait()) -- adapter指定为以太网联网方式
log.info("lua", rtos.meminfo())
log.info("sys", rtos.meminfo("sys"))
end
end
-- 启动一个tasktask的处理函数为netdrv_multiple_task_func
sys.taskInit(netdrv_multiple_task_func)
sys.taskInit(http_test)
@@ -0,0 +1,124 @@
--[[
@module netdrv_eth_wan
@summary “通过SPI外挂CH390H芯片的以太网卡”驱动模块
@version 1.0
@date 2025.10.20
@author 魏健强
@usage
本文件为“通过SPI外挂CH390H芯片的以太网卡”驱动模块 ,核心业务逻辑为:
1、开启以太网wan
直接使用Air780EPM V1.3开发板硬件测试即可;
本文件没有对外接口,直接在其他功能模块中require "netdrv_eth_wan"就可以加载运行;
]]
local static_ip = false
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_wan.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_wan.ip_lose_func", "IP_LOSE")
end
end
-- 本功能在2025.9.3新增
local function ping_test()
-- 要等联网了才能ping
sys.waitUntil("IP_READY")
while 1 do
-- 必须指定使用哪个网卡
netdrv.ping(socket.LWIP_ETH, "112.125.89.8")
sys.waitUntil("PING_RESULT", 3000)
sys.wait(3000)
end
end
local function ping_res(id, time, dst)
log.info("ping", id, time, dst); -- 获取到响应结果
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 eth_wan_setup()
-- 本demo使用Air8000开发板测试,开发板上的硬件配置为:
-- GPIO140为CH390H以太网芯片的供电使能控制引脚
-- 使用spi1,片选引脚使用GPIO12
-- 如果使用的硬件不是Air8000开发板,根据自己的硬件配置修改以下参数
log.info("ch390", "打开LDO供电")
gpio.setup(20, 1, gpio.PULLUP) -- 打开ch390供电
local result = spi.setup(0, -- spi_id
nil, 0, -- CPHA
0, -- CPOL
8, -- 数据宽度
25600000 -- ,--频率
-- spi.MSB,--高低位顺序 可选,默认高位在前
-- spi.master,--主模式 可选,默认主
-- spi.full--全双工 可选,默认全双工
)
log.info("main", "open", result)
if result ~= 0 then -- 返回值为0,表示打开成功
log.info("main", "spi open error", result)
return
end
-- 初始化指定netdrv设备,
-- socket.LWIP_ETH 网络适配器编号
-- netdrv.CH390外挂CH390
-- SPI ID 1, 片选 GPIO12, 中断引脚 GPIO222
netdrv.setup(socket.LWIP_ETH, netdrv.CH390, {
spi = 0,
cs = 8,
irq = 22
})
sys.wait(1000) -- 等待以太网模块初始化完成,去掉会导致以太网初始化失败
if static_ip then
-- 静态ip配置
log.info("静态ip", netdrv.ipv4(socket.LWIP_ETH, "192.168.4.100", "255.255.255.0", "192.168.4.1"))
else
-- 使用dhcp动态获取ip地址
netdrv.dhcp(socket.LWIP_ETH, true)
end
log.info("LWIP_ETH", "mac addr", netdrv.mac(socket.LWIP_ETH))
sys.taskInit(ping_test)
sys.subscribe("PING_RESULT", ping_res)
end
local function http_test()
-- sys.waitUntil("IP_READY")
while 1 do
sys.wait(6000)
log.info("http", http.request("GET", "http://httpbin.luatos.com/bytes/4096", nil, nil, {
adapter = socket.LWIP_ETH
}).wait()) -- adapter指定为以太网联网方式
log.info("lua", rtos.meminfo())
log.info("sys", rtos.meminfo("sys"))
end
end
sys.taskInit(eth_wan_setup)
sys.taskInit(http_test)
@@ -0,0 +1,91 @@
## 功能模块介绍
1、main.lua:主程序入口;
2、netdrv_eth_wan.lua:以太网wan
3、netdrv_eth_lan.lua:以太网lan
4、netdrv_4g_multiple.lua4G连接外部网络,以太网lan模式为其他以太网设备提供接入
5、netdrv_eth_multiple:双以太网口,以太网WAN->以太网LAN
## 演示功能概述
1、演示 netdrv核心库+dnsproxy扩展库+dhcpsrv扩展库 开启以太网或双以太网口,4G,以太网多网融合功能.
## 演示硬件环境
### Air780EPM 开发板
![](https://docs.openluat.com/air780epm/luatos/app/driver/gpio/image/GqKkbSGGXoNIRBxnsD6c1vI1nSb.jpg)
Air780EPM V1.3开发板一块 +TYPE-C USB 数据线一根 +可上网的sim卡一张 +4g天线一根+网线两根根:
- sim卡插入开发板的sim卡槽
- 天线装到开发板上
2、网线接线说明:
- netdrv_eth_wan 模块以太网口接路由器LAN口或交换机
- netdrv_eth_lan 模块以太网口接电脑或需要上网的设备
- netdrv_4g_multiple 模块以太网口接电脑或需要上网的设备
- netdrv_eth_multiple 模块以太网WAN接路由器LAN口或交换机,AirETH_1000配件板LAN口接需要上网的设备
- AirETH_1000配件板接到开发板上 可以用电脑接AirETH_1000配件板网口
| Air780EPM开发板 | AirETH_1000配件板 |
| --------------- | ----------------- |
| LCD座子的VCC供电 | 3.3v |
| gnd | gnd |
| UART3_TX | SCK |
| UART2_RX | CSS |
| UART3_RX | SDO |
| UART2_TX | SDI |
| 22 | INT |
3、TYPE-C USB数据线一根 Air780EPM开发板和数据线的硬件接线方式为:
- TYPE-C USB数据线直接插到核心板的TYPE-C USB座子,另外一端连接电脑USB口;
## 演示软件环境
1、Luatools下载调试工具
3、内核固件:[Air780EPM V2018 版本固件](https://docs.openluat.com/air780epm/luatos/firmware/version/);如有更新可以使用最新固件。
## 演示核心步骤
1、搭建好硬件环境,按接线图连接硬件,
2、在main.lua中按照自己的网卡需求启用对应的Lua文件
- 如果需要开启以太网lan,打开require "netdrv_eth_lan",其余注释掉
- 如果需要开启以太网wan,打开require "netdrv_eth_wan",其余注释掉
- 如果需要开启4G转以太网的多网融合,打开require "netdrv_4g_multiple",其余注释掉
- 如果需要开启双以太网口的多网融合,打开require "netdrv_eth_multiple.lua",其余注释掉
3、Luatools烧录内核固件和修改后的demo脚本代码
netdrv_eth_lan
模块以太网接口接其他设备,这里演示使用电脑连接,可以dhcp获取ip,可以ping通模块
![](https://docs.openluat.com/air780epm/luatos/app/socket/netdrv/image/780epm-netdrv2.png)
netdrv_eth_wan
模块以太网口接路由器,模块成功联网并http请求成功
![](https://docs.openluat.com/air780epm/luatos/app/socket/netdrv/image/780epm-netdrv1.png)
netdrv_4g_multiple
4G作为数据出口,这里使用电脑连接模块以太网接口上网
![](https://docs.openluat.com/air780epm/luatos/app/socket/netdrv/image/780epm-netdrv4.png)
netdrv_eth_multiple
模块以太网口WAN接路由器LAN口,这里使用电脑连接模块LAN口,dhcp获取到ip,测试网络正常
![](https://docs.openluat.com/air780epm/luatos/app/socket/netdrv/image/780epm-netdrv3.png)