Просмотр исходного кода

update:8000的AirETH_1000 demo

王城钧 6 месяцев назад
Родитель
Сommit
b9915540bc

+ 79 - 0
module/Air8000/demo/accessory_board/AirETH_1000/lan.lua

@@ -0,0 +1,79 @@
+--[[
+@module  lan
+@summary lan 模组连接4G网络通过以太网口传输给其他设备
+@version 1.0
+@date    2025.09.12
+@author  王城钧
+@usage
+本文件为lan网络模块,核心业务逻辑为:
+1.设置模组连接4G网络通过以太网口传输给其他设备
+本文件没有对外接口,直接在main.lua中require "lan"就可以加载运行;
+]]
+
+dhcps = require "dhcpsrv"
+dnsproxy = require "dnsproxy"
+
+-- 启动lan网络初始化
+local function lan_init()
+    sys.wait(500)   -- 非必须延时
+    log.info("ch390", "打开LDO供电")
+    gpio.setup(140, 1, gpio.PULLUP)     --打开ch390供电
+    sys.wait(6000)
+    local result = spi.setup(
+        1,--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=1,cs=12})
+    sys.wait(3000)
+    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)
+    while netdrv.link(socket.LWIP_ETH) ~= true do
+        -- sys.wait(100)   -- 等待以太网口联通
+    end
+    while netdrv.link(socket.LWIP_GP) ~= true do
+        -- sys.wait(100)   -- 等待GP口联通
+    end
+    sys.wait(2000) --非必须延时
+    dhcps.create({adapter=socket.LWIP_ETH})
+    dnsproxy.setup(socket.LWIP_ETH, socket.LWIP_GP)
+    netdrv.napt(socket.LWIP_GP)
+    if iperf then
+        log.info("启动iperf服务器端")
+        iperf.server(socket.LWIP_ETH)
+    end
+end
+
+-- 启动lan网络任务
+local function lan_task()
+    -- sys.waitUntil("IP_READY")
+    while 1 do
+        sys.wait(3000) -- 非必须延时, 此处为了方便观察日志
+        -- log.info("http", http.request("GET", "http://httpbin.air32.cn/bytes/4096", nil, nil, {adapter=socket.LWIP_ETH}).wait())
+        log.info("lua", rtos.meminfo())
+        log.info("sys", rtos.meminfo("sys"))
+        -- log.info("psram", rtos.meminfo("psram"))
+    end
+end
+
+-- 启动lan网络初始化
+sys.taskInit(lan_init)
+
+-- 启动lan网络任务
+sys.taskInit(lan_task)

+ 66 - 0
module/Air8000/demo/accessory_board/AirETH_1000/main.lua

@@ -0,0 +1,66 @@
+--[[
+@module  main
+@summary LuatOS用户应用脚本文件入口,总体调度应用逻辑 
+@version 1.0
+@date    2025.09.12
+@author  王城钧
+@usage
+本demo演示的核心功能为:
+1.设置三种以太网小板工作模式,一种为以太网提供网络供模组上网,一种为设置模组连接4G网络通过以太网口传输给其他设备,一种为以太网提供网络供wifi和以太网设备上网
+更多说明参考本目录下的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这三位数字必须存在,但是没有任何用处,可以一直写为000
+        如果不使用合宙iot.openluat.com进行远程升级,根据自己项目的需求,自定义格式即可
+]]
+PROJECT = "Air_ETH1000"
+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进行使用
+
+-- 开启WAN功能(以太网提供网络供模组上网)
+-- require "wan"
+
+-- 开启LAN功能(设置模组连接4G网络通过以太网口传输给其他设备)
+require "lan"
+
+-- 开启多网融合功能(以太网提供网络供wifi和以太网设备上网)
+-- require "netif_app"
+
+-- 用户代码已结束---------------------------------------------
+-- 结尾总是这一句
+sys.run()
+-- sys.run()之后后面不要加任何语句!!!!!

+ 49 - 0
module/Air8000/demo/accessory_board/AirETH_1000/netif_app.lua

@@ -0,0 +1,49 @@
+--[[
+@module  netif_app
+@summary netif_app 网络管理模块,开启多网融合功能,以太网提供网络供wifi和以太网设备上网
+@version 1.0
+@date    2025.08.05
+@author  魏健强
+@usage
+本文件为网络管理模块,核心业务逻辑为:
+1.设置多网融合功能,以太网提供网络供wifi和以太网设备上网
+2.http测试以太网网络
+本文件没有对外接口,直接在main.lua中require "netif_app"就可以加载运行;
+]]
+
+exnetif = require "exnetif"
+
+function netif_app_task_func()
+    local res
+    --设置多网融合功能,以太网提供网络供wifi设备上网
+    res = exnetif.setproxy(socket.LWIP_AP, socket.LWIP_ETH, {
+            ssid = "test2",                     -- AP热点名称(string),网卡包含wifi时填写
+            password = "HZ88888888",            -- AP热点密码(string),网卡包含wifi时填写
+            -- ap_opts = {                      -- AP模式下配置项(选填参数)
+            --     hidden = false,              -- 是否隐藏SSID, 默认false,不隐藏
+            --     max_conn = 4 },              -- 最大客户端数量, 默认4
+            -- channel = 6,                     -- AP建立的通道(选填参数), 默认6
+            -- adapter_addr = "192.168.5.1",    -- 自定义LWIP_AP网卡的ip地址(选填),需要自定义ip和网关ip时填写
+            -- adapter_gw = { 192, 168, 5, 1 }, -- 自定义LWIP_AP网卡的网关地址(选填),需要自定义ip和网关ip时填写
+            main_adapter = {                    -- 提供网络的网卡开启参数
+                ethpower_en = 140,              -- 以太网模块的pwrpin引脚(gpio编号)
+                tp = netdrv.CH390,              -- 网卡芯片型号(选填参数),仅spi方式外挂以太网时需要填写。
+                opts = {spi = 1, cs = 12}       -- 使用8000核心板上面的SPI1时,cs引脚为12
+            }
+        })
+    
+    if res then
+        log.info("exnetif", "setproxy success")
+    else
+        log.info("开启失败,请检查配置项是否正确,日志中是否打印了错误信息")
+    end
+
+    -- 每5秒进行HTTPS连接测试,实时监测以太网网络连接状态, 仅供测试需要,量产不需要,用来判断当前网络是否可用,需要的话可以打开注释
+    -- while 1 do
+    --     local code, headers, body = http.request("GET", "https://httpbin.air32.cn/bytes/2048", nil, nil, {adapter=socket.LWIP_ETH,timeout=5000,debug=false}).wait()
+    --     log.info("http执行结果", code, headers, body and #body)
+    --     sys.wait(5000)
+    -- end
+end
+
+sys.taskInit(netif_app_task_func)

+ 129 - 0
module/Air8000/demo/accessory_board/AirETH_1000/readme.md

@@ -0,0 +1,129 @@
+## 功能模块介绍:
+
+1、main.lua:主程序入口,以下三个脚本按自己的需求选择其一使用即可,另外两个注释;
+
+2、wan.lua:以太网提供网络供模组上网;
+
+3、lan.lua:模组连接4G网络通过以太网口传输给其他设备供网;
+
+4、netif_app: 网络管理模块,开启多网融合功能,以太网提供网络供wifi和以太网设备上网;
+
+## 演示功能概述
+
+1、模组连接4G网络通过以太网口传输给其他设备供网
+演示硬件环境
+
+------
+
+1、Air8000核心板一块+可上网的sim卡一张+网线一根+Air_ETH1000板子一个:
+
+
+
+2、TYPE-C USB数据线一根 + 杜邦线若干:
+
+* Air8000核心板通过TYPE-C USB口供电;(外部供电/USB供电 拨动开关 拨到 USB供电一端)
+
+* TYPE-C USB数据线直接插到核心板的TYPE-C USB座子,另外一端连接电脑USB口;
+
+* Air_ETH1000板子网口与电脑网口通过网线连接;
+
+3、Air8000核心板和AirETH_1000配件板的硬件接线方式为:
+
+| Air8000核心板 | AirETH_1000配件板 |
+| ---------- | -------------- |
+| vdd        | 3.3v           |
+| gnd        | gnd            |
+| spi1_sclk  | SCK            |
+| spi1_cs    | CSS            |
+| spi1_miso  | SDO            |
+| spi1_mosi  | SDI            |
+| gpio21     | INT            |
+
+演示软件环境
+------
+
+1、Luatools下载调试工具
+
+2、[Air8000 V2014版本固件](https://docs.openluat.com/air8000/luatos/firmware/)(理论上,2025年9月12日之后发布的固件都可以)
+演示核心步骤
+
+---------
+
+1、搭建好硬件环境,按接线图连接硬件。
+
+[https://docs.openluat.com/air8000/luatos/app/image/lan.jpg]()
+
+2、烧录内核固件和本项目的Lua脚本:main.lua:主程序入口(需要在main.lua文件中打开require"lan"),lan.lua:模组连接4G网络通过以太网口传输给其他设备供网。
+
+3、启动设备,观察日志输出:
+
+```
+[2025-09-12 15:25:44.453][000000006.933] D/ch390h 注册CH390H设备 SPI id 1 cs 12 irq 255
+
+[2025-09-12 15:25:44.512][000000006.934] D/netdrv.ch390x task started
+
+[2025-09-12 15:25:44.560][000000006.934] D/ch390h ch390注册完成
+
+[2025-09-12 15:25:44.595][000000006.979] D/netdrv.ch390x 初始化MAC 701988D3008A
+
+[2025-09-12 15:25:44.627][000000006.980] D/netdrv.ch390x luat_netif_init 执行完成 1
+
+[2025-09-12 15:25:45.993][000000008.574] I/netdrv.ch390x link is up 1 12 100M
+
+[2025-09-12 15:25:46.850][000000009.435] I/user.lua 4194296 54592 54592
+
+[2025-09-12 15:25:46.880][000000009.435] I/user.sys 3208824 303680 305200
+
+[2025-09-12 15:25:47.349][000000009.935] D/net network ready 4, setup dns server
+
+[2025-09-12 15:25:47.445][000000009.935] I/user.ipv4 192.168.4.1 255.255.255.0 192.168.4.1
+
+[2025-09-12 15:25:49.356][000000011.936] I/user.dhcpsrv 自动获取网卡IP作为网关 192.168.4.1
+
+[2025-09-12 15:25:49.399][000000011.937] D/socket connect to 255.255.255.255,0
+
+[2025-09-12 15:25:49.451][000000011.937] D/net connect 255.255.255.255:0 UDP
+
+[2025-09-12 15:25:49.482][000000011.939] I/user.dnsproxy 4 1
+
+[2025-09-12 15:25:49.525][000000011.941] I/user.dnsproxy 开始监听
+
+[2025-09-12 15:25:49.568][000000011.944] D/socket connect to 255.255.255.255,0
+
+[2025-09-12 15:25:49.612][000000011.945] D/net connect 255.255.255.255:0 UDP
+
+[2025-09-12 15:25:49.655][000000011.946] D/socket connect to 119.29.29.29,53
+
+[2025-09-12 15:25:49.699][000000011.946] D/netdrv NAPT is enabled gw 1
+
+[2025-09-12 15:25:49.751][000000011.951] I/user.启动iperf服务器端
+
+[2025-09-12 15:25:49.794][000000011.952] D/iperf 启动iperf server 0
+
+[2025-09-12 15:25:49.825][000000011.952] D/lwiperf iperf_malloc 88 88 0xc1703c4
+
+[2025-09-12 15:25:49.852][000000011.952] D/iperf iperf listen 192.168.4.1:5001
+
+[2025-09-12 15:25:49.878][000000012.436] I/user.lua 4194296 58552 58568
+
+[2025-09-12 15:25:49.908][000000012.436] I/user.sys 3208824 512576 514616
+
+[2025-09-12 15:25:50.690][000000013.275] I/user.dhcpsrv 是discover包 E466E52E5EE6 12
+
+[2025-09-12 15:25:50.720][000000013.276] I/user.dhcpsrv 分配ip E466E52E5EE6 192.168.4.100
+
+[2025-09-12 15:25:50.755][000000013.276] I/user.dhcpsrv send offer
+
+[2025-09-12 15:25:50.791][000000013.289] I/user.dhcpsrv 是request包 E466E52E5EE6 12
+
+[2025-09-12 15:25:50.828][000000013.289] I/user.dhcpsrv request,发现已经分配的mac地址, send ack E466E52E5EE6 12
+
+[2025-09-12 15:25:52.852][000000015.437] I/user.lua 4194296 69128 69944
+
+[2025-09-12 15:25:52.883][000000015.437] I/user.sys 3208824 514232 515760
+
+```
+
+4、电脑通过网线与Air_ETH1000板子连接可以正常上网,则表示验证成功。
+
+

+ 60 - 0
module/Air8000/demo/accessory_board/AirETH_1000/wan.lua

@@ -0,0 +1,60 @@
+--[[
+@module  wan
+@summary wan 以太网提供网络供模组上网
+@version 1.0
+@date    2025.09.12
+@author  王城钧
+@usage
+本文件为lan网络模块,核心业务逻辑为:
+1.以太网提供网络供模组上网
+2.http测试以太网网络
+本文件没有对外接口,直接在main.lua中require "wan"就可以加载运行;
+]]
+
+-- 启动WAN网络初始化
+local function wan_init()
+    sys.wait(500)                   --等待500ms,此延时非必须
+    log.info("ch390", "打开LDO供电")
+    gpio.setup(140, 1, gpio.PULLUP) --打开ch390供电
+    sys.wait(6000)                  --等待6000ms,此延时非必须
+    local result = spi.setup(
+        1,                          --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 = 1, cs = 12 })
+    netdrv.dhcp(socket.LWIP_ETH, true)
+end
+
+-- WAN网络测试任务
+local function wan_task()
+    -- sys.waitUntil("IP_READY")
+    while 1 do
+        sys.wait(6000)    --非必须延时,只是为了方便观察日志输出                                                                                                      -- 此处延时非必须,只是为了方便观察日志输出
+        log.info("http",
+            http.request("GET", "http://httpbin.air32.cn/bytes/4096", nil, nil, { adapter = socket.LWIP_ETH }).wait())          --adapter指定为以太网联网方式
+        log.info("lua", rtos.meminfo())
+        log.info("sys", rtos.meminfo("sys"))
+    end
+end
+
+-- 启动WAN网络初始化和任务
+sys.taskInit(wan_init)
+
+-- 启动WAN联网测试
+sys.taskInit(wan_task)