Sfoglia il codice sorgente

add:添加network_routing demo

wjq 6 mesi fa
parent
commit
5c1ffbe3f9
35 ha cambiato i file con 1641 aggiunte e 1078 eliminazioni
  1. 18 19
      module/Air780EHM_Air780EHV_Air780EGH/demo/network_routing/4g_out_ethernet_in_wifi_in/main.lua
  2. 47 0
      module/Air780EHM_Air780EHV_Air780EGH/demo/network_routing/4g_out_ethernet_in_wifi_in/netif_app.lua
  3. 71 0
      module/Air780EHM_Air780EHV_Air780EGH/demo/network_routing/4g_out_ethernet_in_wifi_in/readme.md
  4. 33 12
      module/Air780EHM_Air780EHV_Air780EGH/demo/network_routing/ethernet_out_ethernet_in/main.lua
  5. 51 0
      module/Air780EHM_Air780EHV_Air780EGH/demo/network_routing/ethernet_out_ethernet_in/netif_app.lua
  6. 64 0
      module/Air780EHM_Air780EHV_Air780EGH/demo/network_routing/ethernet_out_ethernet_in/readme.md
  7. 33 12
      module/Air780EPM/demo/network_routing/4g_out_ethernet_in_wifi_in/main.lua
  8. 47 0
      module/Air780EPM/demo/network_routing/4g_out_ethernet_in_wifi_in/netif_app.lua
  9. 57 0
      module/Air780EPM/demo/network_routing/4g_out_ethernet_in_wifi_in/readme.md
  10. 71 0
      module/Air780EPM/demo/network_routing/ethernet_out_ethernet_in/main.lua
  11. 51 0
      module/Air780EPM/demo/network_routing/ethernet_out_ethernet_in/netif_app.lua
  12. 63 0
      module/Air780EPM/demo/network_routing/ethernet_out_ethernet_in/readme.md
  13. 0 126
      module/Air8000/demo/multi-network/Air8000_wifi_ap_eth_lan/Air8000_ap_lan.lua
  14. 0 160
      module/Air8000/demo/multi-network/Air8000_wifi_networking_by_eth/main.lua
  15. 0 161
      module/Air8000/demo/multi-network/Air8000_wifi_sta_eth_lan/main.lua
  16. 0 152
      module/Air8000/demo/multi-network/eth_wan_wifi_ap/main.lua
  17. 0 115
      module/Air8000/demo/multi-network/gp_main_eth_lan_wifi_ap/main.lua
  18. 71 0
      module/Air8000/demo/network_routing/4g_out_ethernet_in_wifi_in/main.lua
  19. 63 0
      module/Air8000/demo/network_routing/4g_out_ethernet_in_wifi_in/netif_app.lua
  20. 56 0
      module/Air8000/demo/network_routing/4g_out_ethernet_in_wifi_in/readme.md
  21. 71 0
      module/Air8000/demo/network_routing/ethernet_out_ethernet_in_wifi_in/main.lua
  22. 66 0
      module/Air8000/demo/network_routing/ethernet_out_ethernet_in_wifi_in/netif_app.lua
  23. 57 0
      module/Air8000/demo/network_routing/ethernet_out_ethernet_in_wifi_in/readme.md
  24. 69 0
      module/Air8000/demo/network_routing/wifi_out_ethernet_in_wifi_in/main.lua
  25. 58 0
      module/Air8000/demo/network_routing/wifi_out_ethernet_in_wifi_in/netif_app.lua
  26. 56 0
      module/Air8000/demo/network_routing/wifi_out_ethernet_in_wifi_in/readme.md
  27. 0 118
      module/Air8101/demo/multi_network/WIFI_4G_ETH/Air8101_Air780EPM/Air780EPM_master/network_airlink.lua
  28. 0 187
      module/Air8101/demo/multi_network/WIFI_4G_ETH/Air8101_Air780EPM/Air8101_slave/network_and_http.lua
  29. 0 16
      module/Air8101/demo/multi_network/WIFI_4G_ETH/Air8101_Air780EPM/README.md
  30. 71 0
      module/Air8101/demo/network_routing/ethernet_out_ethernet_in_wifi_in/main.lua
  31. 95 0
      module/Air8101/demo/network_routing/ethernet_out_ethernet_in_wifi_in/netif_app.lua
  32. 83 0
      module/Air8101/demo/network_routing/ethernet_out_ethernet_in_wifi_in/readme.md
  33. 71 0
      module/Air8101/demo/network_routing/wifi_out_ethernet_in_wifi_in/main.lua
  34. 65 0
      module/Air8101/demo/network_routing/wifi_out_ethernet_in_wifi_in/netif_app.lua
  35. 83 0
      module/Air8101/demo/network_routing/wifi_out_ethernet_in_wifi_in/readme.md

+ 18 - 19
module/Air8000/demo/multi-network/Air8000_wifi_ap_eth_lan/main.lua → module/Air780EHM_Air780EHV_Air780EGH/demo/network_routing/4g_out_ethernet_in_wifi_in/main.lua

@@ -1,4 +1,15 @@
 --[[
+@module  main
+@summary LuatOS用户应用脚本文件入口,总体调度应用逻辑 
+@version 1.0
+@date    2025.08.05
+@author  魏健强
+@usage
+本demo演示的核心功能为:
+1.设置多网融合功能,4G提供网络供wifi和以太网设备上网
+更多说明参考本目录下的readme.md文件
+]]
+--[[
 必须定义PROJECT和VERSION变量,Luatools工具会用到这两个变量,远程升级功能也会用到这两个变量
 PROJECT:项目名,ascii string类型
         可以随便定义,只要不使用,就行
@@ -7,27 +18,14 @@ VERSION:项目版本号,ascii string类型
             X、Y、Z各表示1位数字,三个X表示的数字可以相同,也可以不同,同理三个Y和三个Z表示的数字也是可以相同,可以不同
             因为历史原因,YYY这三位数字必须存在,但是没有任何用处,可以一直写为000
         如果不使用合宙iot.openluat.com进行远程升级,根据自己项目的需求,自定义格式即可
-
-本demo演示的功能是:
-1. 创建AP, 提供wifi设备, 通过4G上网
-2. 创建以太网, 为局域网内的设备, 通过4G上网
 ]]
-PROJECT = "Air8000_wifi_ap_eth_lan"
+PROJECT = "4g_out_ethernet_in_wifi_in"
 VERSION = "001.000.000"
 
+
 -- 在日志中打印项目名和项目版本号
 log.info("main", PROJECT, VERSION)
 
--- 加载必须用到的sys功能模块
--- sys功能模块是LuatOS运行框架的基础模块
-_G.sys = require("sys")
-
-
--- 加载大部分情况下会用到的sysplus功能模块
--- sysplus功能模块是sys功能模块的强力补充
--- 如果项目脚本中用到了sysplus的接口,则打开此处的注释
--- _G.sysplus = require("sysplus")
-
 
 -- 如果内核固件支持wdt看门狗功能,此处对看门狗进行初始化和定时喂狗处理
 -- 如果脚本程序死循环卡死,就会无法及时喂狗,最终会自动重启
@@ -60,13 +58,14 @@ end
 -- sys.timerLoopStart(function()
 --     log.info("mem.lua", rtos.meminfo())
 --     log.info("mem.sys", rtos.meminfo("sys"))
---  end, 3000)
+-- end, 3000)
+
 
--- 加载应用模块
-require "Air8000_ap_lan"
 
+-- 开启多网融合功能
+require "netif_app"
 
 -- 用户代码已结束---------------------------------------------
 -- 结尾总是这一句
 sys.run()
--- sys.run()之后不要加任何语句!!!!!因为添加的任何语句都不会被执行
+-- sys.run()之后后面不要加任何语句!!!!!

+ 47 - 0
module/Air780EHM_Air780EHV_Air780EGH/demo/network_routing/4g_out_ethernet_in_wifi_in/netif_app.lua

@@ -0,0 +1,47 @@
+--[[
+@module  netif_app
+@summary netif_app 网络管理模块,开启多网融合功能,4G提供网络供以太网设备上网
+@version 1.0
+@date    2025.08.05
+@author  魏健强
+@usage
+本文件为网络管理模块,核心业务逻辑为:
+1、设置多网融合功能,4G提供网络供以太网设备上网
+2、http测试4G网络
+本文件没有对外接口,直接在main.lua中require "netif_app"就可以加载运行;
+]] exnetif = require "exnetif"
+
+function netif_app_task_func()
+    local res
+    -- 等待4G网络连接成功
+    while not socket.adapter() do
+        -- 在此处阻塞等待4G网卡连接成功的消息"IP_READY"
+        -- 或者等待1秒超时退出阻塞等待状态;
+        -- 注意:此处的1000毫秒超时不要修改的更长;
+        sys.waitUntil("IP_READY", 1000)
+    end
+    -- 设置多网融合功能,4G提供网络供以太网设备上网
+    res = exnetif.setproxy(socket.LWIP_ETH, socket.LWIP_GP, {
+        ethpower_en = 20,               -- 以太网模块的pwrpin引脚(gpio编号)
+        tp = netdrv.CH390,              -- 网卡芯片型号(选填参数),仅spi方式外挂以太网时需要填写。
+        opts = {spi = 0, cs = 8},       -- 外挂方式,需要额外的参数(选填参数),仅spi方式外挂以太网时需要填写。
+        adapter_addr = "192.168.2.1",   -- 自定义LWIP_ETH网卡的ip地址(选填),需要自定义ip和网关ip时填写
+        adapter_gw = {192, 168, 2, 1}   -- 自定义LWIP_ETH网卡的网关地址(选填),需要自定义ip和网关ip时填写
+    })
+
+    if res then
+        log.info("exnetif", "setproxy success")
+    else
+        log.info("开启失败,请检查配置项是否正确,日志中是否打印了错误信息")
+    end
+
+    -- 每5秒进行HTTPS连接测试,实时监测4G网络连接状态, 仅供测试需要,量产不需要,用来判断当前网络是否可用,需要的话可以打开注释
+    -- while 1 do
+    --     local code, headers, body = http.request("GET", "https://httpbin.air32.cn/bytes/2048", nil, nil,
+    --         { adapter = socket.LWIP_GP, timeout = 5000, debug = false }).wait()
+    --     log.info("http执行结果", code, headers, body and #body)
+    --     sys.wait(5000)
+    -- end
+end
+
+sys.taskInit(netif_app_task_func)

+ 71 - 0
module/Air780EHM_Air780EHV_Air780EGH/demo/network_routing/4g_out_ethernet_in_wifi_in/readme.md

@@ -0,0 +1,71 @@
+## 功能模块介绍
+
+1、main.lua:主程序入口;
+
+2、netif_app: 网络管理模块,开启多网融合功能,4G提供网络供以太网设备上网;
+
+## 演示功能概述
+
+1、开启多网融合模式,4G连接外部网络,以太网lan模式为其他以太网设备提供接入
+
+2、​网络监控​,每5秒进行HTTPS连接测试,实时监测4G网络的连接状态
+
+
+## 演示硬件环境
+
+![](https://docs.openluat.com/air780ehv/luatos/common/hwenv/image/Air780EHV.png)
+
+1、Air780EXX核心板一块
+
+2、TYPE-C USB数据线一根
+
+3、USB转串口数据线一根
+
+4、Air780EXX核心板和数据线的硬件接线方式为
+
+- Air780EXX核心板通过TYPE-C USB口供电;
+
+- 如果测试发现软件频繁重启,重启原因值为:poweron reason 0,可能是供电不足,此时再通过直流稳压电源对核心板的vbat管脚进行4V供电,或者5V管脚进行5V供电;
+
+- TYPE-C USB数据线直接插到核心板的TYPE-C USB座子,另外一端连接电脑USB口;
+
+- USB转串口数据线,一般来说,白线连接核心板的18/U1TXD,绿线连接核心板的17/U1RXD,黑线连接核心板的gnd,另外一端连接电脑USB口;
+
+5、可选AirETH_1000配件板一块,Air8101核心板和AirETH_1000配件板的硬件接线方式为:
+
+| Air780EXX核心板  |  AirETH_1000配件板 |
+| --------------- | ----------------- |
+| 3V3             | 3.3v              |
+| gnd             | gnd               |
+| 86/SPI0CLK      | SCK               |
+| 83/SPI0CS       | CSS               |
+| 84/SPI0MISO     | SDO               |
+| 85/SPI0MOSI     | SDI               |
+| 107/GPIO21      | INT               |
+
+
+## 演示软件环境
+
+1、Luatools下载调试工具
+
+2、[Air780EHM V2012版本固件](https://docs.openluat.com/air780epm/luatos/firmware/version/#air780ehmluatos)、[Air780EHV V2012版本固件](https://docs.openluat.com/air780ehv/luatos/firmware/version/)、[Air780EHG V2012版本固件](https://docs.openluat.com/air780egh/luatos/firmware/version/)(理论上,2025年7月26日之后发布的固件都可以)
+
+
+## 演示核心步骤
+
+1、搭建好硬件环境,按接线图连接硬件,
+
+2、按需修改WiFi热点配置(在netif_app.lua中):
+ssid = "AP热点名称"
+password = "AP热点密码"
+
+4、烧录内核固件和本项目的Lua脚本:main.lua:主程序入口,netif_app.lua:网络管理模块
+
+5、启动设备,观察日志输出:
+
+``` lua
+[INFO] exnetif setproxy success
+[INFO] http执行结果 200 ... 
+```
+
+6、其他设备通过以太网接入780EXX,其他设备都能正常上网,则表示验证成功。

+ 33 - 12
module/Air8101/demo/multi_network/WIFI_4G_ETH/Air8101_Air780EPM/Air8101_slave/main.lua → module/Air780EHM_Air780EHV_Air780EGH/demo/network_routing/ethernet_out_ethernet_in/main.lua

@@ -1,4 +1,15 @@
 --[[
+@module  main
+@summary LuatOS用户应用脚本文件入口,总体调度应用逻辑 
+@version 1.0
+@date    2025.08.05
+@author  魏健强
+@usage
+本demo演示的核心功能为:
+1.设置多网融合功能,4G提供网络供wifi和以太网设备上网
+更多说明参考本目录下的readme.md文件
+]]
+--[[
 必须定义PROJECT和VERSION变量,Luatools工具会用到这两个变量,远程升级功能也会用到这两个变量
 PROJECT:项目名,ascii string类型
         可以随便定义,只要不使用,就行
@@ -8,12 +19,14 @@ VERSION:项目版本号,ascii string类型
             因为历史原因,YYY这三位数字必须存在,但是没有任何用处,可以一直写为000
         如果不使用合宙iot.openluat.com进行远程升级,根据自己项目的需求,自定义格式即可
 ]]
-PROJECT = "netdrv"
+PROJECT = "4g_out_ethernet_in_wifi_in"
 VERSION = "001.000.000"
 
+
 -- 在日志中打印项目名和项目版本号
 log.info("main", PROJECT, VERSION)
 
+
 -- 如果内核固件支持wdt看门狗功能,此处对看门狗进行初始化和定时喂狗处理
 -- 如果脚本程序死循环卡死,就会无法及时喂狗,最终会自动重启
 if wdt then
@@ -23,28 +36,36 @@ if wdt then
     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进行使用
-PRODUCT_KEY = "XPwaCKtrZywvcwTMvvdGUTtuiP6zLRTY" --换成自己的
+
 
 -- 启动一个循环定时器
 -- 每隔3秒钟打印一次总内存,实时的已使用内存,历史最高的已使用内存情况
 -- 方便分析内存使用是否有异常
-local function print_mem()
-    -- 打印Lua虚拟机内存使用情况(默认为lua虚拟机内存)
-    log.info("mem.lua", rtos.meminfo())
-    -- 打印系统内存使用情况(“sys”为系统内存)
-    log.info("mem.sys", rtos.meminfo("sys"))
-end
+-- sys.timerLoopStart(function()
+--     log.info("mem.lua", rtos.meminfo())
+--     log.info("mem.sys", rtos.meminfo("sys"))
+-- end, 3000)
+
 
-sys.timerLoopStart(print_mem, 3000)
 
--- 加载功能模块
-require "network_and_http"
+-- 开启多网融合功能
+require "netif_app"
 
 -- 用户代码已结束---------------------------------------------
 -- 结尾总是这一句
 sys.run()
--- sys.run()之后不要加任何语句!!!!!因为添加的任何语句都不会被执行
+-- sys.run()之后后面不要加任何语句!!!!!

+ 51 - 0
module/Air780EHM_Air780EHV_Air780EGH/demo/network_routing/ethernet_out_ethernet_in/netif_app.lua

@@ -0,0 +1,51 @@
+--[[
+@module  netif_app
+@summary netif_app 网络管理模块,开启多网融合功能,4G提供网络供以太网设备上网
+@version 1.0
+@date    2025.08.05
+@author  魏健强
+@usage
+本文件为网络管理模块,核心业务逻辑为:
+1、设置多网融合功能,4G提供网络供以太网设备上网
+2、http测试4G网络
+本文件没有对外接口,直接在main.lua中require "netif_app"就可以加载运行;
+]] exnetif = require "exnetif"
+
+function netif_app_task_func()
+    local res
+    -- 设置多网融合功能,以太网wan提供网络供以太网设备上网
+    res = exnetif.setproxy(socket.LWIP_ETH, socket.LWIP_USER1, {
+        ethpower_en = 20,
+        tp = netdrv.CH390,                  -- 网卡芯片型号(选填参数),仅spi方式外挂以太网时需要填写。
+        opts = {                            -- 外挂方式,需要额外的参数(选填参数),仅spi方式外挂以太网时需要填写。
+            spi = 0,
+            cs = 8
+        },                                  
+        -- adapter_addr = "192.168.2.1",    -- 自定义LWIP_ETH网卡的ip地址(选填),需要自定义ip和网关ip时填写
+        -- adapter_gw = {192, 168, 2, 1}    -- 自定义LWIP_ETH网卡的网关地址(选填),需要自定义ip和网关ip时填写
+        main_adapter = {                    -- 提供网络的网卡开启参数
+            ethpower_en = 21,
+            tp = netdrv.CH390,              
+            opts = {
+                spi = 1,
+                cs = 12
+            }
+        }
+    })
+    log.info("exnetif", "setproxy success", res)
+    -- -- 每5秒进行HTTPS连接测试,实时监测4G网络连接状态, 仅供测试需要,量产不需要,用来判断当前网络是否可用,需要的话可以打开注释
+    -- while 1 do
+    --     log.info("dwrh", res)
+    --     local code, headers, body = http.request("GET",
+    --                                              "https://httpbin.air32.cn/bytes/2048",
+    --                                              nil, nil, {
+    --         adapter = socket.LWIP_USER1,
+    --         timeout = 5000,
+    --         debug = false
+    --     }).wait()
+    --     log.info("http执行结果", code, headers, body and #body)
+    --     sys.wait(10000)
+    -- end
+end
+
+sys.taskInit(netif_app_task_func)

+ 64 - 0
module/Air780EHM_Air780EHV_Air780EGH/demo/network_routing/ethernet_out_ethernet_in/readme.md

@@ -0,0 +1,64 @@
+## 功能模块介绍
+
+1、main.lua:主程序入口;
+
+2、netif_app: 网络管理模块,开启多网融合功能,以太网WAN提供网络供以太网设备上网;
+
+## 演示功能概述
+
+1、开启多网融合模式,以太网WAN连接外部网络,以太网lan模式为其他以太网设备提供接入
+
+2、​网络监控​,每5秒进行HTTPS连接测试,实时监测以太网WAN网络的连接状态
+
+## 演示硬件环境
+
+![](https://docs.openluat.com/air780epm/luatos/app/driver/eth/image/RFSvb75NRoEWqYxfCRVcVrOKnsf.jpg)
+
+1、Air780EHM V1.3版本开发板一块+4g天线一根+网线一根+AirETH_1000配件板:
+
+- AirETH_1000配件板接到开发板上
+
+| Air780EHM开发板  |  AirETH_1000配件板 |
+| --------------- | ----------------- |
+| LCD座子的VCC供电 | 3.3v              |
+| gnd             | gnd               |
+| UART3_TX        | SCK               |
+| UART2_RX        | CSS               |
+| UART3_RX        | SDO               |
+| UART2_TX        | SDI               |
+| nil             | INT               |
+
+- 天线装到开发板上
+
+- 网线一端插入开发板网口,另外一端连接可以上外网的路由器网口
+
+2、TYPE-C USB数据线一根 + USB转串口数据线一根,Air780EPM V1.3版本开发板和数据线的硬件接线方式为:
+
+- Air780EPM V1.3版本开发板通过TYPE-C USB口供电;(外部供电/USB供电 拨动开关 拨到 USB供电一端)
+
+- TYPE-C USB数据线直接插到核心板的TYPE-C USB座子,另外一端连接电脑USB口;
+
+- USB转串口数据线,一般来说,白线连接开发板的UART1_TX,绿线连接开发板的UART1_RX,黑线连接核心板的GND,另外一端连接电脑USB口;
+
+
+## 演示软件环境
+
+1、Luatools下载调试工具
+
+2、[Air780EHM V2012版本固件](https://docs.openluat.com/air780epm/luatos/firmware/version/#air780ehmluatos)、[Air780EHV V2012版本固件](https://docs.openluat.com/air780ehv/luatos/firmware/version/)、[Air780EHG V2012版本固件](https://docs.openluat.com/air780egh/luatos/firmware/version/)(理论上,2025年7月26日之后发布的固件都可以)
+
+
+## 演示核心步骤
+
+1、搭建好硬件环境,按接线图连接硬件,
+
+2、烧录内核固件和本项目的Lua脚本:main.lua:主程序入口,netif_app.lua:网络管理模块
+
+3、启动设备,观察日志输出:
+
+``` lua
+[INFO] exnetif setproxy success
+[INFO] http执行结果 200 ... 
+```
+
+4、其他设备通过AirETH_1000配件板接入780EPM,其他设备都能正常上网,则表示验证成功。

+ 33 - 12
module/Air8101/demo/multi_network/WIFI_4G_ETH/Air8101_Air780EPM/Air780EPM_master/main.lua → module/Air780EPM/demo/network_routing/4g_out_ethernet_in_wifi_in/main.lua

@@ -1,4 +1,15 @@
 --[[
+@module  main
+@summary LuatOS用户应用脚本文件入口,总体调度应用逻辑 
+@version 1.0
+@date    2025.08.05
+@author  魏健强
+@usage
+本demo演示的核心功能为:
+1.设置多网融合功能,4G提供网络供wifi和以太网设备上网
+更多说明参考本目录下的readme.md文件
+]]
+--[[
 必须定义PROJECT和VERSION变量,Luatools工具会用到这两个变量,远程升级功能也会用到这两个变量
 PROJECT:项目名,ascii string类型
         可以随便定义,只要不使用,就行
@@ -8,12 +19,14 @@ VERSION:项目版本号,ascii string类型
             因为历史原因,YYY这三位数字必须存在,但是没有任何用处,可以一直写为000
         如果不使用合宙iot.openluat.com进行远程升级,根据自己项目的需求,自定义格式即可
 ]]
-PROJECT = "netdrv"
+PROJECT = "4g_out_ethernet_in_wifi_in"
 VERSION = "001.000.000"
 
+
 -- 在日志中打印项目名和项目版本号
 log.info("main", PROJECT, VERSION)
 
+
 -- 如果内核固件支持wdt看门狗功能,此处对看门狗进行初始化和定时喂狗处理
 -- 如果脚本程序死循环卡死,就会无法及时喂狗,最终会自动重启
 if wdt then
@@ -23,28 +36,36 @@ if wdt then
     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进行使用
-PRODUCT_KEY = "XPwaCKtrZywvcwTMvvdGUTtuiP6zLRTY" --换成自己的
+
 
 -- 启动一个循环定时器
 -- 每隔3秒钟打印一次总内存,实时的已使用内存,历史最高的已使用内存情况
 -- 方便分析内存使用是否有异常
-local function print_mem()
-    -- 打印Lua虚拟机内存使用情况(默认为lua虚拟机内存)
-    log.info("mem.lua", rtos.meminfo())
-    -- 打印系统内存使用情况(“sys”为系统内存)
-    log.info("mem.sys", rtos.meminfo("sys"))
-end
+-- sys.timerLoopStart(function()
+--     log.info("mem.lua", rtos.meminfo())
+--     log.info("mem.sys", rtos.meminfo("sys"))
+-- end, 3000)
+
 
-sys.timerLoopStart(print_mem, 3000)
 
--- 加载功能模块
-require "network_airlink"
+-- 开启多网融合功能
+require "netif_app"
 
 -- 用户代码已结束---------------------------------------------
 -- 结尾总是这一句
 sys.run()
--- sys.run()之后不要加任何语句!!!!!因为添加的任何语句都不会被执行
+-- sys.run()之后后面不要加任何语句!!!!!

+ 47 - 0
module/Air780EPM/demo/network_routing/4g_out_ethernet_in_wifi_in/netif_app.lua

@@ -0,0 +1,47 @@
+--[[
+@module  netif_app
+@summary netif_app 网络管理模块,开启多网融合功能,4G提供网络供以太网设备上网
+@version 1.0
+@date    2025.08.05
+@author  魏健强
+@usage
+本文件为网络管理模块,核心业务逻辑为:
+1、设置多网融合功能,4G提供网络供以太网设备上网
+2、http测试4G网络
+本文件没有对外接口,直接在main.lua中require "netif_app"就可以加载运行;
+]] exnetif = require "exnetif"
+
+function netif_app_task_func()
+    local res
+    -- 等待4G网络连接成功
+    while not socket.adapter() do
+        -- 在此处阻塞等待4G网卡连接成功的消息"IP_READY"
+        -- 或者等待1秒超时退出阻塞等待状态;
+        -- 注意:此处的1000毫秒超时不要修改的更长;
+        sys.waitUntil("IP_READY", 1000)
+    end
+    -- 设置多网融合功能,4G提供网络供以太网设备上网
+    res = exnetif.setproxy(socket.LWIP_ETH, socket.LWIP_GP, {
+        ethpower_en = 20,                   -- 以太网模块的pwrpin引脚(gpio编号)
+        tp = netdrv.CH390,                  -- 网卡芯片型号(选填参数),仅spi方式外挂以太网时需要填写。
+        opts = {spi = 0, cs = 8},           -- 外挂方式,需要额外的参数(选填参数),仅spi方式外挂以太网时需要填写。
+        adapter_addr = "192.168.2.1",       -- 自定义LWIP_ETH网卡的ip地址(选填),需要自定义ip和网关ip时填写
+        adapter_gw = {192, 168, 2, 1}       -- 自定义LWIP_ETH网卡的网关地址(选填),需要自定义ip和网关ip时填写
+    })
+
+    if res then
+        log.info("exnetif", "setproxy success")
+    else
+        log.info("开启失败,请检查配置项是否正确,日志中是否打印了错误信息")
+    end
+
+    -- 每5秒进行HTTPS连接测试,实时监测4G网络连接状态, 仅供测试需要,量产不需要,用来判断当前网络是否可用,需要的话可以打开注释
+    -- while 1 do
+    --     local code, headers, body = http.request("GET", "https://httpbin.air32.cn/bytes/2048", nil, nil,
+    --         { adapter = socket.LWIP_GP, timeout = 5000, debug = false }).wait()
+    --     log.info("http执行结果", code, headers, body and #body)
+    --     sys.wait(10000)
+    -- end
+end
+
+sys.taskInit(netif_app_task_func)

+ 57 - 0
module/Air780EPM/demo/network_routing/4g_out_ethernet_in_wifi_in/readme.md

@@ -0,0 +1,57 @@
+## 功能模块介绍
+
+1、main.lua:主程序入口;
+
+2、netif_app: 网络管理模块,开启多网融合功能,4G提供网络供以太网设备上网;
+
+## 演示功能概述
+
+1、开启多网融合模式,4G连接外部网络,以太网lan模式为其他以太网设备提供接入
+
+2、​网络监控​,每5秒进行HTTPS连接测试,实时监测4G网络的连接状态
+
+## 演示硬件环境
+
+![](https://docs.openluat.com/air780epm/luatos/app/driver/eth/image/RFSvb75NRoEWqYxfCRVcVrOKnsf.jpg)
+
+1、Air780EPM V1.3版本开发板一块+可上网的sim卡一张+4g天线一根+网线一根:
+
+- sim卡插入开发板的sim卡槽
+
+- 天线装到开发板上
+
+- 网线一端插入开发板网口,另外一端连接可以上外网的路由器网口
+
+2、TYPE-C USB数据线一根 + USB转串口数据线一根,Air780EPM V1.3版本开发板和数据线的硬件接线方式为:
+
+- Air780EPM V1.3版本开发板通过TYPE-C USB口供电;(外部供电/USB供电 拨动开关 拨到 USB供电一端)
+
+- TYPE-C USB数据线直接插到核心板的TYPE-C USB座子,另外一端连接电脑USB口;
+
+- USB转串口数据线,一般来说,白线连接开发板的UART1_TX,绿线连接开发板的UART1_RX,黑线连接核心板的GND,另外一端连接电脑USB口;
+
+
+## 演示软件环境
+
+1、Luatools下载调试工具
+
+2、[Air780EPM V2012版本固件](https://docs.openluat.com/air780epm/luatos/firmware/version/)(理论上,2025年8月10日之后发布的固件都可以)
+
+## 演示核心步骤
+
+1、搭建好硬件环境,按接线图连接硬件,
+
+2、按需修改WiFi热点配置(在netif_app.lua中):
+ssid = "AP热点名称"
+password = "AP热点密码"
+
+4、烧录内核固件和本项目的Lua脚本:main.lua:主程序入口,netif_app.lua:网络管理模块
+
+5、启动设备,观察日志输出:
+
+``` lua
+[INFO] exnetif setproxy success
+[INFO] http执行结果 200 ... 
+```
+
+6、其他设备通过以太网接入780EPM,其他设备都能正常上网,则表示验证成功。

+ 71 - 0
module/Air780EPM/demo/network_routing/ethernet_out_ethernet_in/main.lua

@@ -0,0 +1,71 @@
+--[[
+@module  main
+@summary LuatOS用户应用脚本文件入口,总体调度应用逻辑 
+@version 1.0
+@date    2025.08.05
+@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 = "4g_out_ethernet_in_wifi_in"
+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 "netif_app"
+
+-- 用户代码已结束---------------------------------------------
+-- 结尾总是这一句
+sys.run()
+-- sys.run()之后后面不要加任何语句!!!!!

+ 51 - 0
module/Air780EPM/demo/network_routing/ethernet_out_ethernet_in/netif_app.lua

@@ -0,0 +1,51 @@
+--[[
+@module  netif_app
+@summary netif_app 网络管理模块,开启多网融合功能,4G提供网络供以太网设备上网
+@version 1.0
+@date    2025.08.05
+@author  魏健强
+@usage
+本文件为网络管理模块,核心业务逻辑为:
+1、设置多网融合功能,4G提供网络供以太网设备上网
+2、http测试4G网络
+本文件没有对外接口,直接在main.lua中require "netif_app"就可以加载运行;
+]] exnetif = require "exnetif"
+
+function netif_app_task_func()
+    local res
+    -- 设置多网融合功能,以太网wan提供网络供以太网设备上网
+    res = exnetif.setproxy(socket.LWIP_ETH, socket.LWIP_USER1, {
+        ethpower_en = 20,
+        tp = netdrv.CH390,                  -- 网卡芯片型号(选填参数),仅spi方式外挂以太网时需要填写。
+        opts = {                            -- 外挂方式,需要额外的参数(选填参数),仅spi方式外挂以太网时需要填写。
+            spi = 0,
+            cs = 8
+        },                                  
+        -- adapter_addr = "192.168.2.1",    -- 自定义LWIP_ETH网卡的ip地址(选填),需要自定义ip和网关ip时填写
+        -- adapter_gw = {192, 168, 2, 1}    -- 自定义LWIP_ETH网卡的网关地址(选填),需要自定义ip和网关ip时填写
+        main_adapter = {                    -- 提供网络的网卡开启参数
+            ethpower_en = 21,
+            tp = netdrv.CH390,              
+            opts = {
+                spi = 1,
+                cs = 12
+            }
+        }
+    })
+    log.info("exnetif", "setproxy success", res)
+    -- -- 每5秒进行HTTPS连接测试,实时监测4G网络连接状态, 仅供测试需要,量产不需要,用来判断当前网络是否可用,需要的话可以打开注释
+    -- while 1 do
+    --     log.info("dwrh", res)
+    --     local code, headers, body = http.request("GET",
+    --                                              "https://httpbin.air32.cn/bytes/2048",
+    --                                              nil, nil, {
+    --         adapter = socket.LWIP_USER1,
+    --         timeout = 5000,
+    --         debug = false
+    --     }).wait()
+    --     log.info("http执行结果", code, headers, body and #body)
+    --     sys.wait(10000)
+    -- end
+end
+
+sys.taskInit(netif_app_task_func)

+ 63 - 0
module/Air780EPM/demo/network_routing/ethernet_out_ethernet_in/readme.md

@@ -0,0 +1,63 @@
+## 功能模块介绍
+
+1、main.lua:主程序入口;
+
+2、netif_app: 网络管理模块,开启多网融合功能,以太网WAN提供网络供以太网设备上网;
+
+## 演示功能概述
+
+1、开启多网融合模式,以太网WAN连接外部网络,以太网LAN为其他以太网设备提供接入
+
+2、​网络监控​,每5秒进行HTTPS连接测试,实时监测以太网WAN网络的连接状态
+
+## 演示硬件环境
+
+![](https://docs.openluat.com/air780epm/luatos/app/driver/eth/image/RFSvb75NRoEWqYxfCRVcVrOKnsf.jpg)
+
+1、Air780EPM V1.3版本开发板一块+4g天线一根+网线一根+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               |
+| nil             | INT               |
+
+- 天线装到开发板上
+
+- 网线一端插入开发板网口,另外一端连接可以上外网的路由器网口
+
+2、TYPE-C USB数据线一根 + USB转串口数据线一根,Air780EPM V1.3版本开发板和数据线的硬件接线方式为:
+
+- Air780EPM V1.3版本开发板通过TYPE-C USB口供电;(外部供电/USB供电 拨动开关 拨到 USB供电一端)
+
+- TYPE-C USB数据线直接插到核心板的TYPE-C USB座子,另外一端连接电脑USB口;
+
+- USB转串口数据线,一般来说,白线连接开发板的UART1_TX,绿线连接开发板的UART1_RX,黑线连接核心板的GND,另外一端连接电脑USB口;
+
+
+## 演示软件环境
+
+1、Luatools下载调试工具
+
+2、[Air780EPM V2012版本固件](https://docs.openluat.com/air780epm/luatos/firmware/version/)(理论上,2025年8月10日之后发布的固件都可以)
+
+## 演示核心步骤
+
+1、搭建好硬件环境,按接线图连接硬件,
+
+2、烧录内核固件和本项目的Lua脚本:main.lua:主程序入口,netif_app.lua:网络管理模块
+
+3、启动设备,观察日志输出:
+
+``` lua
+[INFO] exnetif setproxy success
+[INFO] http执行结果 200 ... 
+```
+
+4、其他设备通过AirETH_1000配件板接入780EPM,其他设备都能正常上网,则表示验证成功。

+ 0 - 126
module/Air8000/demo/multi-network/Air8000_wifi_ap_eth_lan/Air8000_ap_lan.lua

@@ -1,126 +0,0 @@
---[[
-本功能模块演示的内容为:
-1. 软件配置 Air8000 的 WiFi AP 功能,然后烧录到 Air8000 模块中,最后使用 WiFi 设备连接对应热点,最终实现 4G 上网。
-2. 软件配置 Air8000 的 Ethernet LAN功能,然后烧录到 Air8000 模块中,最后使用以太网设备通过网线与 Air8000 模块连接,最终实现 4G 上网。
-
-功能演示使用 Air8000 整机开发板进行。
-]]
-
--- 加载三个用到的库:dnsproxy 用于 DNS 代理服务,dhcpsrv 用于 DHCP 服务器服务,httpplus 用于 HTTP 请求相关的操作。
-dnsproxy = require("dnsproxy")
-dhcpsrv = require("dhcpsrv")
-httpplus = require("httpplus")
-
--- 打开 CH390 供电
-gpio.setup(140, 1, gpio.PULLUP)
-
--- 配置 WiFi AP 功能,使得 WiFi 设备实现 4G上网
-function test_ap()
-    log.info("执行AP创建操作", airlink.ready() , "正常吗?")
-    -- 设置 WiFi 热点的名称和密码
-    wlan.createAP("uiot5678", "12345678")
-    -- 设置 AP 的 IP 地址、子网掩码、网关地址
-    netdrv.ipv4(socket.LWIP_AP, "192.168.4.1", "255.255.255.0", "0.0.0.0")
-    -- 获取 WiFi AP 网络状态,连接后返回 true,否则返回 false,如果不存在就返回 nil。
-    log.info("netdrv", "等待AP就绪")
-    while netdrv.ready(socket.LWIP_AP) ~= true do
-        -- log.info("netdrv", "等待AP就绪")
-        sys.wait(100)
-    end
-    -- 创建 DHCP 服务器,为连接到 WiFi AP 的设备分配 IP 地址。
-    log.info("netdrv", "创建dhcp服务器, 供AP使用")
-    dhcpsrv.create({adapter=socket.LWIP_AP})
-    -- 获取 4G 网络状态,连接后返回 true,否则返回 false,如果不存在就返回 nil。
-    log.info("netdrv", "等待4G就绪")
-    while netdrv.ready(socket.LWIP_GP) ~= true do
-        -- log.info("netdrv", "等待4G就绪")
-        sys.wait(100)
-    end
-    -- 创建 DNS 代理服务,使得 WiFi AP 上的设备可以通过 4G 网络访问互联网。
-    log.info("netdrv", "创建dns代理服务, 供AP使用")
-    dnsproxy.setup(socket.LWIP_AP, socket.LWIP_GP)
-end
-
--- 订阅系统事件"PING_RESULT",当系统执行 PING 命令时,会触发此事件并将 PING 的结果打印出来。
-function handlePingResult(id, time, dst)
-    log.info("ping.result", id, time, dst);
-end
-sys.subscribe("PING_RESULT", handlePingResult)
-
--- WiFi AP 相关事件
--- 订阅系统事件"WLAN_AP_INC",当有设备连接或断开连接到 WiFi AP 时,会触发此事件并将连接状态和对应 MAC 地址打印出来。
-function handleWlanApInc(evt, data)
-    -- evt 可能的值有: "CONNECTED", "DISCONNECTED"
-    -- 当 evt=CONNECTED, data 是连接的 AP 的新 STA 的 MAC 地址
-    -- 当 evt=DISCONNECTED, data 是断开与 AP 连接的 STA 的 MAC 地址
-    log.info("收到AP事件", evt, data and data:toHex())
-end
-sys.subscribe("WLAN_AP_INC", handleWlanApInc)
-
---  每隔6秒打印一次 airlink 统计数据,调试用
--- sys.taskInit(function()
---     while 1 do
---         sys.wait(6000)
---         airlink.statistics()
---     end
--- end)
-
--- 配置 Ethernet LAN 功能,为以太网设备实现 4G 上网
-function eth_lan()
-    -- sys.wait(3000)
-    -- 配置 SPI 参数,Air8000 使用 SPI 接口与以太网模块进行通信。
-    local result = spi.setup(
-        1,--spi id
-        nil,
-        0,--CPHA
-        0,--CPOL
-        8,--数据宽度
-        51200000--,--波特率
-    )
-    log.info("main", "open spi",result)
-    if result ~= 0 then--返回值为 0,表示打开成功
-        log.info("main", "spi open error",result)
-        return
-    end
-    -- 初始化以太网,Air8000 指定使用 CH390 芯片。
-    log.info("netdrv", "初始化以太网")
-    netdrv.setup(socket.LWIP_ETH, netdrv.CH390, {spi=1,cs=12,irq=255})
-    log.info("netdrv", "等待以太网就绪")
-    sys.wait(1000)
-    -- 设置以太网的 IP 地址、子网掩码、网关地址
-    netdrv.ipv4(socket.LWIP_ETH, "192.168.5.1", "255.255.255.0", "0.0.0.0")
-    -- 获取以太网网络状态,连接后返回 true,否则返回 false,如果不存在就返回 nil。
-    while netdrv.ready(socket.LWIP_ETH) ~= true do
-        -- log.info("netdrv", "等待以太网就绪") -- 若以太网设备没有连上,可打开此处注释排查。
-        sys.wait(100)
-    end
-    log.info("netdrv", "以太网就绪")
-    -- 创建 DHCP 服务器,为连接到以太网的设备分配 IP 地址。
-    log.info("netdrv", "创建dhcp服务器, 供以太网使用")
-    dhcpsrv.create({adapter=socket.LWIP_ETH, gw={192,168,5,1}})
-    -- 创建 DNS 代理服务,使得以太网接口上的设备可以通过 4G 网络访问互联网。
-    log.info("netdrv", "创建dns代理服务, 供以太网使用")
-    dnsproxy.setup(socket.LWIP_ETH, socket.LWIP_GP)
-end
-
--- 初始化 Ethernet LAN 和 WiFi AP。
-function wifi_ap_eth_lan()
-    while airlink.ready() ~= true do
-        sys.wait(100)
-    end
-    wlan.init()
-    sys.taskInit(eth_lan)
-    sys.taskInit(test_ap)
-
-    while 1 do
-        -- 当 4G 网络就绪后,开启 NAPT (网络端口地址转换)功能,使 4G 网络作为 WiFi AP 上设备的网关。
-        if netdrv.ready(socket.LWIP_GP) then
-            log.info("netdrv", "4G作为网关")
-            netdrv.napt(socket.LWIP_GP)
-            break
-        end
-        sys.wait(1000)
-    end
-end
-
-sys.taskInit(wifi_ap_eth_lan)

+ 0 - 160
module/Air8000/demo/multi-network/Air8000_wifi_networking_by_eth/main.lua

@@ -1,160 +0,0 @@
--- LuaTools需要PROJECT和VERSION这两个信息
-PROJECT = "Air8000_wifi_networking_by_eth"
-VERSION = "1.0.0"
-
---[[
-本demo演示的功能是:
-1. 初始化以太网模块,并通过硬件连接上网。
-2. 启用 WiFi 的 AP 模式,使其他设备可以连接。
-3. 配置网络共享,将以太网的网络共享给 WiFi。
-4. 实现网络状态的监控和维护。
-]]
-
--- 加载必要的模块
-_G.sys = require("sys")
-dhcpsrv = require("dhcpsrv")
-dnsproxy = require("dnsproxy")
-
--- 以太网初始化
-function init_eth()
-    log.info("初始化以太网")
-    -- 打开CH390供电
-    gpio.setup(140, 1, gpio.PULLUP)
-    sys.wait(100)
-
-    -- 配置SPI和初始化网络驱动
-    local result = spi.setup(
-        1,--spi id
-        nil,
-        0,--CPHA
-        0,--CPOL
-        8,--数据宽度
-        51200000--,--波特率
-    )
-    log.info("main", "open spi",result)
-    if result ~= 0 then--返回值为0,表示打开成功
-        log.info("main", "spi open error",result)
-        return
-    end
-
-    local success = netdrv.setup(socket.LWIP_ETH, netdrv.CH390, {spi=1,cs=12})
-    if not success then
-        log.error("以太网初始化失败")
-        return false
-    end
-    netdrv.dhcp(socket.LWIP_ETH, true)
-
-    while 1 do
-        local ip = netdrv.ipv4(socket.LWIP_ETH)
-        if ip and ip ~= "0.0.0.0" then
-            break
-        end
-        sys.wait(100)
-    end
-    iperf.server(socket.LWIP_ETH)
-
-    log.info("以太网初始化完成")
-    return true
-end
-
--- WiFi AP初始化
-function init_ap()
-    log.info("初始化WiFi AP")
-    wlan.init()
-    sys.wait(300)
-
-    -- 创建AP
-    local success = wlan.createAP("Air8000_AP", "12345678")
-    if not success then
-        log.error("创建WiFi AP失败")
-        return false
-    end
-
-    -- 配置AP的IP
-    netdrv.ipv4(socket.LWIP_AP, "192.168.4.1", "255.255.255.0", "0.0.0.0")
-    sys.wait(5000)
-
-    -- 启用AP的DHCP服务
-    dhcpsrv.create({adapter=socket.LWIP_AP})
-
-    -- 设置DNS代理,将AP流量通过以太网转发
-    dnsproxy.setup(socket.LWIP_AP, socket.LWIP_ETH)
-
-    log.info("WiFi AP初始化完成")
-
-    while 1 do
-        if netdrv.ready(socket.LWIP_ETH) then
-            log.info("以太网作为网关")
-            netdrv.napt(socket.LWIP_ETH)
-            break
-        end
-        sys.wait(1000)
-    end
-    icmp.setup(socket.LWIP_ETH)
-    while 1 do
-        -- 持续ping网关
-        local ip,mark,gw = netdrv.ipv4(socket.LWIP_ETH)
-        if gw then
-            log.info("ping", gw)
-            icmp.ping(socket.LWIP_ETH, gw)
-        end
-        sys.wait(10000)
-    end
-
-    return true
-end
-
-function ping_handle(id, time, dst)
-    log.info("ping.result", id, time, dst);
-end
-
--- wifi的AP相关事件
-function ap_event_handle(evt, data)
-    -- evt 可能的值有: "CONNECTED", "DISCONNECTED"
-    -- 当evt=CONNECTED, data是连接的AP的新STA的MAC地址
-    -- 当evt=DISCONNECTED, data是断开与AP连接的STA的MAC地址
-    log.info("收到AP事件", evt, data and data:toHex())
-end
-
--- 主任务
-function main_task()
-    -- 初始化以太网
-    if not init_eth() then
-        log.error("以太网初始化失败,退出")
-        return
-    end
-    sys.wait(100)
-
-    -- 初始化WiFi AP
-    if not init_ap() then
-        log.error("WiFi AP初始化失败,退出")
-        return
-    end
-    sys.wait(100)
-
-    -- 检查以太网链路状态
-    while true do
-        if netdrv.link(socket.LWIP_ETH) then
-            log.info("以太网已连接")
-            break
-        else
-            log.info("等待以太网连接...")
-            sys.wait(1000)
-        end
-    end
-    sys.wait(100)
-
-    -- 循环保持任务运行
-    while true do
-        sys.wait(1000)
-    end
-end
-
-sys.subscribe("PING_RESULT", ping_handle)
-sys.subscribe("WLAN_AP_INC", ap_event_handle)
-sys.taskInit(main_task)
-
--- 用户代码已结束---------------------------------------------
--- 结尾总是这一句
-sys.run()
--- sys.run()之后后面不要加任何语句!!!!!

+ 0 - 161
module/Air8000/demo/multi-network/Air8000_wifi_sta_eth_lan/main.lua

@@ -1,161 +0,0 @@
--- LuaTools需要PROJECT和VERSION这两个信息
-PROJECT = "Air8000_STA_to_ETH"
-VERSION = "1.0.0"
-
---[[
-本代码功能:
-1. 通过STA模式连接到WiFi网络
-2. 初始化以太网模块
-3. 将WiFi STA的网络共享给以太网设备
-]]
-
--- 加载必要的模块
-_G.sys = require("sys")
-dhcpsrv = require("dhcpsrv")
-dnsproxy = require("dnsproxy")
-
--- STA模式连接WiFi配置
-local WIFI_SSID = "luatos1234"
-local WIFI_PASSWORD = "12341234"
-
--- 以太网初始化
-function init_eth()
-    log.info("初始化以太网")
-    -- 打开CH390供电
-    gpio.setup(140, 1, gpio.PULLUP)
-    sys.wait(100)
-
-    -- 配置SPI和初始化网络驱动
-    local result = spi.setup(
-        1,--spi id
-        nil,
-        0,--CPHA
-        0,--CPOL
-        8,--数据宽度
-        51200000--波特率
-    )
-    log.info("main", "open spi", result)
-    if result ~= 0 then
-        log.info("main", "spi open error", result)
-        return false
-    end
-
-    local success = netdrv.setup(socket.LWIP_ETH, netdrv.CH390, {spi=1, cs=12, irq=255})
-    if not success then
-        log.error("以太网初始化失败")
-        return false
-    end
-
-    log.info("以太网初始化完成")
-    return true
-end
-
--- STA模式连接WiFi
-function connect_sta()
-    log.info("初始化WiFi STA")
-    wlan.init()
-    sys.wait(300)
-
-    log.info("开始连接WiFi:", WIFI_SSID)
-    local success = wlan.connect(WIFI_SSID, WIFI_PASSWORD)
-    if not success then
-        log.error("WiFi连接失败")
-        return false
-    end
-
-    -- 等待获取IP地址
-    while 1 do
-        local ip = netdrv.ipv4(socket.LWIP_STA)
-        if ip and ip ~= "0.0.0.0" then
-            log.info("WiFi STA已连接,IP:", ip)
-            break
-        end
-        sys.wait(100)
-    end
-
-    log.info("WiFi STA初始化完成")
-    return true
-end
-
--- 配置网络共享(STA到ETH)
-function setup_network_sharing()
-    log.info("配置网络共享")
-
-    -- 配置以太网的IP
-    netdrv.ipv4(socket.LWIP_ETH, "192.168.2.1", "255.255.255.0", "0.0.0.0")
-    sys.wait(1000)
-    -- 获取以太网网络状态,连接后返回 true,否则返回 false,如果不存在就返回 nil。
-    while netdrv.ready(socket.LWIP_ETH) ~= true do
-        log.info("netdrv", "等待以太网就绪") -- 若以太网设备没有连上,可打开此处注释排查。
-        sys.wait(1000)
-    end
-
-    -- 启用以太网的DHCP服务
-    dhcpsrv.create({adapter=socket.LWIP_ETH, gw={192,168,2,1}})
-    -- 设置DNS代理,将以太网流量通过STA转发
-    dnsproxy.setup(socket.LWIP_ETH, socket.LWIP_STA)
-
-    log.info("netdrv", "以太网就绪")
-
-    -- 等待网络就绪
-    while 1 do
-        if netdrv.ready(socket.LWIP_STA) then
-            log.info("设置NAPT")
-            netdrv.napt(socket.LWIP_STA)
-            break
-        end
-        sys.wait(1000)
-    end
-
-    log.info("网络共享配置完成")
-    return true
-end
-
--- 主任务
-function main_task()
-    -- 初始化WiFi STA
-    if not connect_sta() then
-        log.error("WiFi STA初始化失败,退出")
-        return
-    end
-    sys.wait(100)
-
-    -- 初始化以太网
-    if not init_eth() then
-        log.error("以太网初始化失败,退出")
-        return
-    end
-    sys.wait(100)
-
-    -- 配置网络共享
-    if not setup_network_sharing() then
-        log.error("网络共享配置失败,退出")
-        return
-    end
-    sys.wait(100)
-
-    -- 检查网络连接状态
-    local is_wifi_connected = false
-    while true do
-        local current_wifi_status = netdrv.link(socket.LWIP_STA)
-        if current_wifi_status and not is_wifi_connected then
-            log.info("WiFi已连接")
-            is_wifi_connected = true
-        elseif not current_wifi_status and is_wifi_connected then
-            log.info("WiFi已断开,尝试重新连接...")
-            is_wifi_connected = false
-            if not connect_sta() then
-                log.error("WiFi重新连接失败")
-            end
-        end
-        sys.wait(5000)
-    end
-end
-
--- 启动主任务
-sys.taskInit(main_task)
-
--- 用户代码已结束---------------------------------------------
--- 结尾总是这一句
-sys.run()
--- sys.run()之后后面不要加任何语句!!!!!

+ 0 - 152
module/Air8000/demo/multi-network/eth_wan_wifi_ap/main.lua

@@ -1,152 +0,0 @@
-
--- LuaTools需要PROJECT和VERSION这两个信息
-PROJECT = "air8000_wifi"
-VERSION = "1.0.5"
-
-dnsproxy = require("dnsproxy")
-dhcpsrv = require("dhcpsrv")
-httpplus = require("httpplus")
-
-gpio.setup(140, 1, gpio.PULLUP)
-
-
-
-function test_ap()
-    log.info("执行AP创建操作")
-    wlan.createAP("uiot5678", "12345678")
-    netdrv.ipv4(socket.LWIP_AP, "192.168.4.1", "255.255.255.0", "0.0.0.0")
-    sys.wait(5000)
-    dnsproxy.setup(socket.LWIP_AP, socket.LWIP_ETH)
-    dhcpsrv.create({adapter=socket.LWIP_AP})
-    while 1 do
-        if netdrv.ready(socket.LWIP_ETH) then
-            log.info("以太网作为网关")
-            netdrv.napt(socket.LWIP_ETH)
-            break
-        end
-        sys.wait(1000)
-    end
-    icmp.setup(socket.LWIP_ETH)
-    while 1 do
-        -- 持续ping网关
-        local ip,mark,gw = netdrv.ipv4(socket.LWIP_ETH)
-        if gw then
-            log.info("ping", gw)
-            icmp.ping(socket.LWIP_ETH, gw)
-        end
-        sys.wait(3000)
-    end
-end
-function test_sta()
-    log.info("执行STA连接操作")
-    wlan.connect("Xiaomi 13", "15055190176")
-    -- netdrv.dhcp(socket.LWIP_STA, true)
-    sys.wait(8000)
-    iperf.server(socket.LWIP_STA)
-    -- iperf.client(socket.LWIP_STA, "47.94.236.172")
-    dnsproxy.setup(socket.LWIP_ETH , socket.LWIP_STA)
-    sys.wait(5000)
-    while 1 do
-        -- log.info("MAC地址", netdrv.mac(socket.LWIP_STA))
-        -- log.info("IP地址", netdrv.ipv4(socket.LWIP_STA))
-        -- log.info("ready?", netdrv.ready(socket.LWIP_STA))
-        -- sys.wait(1000)
-        -- log.info("执行http请求")
-        -- local code = http.request("GET", "http://192.168.1.15:8000/README.md", nil, nil, {adapter=socket.LWIP_STA,timeout=3000}).wait()
-        local code, headers, body = http.request("GET", "https://httpbin.air32.cn/bytes/2048", nil, nil, {adapter=socket.LWIP_STA,timeout=5000,debug=false}).wait()
-        log.info("http执行结果", code, headers, body and #body)
-        -- socket.sntp(nil, socket.LWIP_STA)
-        sys.wait(2000)
-
-        -- socket.sntp(nil)
-        -- sys.wait(2000)
-        -- log.info("执行ping操作")
-        -- icmp.ping(socket.LWIP_STA, "183.2.172.177")
-        -- sys.wait(2000)
-    end
-end
-sys.subscribe("PING_RESULT", function(id, time, dst)
-    log.info("ping.result", id, time, dst);
-end)
-
--- wifi的AP相关事件
-sys.subscribe("WLAN_AP_INC", function(evt, data)
-    -- evt 可能的值有: "CONNECTED", "DISCONNECTED"
-    -- 当evt=CONNECTED, data是连接的AP的新STA的MAC地址
-    -- 当evt=DISCONNECTED, data是断开与AP连接的STA的MAC地址
-    log.info("收到AP事件", evt, data and data:toHex())
-end)
-
-sys.subscribe("PING_RESULT", function(id, time, dst)
-    log.info("ping", id, time, dst);
-end)
-
---  每隔6秒打印一次airlink统计数据, 调试用
--- sys.taskInit(function()
---     while 1 do
---         sys.wait(6000)
---         airlink.statistics()
---     end
--- end)
-
-function eth_lan()
-    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)
-    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
-
-sys.taskInit(function()
-    eth_lan()
-    wlan.init()
-    sys.wait(300)
-    test_sta()
-    while 1 do
-        log.info("测试使用4G 给以太网和wifi 设备供应网络")
-        sys.wait(1000)
-    end
-end)
-
--- 用户代码已结束---------------------------------------------
--- 结尾总是这一句
-sys.run()
--- sys.run()之后后面不要加任何语句!!!!!

+ 0 - 115
module/Air8000/demo/multi-network/gp_main_eth_lan_wifi_ap/main.lua

@@ -1,115 +0,0 @@
-
--- LuaTools需要PROJECT和VERSION这两个信息
-PROJECT = "air8000_wifi"
-VERSION = "1.0.5"
-
---[[
-本demo演示的功能是:
-1. 创建AP, 提供wifi设备, 通过4G上网
-2. 创建以太网, 为局域网内的设备, 通过4G上网
-]]
-
-dnsproxy = require("dnsproxy")
-dhcpsrv = require("dhcpsrv")
-httpplus = require("httpplus")
-
-gpio.setup(140, 1, gpio.PULLUP)
-
-
-
-function test_ap()
-    log.info("执行AP创建操作", airlink.ready() , "正常吗?")
-    wlan.createAP("uiot5678", "12345678")
-    netdrv.ipv4(socket.LWIP_AP, "192.168.4.1", "255.255.255.0", "0.0.0.0")
-    log.info("netdrv", "等待AP就绪")
-    while netdrv.ready(socket.LWIP_AP) ~= true do
-        sys.wait(100)
-    end
-    log.info("netdrv", "创建dhcp服务器, 供AP使用")
-    dhcpsrv.create({adapter=socket.LWIP_AP})
-    log.info("netdrv", "等待4G就绪")
-    while netdrv.ready(socket.LWIP_GP) ~= true do
-        sys.wait(100)
-    end
-    log.info("netdrv", "创建dns代理服务, 供AP使用")
-    dnsproxy.setup(socket.LWIP_AP, socket.LWIP_GP)
-    while 1 do
-        if netdrv.ready(socket.LWIP_GP) then
-            log.info("netdrv", "4G作为网关")
-            netdrv.napt(socket.LWIP_GP)
-            break
-        end
-        sys.wait(1000)
-    end
-end
-
-sys.subscribe("PING_RESULT", function(id, time, dst)
-    log.info("ping.result", id, time, dst);
-end)
-
--- wifi的AP相关事件
-sys.subscribe("WLAN_AP_INC", function(evt, data)
-    -- evt 可能的值有: "CONNECTED", "DISCONNECTED"
-    -- 当evt=CONNECTED, data是连接的AP的新STA的MAC地址
-    -- 当evt=DISCONNECTED, data是断开与AP连接的STA的MAC地址
-    log.info("收到AP事件", evt, data and data:toHex())
-end)
-
-sys.subscribe("PING_RESULT", function(id, time, dst)
-    log.info("ping", id, time, dst);
-end)
-
---  每隔6秒打印一次airlink统计数据, 调试用
--- sys.taskInit(function()
---     while 1 do
---         sys.wait(6000)
---         airlink.statistics()
---     end
--- end)
-
-
-function eth_lan()
-    -- sys.wait(3000)
-    local result = spi.setup(
-        1,--spi id
-        nil,
-        0,--CPHA
-        0,--CPOL
-        8,--数据宽度
-        51200000--,--波特率
-    )
-    log.info("main", "open spi",result)
-    if result ~= 0 then--返回值为0,表示打开成功
-        log.info("main", "spi open error",result)
-        return
-    end
-    log.info("netdrv", "初始化以太网")
-    netdrv.setup(socket.LWIP_ETH, netdrv.CH390, {spi=1,cs=12,irq=255})
-    log.info("netdrv", "等待以太网就绪")
-    sys.wait(1000)
-    netdrv.ipv4(socket.LWIP_ETH, "192.168.5.1", "255.255.255.0", "0.0.0.0")
-    while netdrv.ready(socket.LWIP_ETH) ~= true do
-        -- log.info("netdrv", "等待以太网就绪")
-        sys.wait(100)
-    end
-    log.info("netdrv", "以太网就绪")
-    log.info("netdrv", "创建dhcp服务器, 供以太网使用")
-    dhcpsrv.create({adapter=socket.LWIP_ETH, gw={192,168,5,1}})
-    log.info("netdrv", "创建dns代理服务, 供以太网使用")
-    dnsproxy.setup(socket.LWIP_ETH, socket.LWIP_GP)
-end
-
-sys.taskInit(function()
-    while airlink.ready() ~= true do
-        sys.wait(100)
-    end
-    eth_lan()
-    wlan.init()
-    sys.wait(300)
-    test_ap()
-end)
-
--- 用户代码已结束---------------------------------------------
--- 结尾总是这一句
-sys.run()
--- sys.run()之后后面不要加任何语句!!!!!

+ 71 - 0
module/Air8000/demo/network_routing/4g_out_ethernet_in_wifi_in/main.lua

@@ -0,0 +1,71 @@
+--[[
+@module  main
+@summary LuatOS用户应用脚本文件入口,总体调度应用逻辑 
+@version 1.0
+@date    2025.08.05
+@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 = "4g_out_ethernet_in_wifi_in"
+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 "netif_app"
+
+-- 用户代码已结束---------------------------------------------
+-- 结尾总是这一句
+sys.run()
+-- sys.run()之后后面不要加任何语句!!!!!

+ 63 - 0
module/Air8000/demo/network_routing/4g_out_ethernet_in_wifi_in/netif_app.lua

@@ -0,0 +1,63 @@
+--[[
+@module  netif_app
+@summary netif_app 网络管理模块,开启多网融合功能,4G提供网络供wifi和以太网设备上网
+@version 1.0
+@date    2025.08.05
+@author  魏健强
+@usage
+本文件为网络管理模块,核心业务逻辑为:
+1、设置多网融合功能,4G提供网络供wifi和以太网设备上网
+2、http测试4G网络
+本文件没有对外接口,直接在main.lua中require "netif_app"就可以加载运行;
+]]
+
+exnetif = require "exnetif"
+
+function netif_app_task_func()
+    local res
+    -- 等待4G网络连接成功
+    while not socket.adapter() do
+        -- 在此处阻塞等待4G网卡连接成功的消息"IP_READY"
+        -- 或者等待1秒超时退出阻塞等待状态;
+        -- 注意:此处的1000毫秒超时不要修改的更长;
+        sys.waitUntil("IP_READY", 1000)
+    end
+    --设置多网融合功能,4G提供网络供wifi设备上网
+    res = exnetif.setproxy(socket.LWIP_AP, socket.LWIP_GP, {
+            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时填写
+        })
+    if res then
+        log.info("exnetif", "setproxy success")
+    else
+        log.info("开启失败,请检查配置项是否正确,日志中是否打印了错误信息")
+    end
+    --设置多网融合功能,4G提供网络供以太网设备上网
+    res = exnetif.setproxy(socket.LWIP_ETH, socket.LWIP_GP, {
+            ethpower_en = 140,              -- 以太网模块的pwrpin引脚(gpio编号)
+            tp = netdrv.CH390,              -- 网卡芯片型号(选填参数),仅spi方式外挂以太网时需要填写。
+            opts = { spi = 1, cs = 12 },    -- 外挂方式,需要额外的参数(选填参数),仅spi方式外挂以太网时需要填写。
+            -- adapter_addr = "192.168.2.1",   -- 自定义LWIP_ETH网卡的ip地址(选填),需要自定义ip和网关ip时填写
+            -- adapter_gw = { 192, 168, 2, 1 } -- 自定义LWIP_ETH网卡的网关地址(选填),需要自定义ip和网关ip时填写
+        })
+    if res then
+        log.info("exnetif", "setproxy success")
+    else
+        log.info("开启失败,请检查配置项是否正确,日志中是否打印了错误信息")
+    end    
+    -- 每5秒进行HTTPS连接测试,实时监测4G网络连接状态, 仅供测试需要,量产不需要,用来判断当前网络是否可用,需要的话可以打开注释
+    -- while 1 do
+    --     local code, headers, body = http.request("GET", "https://httpbin.air32.cn/bytes/2048", nil, nil,
+    --         { adapter = socket.LWIP_GP, timeout = 5000, debug = false }).wait()
+    --     log.info("http执行结果", code, headers, body and #body)
+    --     sys.wait(5000)
+    -- end
+end
+
+sys.taskInit(netif_app_task_func)

+ 56 - 0
module/Air8000/demo/network_routing/4g_out_ethernet_in_wifi_in/readme.md

@@ -0,0 +1,56 @@
+## 功能模块介绍
+
+1、main.lua:主程序入口;
+
+2、netif_app: 网络管理模块,开启多网融合功能,4G提供网络供以太网和wifi设备上网;
+
+## 演示功能概述
+
+1、开启多网融合模式,4G连接外部网络,生成WiFi热点为WiFi终端设备提供接入,支持以太网lan模式为其他以太网设备提供接入
+
+2、​网络监控​,每5秒进行HTTPS连接测试,实时监测4G网络的连接状态
+
+## 演示硬件环境
+
+![](https://docs.openluat.com/air8000/luatos/app/image/netdrv_multi.jpg)
+1、Air8000开发板一块+可上网的sim卡一张+4g天线一根+wifi天线一根+网线一根:
+
+- sim卡插入开发板的sim卡槽
+
+- 天线装到开发板上
+
+- 网线一端插入开发板网口,另外一端连接其他需要联网的以太网设备
+
+2、TYPE-C USB数据线一根 + USB转串口数据线一根,Air8000开发板和数据线的硬件接线方式为:
+
+- Air8000开发板通过TYPE-C USB口供电;(外部供电/USB供电 拨动开关 拨到 USB供电一端)
+
+- TYPE-C USB数据线直接插到核心板的TYPE-C USB座子,另外一端连接电脑USB口;
+
+- USB转串口数据线,一般来说,白线连接开发板的UART1_TX,绿线连接开发板的UART1_RX,黑线连接核心板的GND,另外一端连接电脑USB口;
+
+## 演示软件环境
+
+1、Luatools下载调试工具
+
+2、[Air8000 V2011版本固件](https://docs.openluat.com/air8000/luatos/firmware/)(理论上,2025年7月26日之后发布的固件都可以)
+
+
+## 演示核心步骤
+
+1、搭建好硬件环境,按接线图连接硬件,
+
+2、按需修改WiFi热点配置(在netif_app.lua中):
+ssid = "AP热点名称"
+password = "AP热点密码"
+
+4、烧录内核固件和本项目的Lua脚本:main.lua:主程序入口,netif_app.lua:网络管理模块
+
+5、启动设备,观察日志输出:
+
+``` lua
+[INFO] exnetif setproxy success
+[INFO] http执行结果 200 ... 
+```
+
+6、其他设备通过wifi或以太网接入Air8000,其他设备都能正常上网,则表示验证成功。

+ 71 - 0
module/Air8000/demo/network_routing/ethernet_out_ethernet_in_wifi_in/main.lua

@@ -0,0 +1,71 @@
+--[[
+@module  main
+@summary LuatOS用户应用脚本文件入口,总体调度应用逻辑 
+@version 1.0
+@date    2025.08.05
+@author  魏健强
+@usage
+本demo演示的核心功能为:
+1.设置多网融合功能,以太网提供网络供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 = "ethernet_out_ethernet_in_wifi_in"
+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 "netif_app"
+
+-- 用户代码已结束---------------------------------------------
+-- 结尾总是这一句
+sys.run()
+-- sys.run()之后后面不要加任何语句!!!!!

+ 66 - 0
module/Air8000/demo/network_routing/ethernet_out_ethernet_in_wifi_in/netif_app.lua

@@ -0,0 +1,66 @@
+--[[
+@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}
+            }
+        })
+    
+    if res then
+        log.info("exnetif", "setproxy success")
+    else
+        log.info("开启失败,请检查配置项是否正确,日志中是否打印了错误信息")
+    end
+
+    --设置多网融合功能,以太网提供网络供以太网设备上网
+    res = exnetif.setproxy(socket.LWIP_USER1, socket.LWIP_ETH, {
+            ethpower_en = 20,                   -- 以太网模块的pwrpin引脚(gpio编号)
+            tp = netdrv.CH390,                  -- 网卡芯片型号(选填参数),仅spi方式外挂以太网时需要填写。
+            opts = {spi = 0, cs = 8},           -- 外挂方式,需要额外的参数(选填参数),仅spi方式外挂以太网时需要填写。
+            main_adapter = {                    -- 提供网络的网卡开启参数
+                ethpower_en = 140,              -- 以太网模块的pwrpin引脚(gpio编号)
+                tp = netdrv.CH390,              -- 网卡芯片型号(选填参数),仅spi方式外挂以太网时需要填写。
+                opts = {spi = 1, 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)

+ 57 - 0
module/Air8000/demo/network_routing/ethernet_out_ethernet_in_wifi_in/readme.md

@@ -0,0 +1,57 @@
+## 功能模块介绍
+
+1、main.lua:主程序入口;
+
+2、netif_app: 网络管理模块,开启多网融合功能,以太网提供网络供以太网和wifi设备上网;
+
+## 演示功能概述
+
+1、开启多网融合模式,以太网连接外部网络,生成WiFi热点为WiFi终端设备提供接入,支持以太网lan模式为其他以太网设备提供接入
+
+2、​网络监控​,每5秒进行HTTPS连接测试,实时监测以太网网络的连接状态
+
+## 演示硬件环境
+
+![](https://docs.openluat.com/air8000/luatos/app/image/netdrv_multi.jpg)
+1、Air8000开发板一块+可上网的sim卡一张+4g天线一根+wifi天线一根+网线一根:
+
+- sim卡插入开发板的sim卡槽
+
+- 天线装到开发板上
+
+- 网线一端插入开发板网口,另外一端连接可以上外网的路由器网口
+
+2、TYPE-C USB数据线一根 + USB转串口数据线一根,Air8000开发板和数据线的硬件接线方式为:
+
+- Air8000开发板通过TYPE-C USB口供电;(外部供电/USB供电 拨动开关 拨到 USB供电一端)
+
+- TYPE-C USB数据线直接插到核心板的TYPE-C USB座子,另外一端连接电脑USB口;
+
+- USB转串口数据线,一般来说,白线连接开发板的UART1_TX,绿线连接开发板的UART1_RX,黑线连接核心板的GND,另外一端连接电脑USB口;
+
+## 演示软件环境
+
+1、Luatools下载调试工具
+
+2、[Air8000 V2011版本固件](https://docs.openluat.com/air8000/luatos/firmware/)(理论上,2025年7月26日之后发布的固件都可以)
+
+
+## 演示核心步骤
+
+1、搭建好硬件环境,按接线图连接硬件,
+
+2、按需修改WiFi热点配置(在netif_app.lua中):
+ssid = "AP热点名称"
+password = "AP热点密码"
+
+4、烧录内核固件和本项目的Lua脚本:main.lua:主程序入口,netif_app.lua:网络管理模块
+
+5、启动设备,观察日志输出:
+
+``` lua
+[INFO] exnetif setproxy success
+[INFO] http执行结果 200 ... 
+```
+
+6、其他设备通过wifi或以太网接入Air8000,其他设备都能正常上网,则表示验证成功。
+

+ 69 - 0
module/Air8000/demo/network_routing/wifi_out_ethernet_in_wifi_in/main.lua

@@ -0,0 +1,69 @@
+--[[
+@module  main
+@summary LuatOS用户应用脚本文件入口,总体调度应用逻辑 
+@version 1.0
+@date    2025.08.05
+@author  魏健强
+@usage
+本demo演示的核心功能为:
+1.设置多网融合功能,wifi提供网络供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 = "wifi_out_ethernet_in_wifi_in"
+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 "netif_app"
+
+-- 用户代码已结束---------------------------------------------
+-- 结尾总是这一句
+sys.run()
+-- sys.run()之后后面不要加任何语句!!!!!

+ 58 - 0
module/Air8000/demo/network_routing/wifi_out_ethernet_in_wifi_in/netif_app.lua

@@ -0,0 +1,58 @@
+--[[
+@module  netif_app
+@summary netif_app 网络管理模块,开启多网融合功能,wifi提供网络供wifi和以太网设备上网
+@version 1.0
+@date    2025.08.05
+@author  魏健强
+@usage
+本文件为网络管理模块,核心业务逻辑为:
+1.设置多网融合功能,wifi提供网络供wifi和以太网设备上网
+2、http测试wifi网络
+本文件没有对外接口,直接在main.lua中require "netif_app"就可以加载运行;
+]] 
+exnetif = require "exnetif"
+
+function netif_app_task_func()
+    local res
+    --设置多网融合功能,wifi提供网络供以太网设备上网
+    res = exnetif.setproxy(socket.LWIP_ETH, socket.LWIP_STA, {
+        ethpower_en = 140,               -- 以太网模块的pwrpin引脚(gpio编号)
+        tp = netdrv.CH390,               -- 网卡芯片型号(选填参数),仅spi方式外挂以太网时需要填写。
+        opts = { spi = 1, cs = 12 },     -- 外挂方式,需要额外的参数(选填参数),仅spi方式外挂以太网时需要填写。
+        main_adapter = {                 -- 提供网络的网卡开启参数
+            ssid = "test",               
+            password = "HZ88888888"
+        }
+    })
+    -- 设置多网融合功能,wifi提供网络供wifi设备上网
+    res = exnetif.setproxy(socket.LWIP_AP, socket.LWIP_STA, {
+        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
+        main_adapter = {                    -- 提供网络的网卡开启参数
+            ssid = "test",
+            password = "HZ88888888"
+        }
+    })
+
+    if res then
+        log.info("exnetif", "setproxy success")
+    else
+        log.info("开启失败,请检查配置项是否正确,日志中是否打印了错误信息")
+    end
+    -- 每5秒进行HTTPS连接测试,实时监测wifi网络连接状态, 仅供测试需要,量产不需要,用来判断当前网络是否可用,需要的话可以打开注释
+    -- while 1 do
+    --     local code, headers, body = http.request("GET", "https://httpbin.air32.cn/bytes/2048", nil, nil, {
+    --         adapter = socket.LWIP_STA,
+    --         timeout = 5000,
+    --         debug = false
+    --     }).wait()
+    --     log.info("http执行结果", code, headers, body and #body)
+    --     sys.wait(5000)
+    -- end
+end
+
+sys.taskInit(netif_app_task_func)

+ 56 - 0
module/Air8000/demo/network_routing/wifi_out_ethernet_in_wifi_in/readme.md

@@ -0,0 +1,56 @@
+## 功能模块介绍
+
+1、main.lua:主程序入口;
+
+2、netif_app: 网络管理模块,开启多网融合功能,WIFI提供网络供以太网和wifi设备上网;
+
+## 演示功能概述
+
+1、开启多网融合模式,WIFI连接外部网络,支持以太网lan模式为其他以太网设备提供接入,支持生成WiFi热点为WiFi终端设备提供接入
+
+2、​网络监控​,每5秒进行HTTPS连接测试,实时监测WIFI网络的连接状态
+
+## 演示硬件环境
+
+![](https://docs.openluat.com/air8000/luatos/app/image/netdrv_multi.jpg)
+1、Air8000开发板一块+可上网的sim卡一张+WIFI天线一根+wifi天线一根+网线一根:
+
+- sim卡插入开发板的sim卡槽
+
+- 天线装到开发板上
+
+- 网线一端插入开发板网口,另外一端连接其他需要联网的以太网设备
+
+2、TYPE-C USB数据线一根 + USB转串口数据线一根,Air8000开发板和数据线的硬件接线方式为:
+
+- Air8000开发板通过TYPE-C USB口供电;(外部供电/USB供电 拨动开关 拨到 USB供电一端)
+
+- TYPE-C USB数据线直接插到核心板的TYPE-C USB座子,另外一端连接电脑USB口;
+
+- USB转串口数据线,一般来说,白线连接开发板的UART1_TX,绿线连接开发板的UART1_RX,黑线连接核心板的GND,另外一端连接电脑USB口;
+
+## 演示软件环境
+
+1、Luatools下载调试工具
+
+2、[Air8000 V2011版本固件](https://docs.openluat.com/air8000/luatos/firmware/)(理论上,2025年7月26日之后发布的固件都可以)
+
+
+## 演示核心步骤
+
+1、搭建好硬件环境,按接线图连接硬件,
+
+2、按需修改WiFi配置(在netif_app.lua中):
+ssid = "WIFI名称"
+password = "WIFI密码"
+
+4、烧录内核固件和本项目的Lua脚本:main.lua:主程序入口,netif_app.lua:网络管理模块
+
+5、启动设备,观察日志输出:
+
+``` lua
+[INFO] exnetif setproxy success
+[INFO] http执行结果 200 ... 
+```
+
+6、其他设备通过wifi或以太网接入Air8000,其他设备都能正常上网,则表示验证成功。

+ 0 - 118
module/Air8101/demo/multi_network/WIFI_4G_ETH/Air8101_Air780EPM/Air780EPM_master/network_airlink.lua

@@ -1,118 +0,0 @@
---[[
-本功能模块演示的内容为:
-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_USER0, netdrv.WHALE)
-    -- 启动airlink,配置Air780EPM作为SPI主机模式。
-    airlink.start(airlink.MODE_SPI_MASTER)
-
-    -- 配置IPv4地址。
-    log.info("配置IPv4地址", "192.168.111.2", "255.255.255.0", "192.168.111.1")
-    netdrv.ipv4(socket.LWIP_USER0, "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_USER0, socket.LWIP_GP)
-end
-
--- Air780EPM发送数据信息给Air8101。
-local function airlink_sdata_Air8101()
-    while 1 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)
-    end
-end
-
--- 一个简单的HTTP GET请求测试程序,用于判断Air780EPM的网络访问外网是否正常。
-local function http_get_test()
-    -- 6秒后再开始,让网络先初始化完成。
-    sys.wait(6000)
-    -- 循环发起HTTP GET请求,测试Air780EPM的网络访问外网是否正常。
-    while 1 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
-
--- 订阅IP_READY事件,打印收到的信息。
-local function ip_ready(id, ip)
-    -- 打印网络就绪的信息。
-    log.info("收到IP_READY!!", id, ip)
-    -- 给对端设备发送网络状态信息。
-    -- airlink.sdata("Air780EPM_IP_READY!!")
-end
-
--- 订阅IP_LOSE事件,打印收到的信息。
-local function ip_lose(id, ip)
-    -- 打印网络断开的信息。
-    log.info("收到IP_LOSE!!", id, ip)
-    -- 给对端设备发送网络状态信息。
-    -- airlink.sdata("Air780EPM_IP_LOSE!!")
-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)
-
--- 订阅IP_READY事件,打印收到的信息。
--- sys.subscribe("IP_READY", ip_ready)
-
--- 订阅IP_LOSE事件,打印收到的信息。
--- sys.subscribe("IP_LOSE", ip_lose)
-
--- 订阅airlink的SDATA事件,打印收到的信息。
--- sys.subscribe("AIRLINK_SDATA", airlink_sdata)

+ 0 - 187
module/Air8101/demo/multi_network/WIFI_4G_ETH/Air8101_Air780EPM/Air8101_slave/network_and_http.lua

@@ -1,187 +0,0 @@
---[[
-本功能模块演示的内容有:
-1. 初始化4G和WiFi网络连接。
-2. Air8101与对端设备进行数据交互。
-3. 自动切换网络连接模式。
-4. 通过HTTP GET请求测试网络连接情况。
-]]
-
--- 联网模式标志位,1: WiFi联网模式, 2: 4G联网模式
-local connect_mode = 1
-
--- 初始化网络,使得Air8101可以外挂Air780EPM实现4G联网功能。
-local function init_airlink_net()
-    -- sys.wait(500)
-    -- 初始化airlink。
-    airlink.init()
-    -- 创建桥接网络设备。
-    log.info("创建桥接网络设备")
-    netdrv.setup(socket.LWIP_USER0, netdrv.WHALE)
-    -- 启动airlink,配置Air8101作为SPI从机模式。
-    airlink.start(airlink.MODE_SPI_SLAVE)
-
-    -- 配置IPv4地址。
-    log.info("配置IPv4地址", "192.168.111.1", "255.255.255.0", "192.168.111.2")
-    netdrv.ipv4(socket.LWIP_USER0, "192.168.111.1", "255.255.255.0", "192.168.111.2")
-end
-
--- 初始化Air8101 WiFi联网配置程序。(WiFi联网功能需要用户自行配置WiFi热点名称和密码)
-local function init_wifi_net()
-    -- 输入需要连接对应WiFi热点的名称(ssid)和密码(password)
-    local ssid = "HONOR_100_Pro" -- 热点名称
-    local password = "12356789"  -- 热点密码
-    log.info("热点信息:", "热点名称:", ssid, "热点密码:", password)
-
-    -- wlan库的判断和WiFi连接。
-    if wlan and wlan.connect then
-        -- 初始化wlan库。
-        wlan.init()
-        -- 设置为WiFi STA模式。
-        wlan.setMode(wlan.STATION)
-        -- 连接WiFi热点。
-        local result = wlan.connect(ssid, password, 1)
-        if result then
-            log.info("发起连接成功")
-        else
-            log.info("发起连接失败")
-        end
-    else
-        log.info("wlan库不存在")
-    end
-end
-
--- Air8101发送数据信息给Air780EPM。
-local function airlink_sdata_Air780EPM()
-    -- 设置网络时间同步。
-    socket.sntp()
-    while 1 do
-        -- rtos.bsp():设备硬件bsp型号;os.date():本地时间。
-        local data = rtos.bsp() .. " " .. os.date()
-        log.info("发送数据给对端设备", data, "当前airlink状态", airlink.ready())
-        airlink.sdata(data)
-        sys.wait(1000)
-    end
-end
-
--- 一个简单的HTTP GET请求测试程序,用于判断Air8101的网络连接情况。
-local function http_get_test(mode)
-    -- 发起一个HTTP GET请求。
-    log.info(mode, "发起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(mode, "HTTP请求成功", "响应码", code, "响应体长度", body and #body)
-        sys.publish("打印网卡信息", mode, "succeeded")
-    else
-        log.error(mode, "HTTP请求失败", "错误码", code)
-        sys.publish("打印网卡信息", mode, "failed")
-    end
-end
-
--- 订阅airlink的SDATA事件,打印收到的信息。
-local function airlink_sdata(data)
-    -- 针对对端网络状态,发布不同事件主题。
-    if data == "Air780EPM_IP_READY!!" then
-        log.info("对端设备已联网")
-        -- 可在此处添加对端设备联网后的处理逻辑。
-        -- sys.publish("Air780EPM_IP_READY")
-    elseif data == "Air780EPM_IP_LOSE!!" then
-        log.info("对端设备已断网")
-        -- 可在此处添加对端设备断网后的处理逻辑。
-        -- sys.publish("Air780EPM_IP_LOSE")
-    end
-
-    -- 打印收到的信息。
-    log.info("收到AIRLINK_SDATA!!", data)
-end
-
--- 切换默认网络适配器。
-local function switch_default_net_adapter(netAdapter)
-    -- 切换默认网络适配器。
-    if netAdapter == "4G" then
-        -- 切换到4G网络适配器。
-        socket.dft(socket.LWIP_USER0)
-        -- 设置DNS服务器地址。
-        socket.setDNS(socket.LWIP_USER0, 1, "192.168.111.2")
-    elseif netAdapter == "WiFi" then
-        -- 切换到WiFi网络适配器。
-        socket.dft(socket.LWIP_STA)
-        -- 设置DNS服务器地址。
-        socket.setDNS(socket.LWIP_STA, 1, "114.114.114.114")
-    end
-end
-
--- 网络模式切换测试程序。
-local function net_mode_switch()
-    -- 30秒够4G和WiFi初始化完成了。
-    log.info("30秒后开始Air8101网络模式切换测试")
-    sys.wait(30000)
-    log.info("开始Air8101网络模式切换测试")
-
-    while 1 do
-        if connect_mode == 2 then
-            log.info("当前为4G联网模式,进行一次http请求")
-            switch_default_net_adapter("4G")
-            http_get_test("4G网络模式")
-        else
-            log.info("当前为WiFi联网模式,进行一次http请求")
-            switch_default_net_adapter("WiFi")
-            http_get_test("WiFi网络模式")
-        end
-
-        log.info("35秒后切换为另一种网络模式")
-        sys.wait(35000)
-
-        if connect_mode == 1 then
-            log.info("切换为4G联网模式")
-            connect_mode = 2
-            sys.publish("4G联网模式")
-        else
-            log.info("切换为WiFi联网模式")
-            connect_mode = 1
-            sys.publish("WiFi联网模式")
-        end
-    end
-end
-
--- 网卡信息获取程序。
-local function net_card_info(mode, result)
-    if mode == "4G网络模式" then
-        if result == "succeeded" then
-            log.info("4G网络模式连接成功")
-        else
-            log.error("4G网络模式连接失败")
-        end
-        log.info("当前网络适配器编号:", socket.dft())
-        log.info("当前本地IP地址:", netdrv.ipv4(socket.LWIP_USER0))
-    elseif mode == "WiFi网络模式" then
-        if result == "succeeded" then
-            log.info("WiFi网络模式连接成功")
-        else
-            log.error("WiFi网络模式连接失败")
-        end
-        log.info("当前网络适配器编号:", socket.dft())
-        log.info("当前本地IP地址:", netdrv.ipv4(socket.LWIP_STA))
-        log.info("当前MAC地址:", wlan.getMac())
-        log.info("其他信息", json.encode(wlan.getInfo()))
-    end
-end
-
--- 初始化网络,使得Air8101可以外挂Air780EPM实现4G联网功能。
-sys.taskInit(init_airlink_net)
-
--- 初始化Air8101 WiFi联网配置程序。(WiFi联网功能需要用户自行配置WiFi热点名称和密码)
-sys.taskInit(init_wifi_net)
-
--- Air8101发送数据信息给Air780EPM。
-sys.taskInit(airlink_sdata_Air780EPM)
-
--- 网络模式切换测试程序。
-sys.taskInit(net_mode_switch)
-
--- 订阅airlink的SDATA事件,打印收到的信息。
-sys.subscribe("AIRLINK_SDATA", airlink_sdata)
-
--- 订阅打印网卡信息事件,打印网卡信息。
-sys.subscribe("打印网卡信息", net_card_info)

+ 0 - 16
module/Air8101/demo/multi_network/WIFI_4G_ETH/Air8101_Air780EPM/README.md

@@ -1,16 +0,0 @@
-# 本程序说明如下
-
-本文件中代码用于测试Air8101的三网(4G、WiFi、以太网)切换功能。(以太网部分正在持续更新)
-详细操作说明可参考:[4G - luatos@air8101 - 合宙模组资料中心](https://docs.openluat.com/air8101/luatos/app/multinetwork/4G/)
-
-## 烧录说明
-
-1、Air780EPM 开发板烧录 Air780EPM_master 文件中的程序;
-
-2、Air8101 开发板烧录 Air8101_slave 文件中的程序。
-
-## 测试时所使用的固件版本
-
-1、Air780EPM固件版本:LuatOS-SoC_V2007_Air780EPM.soc;
-
-2、Air8101固件版本:LuatOS-SoC_V1003_Air8101.soc。

+ 71 - 0
module/Air8101/demo/network_routing/ethernet_out_ethernet_in_wifi_in/main.lua

@@ -0,0 +1,71 @@
+--[[
+@module  main
+@summary LuatOS用户应用脚本文件入口,总体调度应用逻辑 
+@version 1.0
+@date    2025.08.05
+@author  魏健强
+@usage
+本demo演示的核心功能为:
+1.设置多网融合功能,以太网提供网络供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 = "ethernet_out_ethernet_in_wifi_in"
+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 "netif_app"
+
+-- 用户代码已结束---------------------------------------------
+-- 结尾总是这一句
+sys.run()
+-- sys.run()之后后面不要加任何语句!!!!!

+ 95 - 0
module/Air8101/demo/network_routing/ethernet_out_ethernet_in_wifi_in/netif_app.lua

@@ -0,0 +1,95 @@
+--[[
+@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设备上网(RMII方式外挂)
+    res = exnetif.setproxy(socket.LWIP_AP, socket.LWIP_ETH, {
+        main_adapter = {-- 提供网络的网卡开启参数
+            ethpower_en = 13 -- 以太网模块的pwrpin引脚(gpio编号)
+        },
+        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时填写
+    })
+
+    if res then
+        log.info("exnetif", "setproxy success")
+    else
+        log.info("开启失败,请检查配置项是否正确,日志中是否打印了错误信息")
+    end
+
+    -- 设置多网融合功能,以太网WAN提供网络其他设备接入以太网LAN口上网
+    res = exnetif.setproxy(socket.LWIP_USER1, socket.LWIP_ETH, {
+        tp = netdrv.CH390, -- 网卡芯片型号(选填参数),仅spi方式外挂以太网时需要填写。
+        opts = {           -- 外挂方式,需要额外的参数(选填参数),仅spi方式外挂以太网时需要填写。
+            spi = 0,
+            cs = 15
+        },
+        main_adapter = {-- 提供网络的网卡开启参数
+            ethpower_en = 13 -- 以太网模块的pwrpin引脚(gpio编号)
+        }
+    })
+    if res then
+        log.info("exnetif", "setproxy success")
+    else
+        log.info("开启失败,请检查配置项是否正确,日志中是否打印了错误信息")
+    end
+
+    -- --设置多网融合功能,以太网提供网络供wifi设备上网(SPI方式外挂)
+    -- res = exnetif.setproxy(socket.LWIP_AP, socket.LWIP_USER1, {
+    --     ssid = "test2",                  -- AP名称(string),网卡包含wifi时填写
+    --     password = "HZ88888888",         -- AP密码(string),网卡包含wifi时填写
+    --     main_adapter = {                 -- 提供网络的网卡开启参数
+    --     pwrpin = 13,                  -- 供电使能引脚(number),根据接线引脚选择,Air8101核心板默认为gpio13
+    --     tp = netdrv.CH390,               -- 网卡芯片型号(选填参数),仅spi方式外挂以太网时需要填写。
+    --     opts = { spi = 0, cs = 15 }      -- 外挂方式,需要额外的参数(选填参数),仅spi方式外挂以太网时需要填写。
+    --     }
+    -- }) 
+    -- if res then
+    --     log.info("exnetif", "setproxy success")
+    -- else 
+    --     log.info("开启失败,请检查配置项是否正确,日志中是否打印了错误信息")
+    -- end
+    --  -- 设置多网融合功能,以太网WAN提供网络其他设备接入以太网LAN口上网
+    -- res = exnetif.setproxy(socket.LWIP_ETH, socket.LWIP_USER1, {
+    --     tp = netdrv.CH390, -- 网卡芯片型号(选填参数),仅spi方式外挂以太网时需要填写。
+    --     opts = {           -- 外挂方式,需要额外的参数(选填参数),仅spi方式外挂以太网时需要填写。
+    --         spi = 0,
+    --         cs = 15
+    --     },
+    --     main_adapter = {-- 提供网络的网卡开启参数
+    --         ethpower_en = 13 -- 以太网模块的pwrpin引脚(gpio编号)
+    --     }
+    -- })
+    -- 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)

+ 83 - 0
module/Air8101/demo/network_routing/ethernet_out_ethernet_in_wifi_in/readme.md

@@ -0,0 +1,83 @@
+## 功能模块介绍
+
+1、main.lua:主程序入口;
+
+2、netif_app: 网络管理模块,开启多网融合功能,以太网提供网络供wifi和以太网设备上网;
+
+## 演示功能概述
+
+1、开启多网融合模式,以太网连接外部网络,生成WiFi热点为WiFi终端设备提供接入,支持以太网lan模式为其他以太网设备提供接入
+
+2、​网络监控​,每5秒进行HTTPS连接测试,实时监测以太网网络的连接状态
+
+## 演示硬件环境
+
+![](https://docs.openluat.com/air8101/product/file/AirPHY_1000/hw_connection.jpg)
+
+![](https://docs.openluat.com/air8101/product/file/AirPHY_1000/hw_connection1.jpg)
+
+1、Air8101核心板
+
+2、AirPHY_1000配件板
+
+3、公对母的杜邦线11根(连接核心板和配件板)
+
+4、网线1根(一端接配件板,一端接路由器)
+
+5、Air8101核心板和AirPHY_1000配件板的硬件接线方式为
+
+- Air8101核心板通过TYPE-C USB口供电(核心板背面的功耗测试开关拨到OFF一端);如果测试发现软件重启,并且日志中出现  poweron reason 0,表示供电不足,此时再通过直流稳压电源对核心板的VIN管脚进行5V供电;
+
+| Air8101核心板 | AirPHY_1000配件板  |
+| ------------ | ------------------ |
+|    59/3V3    |         3.3v       |
+|     gnd      |         gnd        |
+|     5/D2     |         RX1        |
+|    72/D1     |         RX0        |
+|    71/D3     |         CRS        |
+|     4/D0     |         MDIO       |
+|     6/D4     |         TX0        |
+|    74/PCK    |         MDC        |
+|    70/D5     |         TX1        |
+|     7/D6     |         TXEN       |
+|     不接     |          NC        |
+|    69/D7     |         CLK        |
+
+可选AirETH_1000配件板一块,Air8101核心板和AirETH_1000配件板的硬件接线方式为:
+
+| Air8101核心板   |  AirETH_1000配件板 |
+| --------------- | ----------------- |
+| 59/3V3          | 3.3v              |
+| gnd             | gnd               |
+| 28/DCLK         | SCK               |
+| 54/DISP         | CSS               |
+| 55/HSYN         | SDO               |
+| 57/DE           | SDI               |
+| 14/GPIO8        | INT               |
+
+## 演示软件环境
+
+1、Luatools下载调试工具
+
+2、[Air8101 V1005版本固件](https://docs.openluat.com/air8101/luatos/firmware/)(理论上最新版本固件也可以,如果使用最新版本的固件不可以,可以烧录V1005固件对比验证)
+
+## 演示核心步骤
+
+1、搭建好硬件环境,按接线图连接硬件,
+
+2、按需修改WiFi热点配置(在netif_app.lua中):
+ssid = "AP热点名称"
+password = "AP热点密码"
+
+3、如果使用spi方式外挂网卡,打开SPI方式外挂网卡的代码,注释掉RMII方式外挂网卡的代码
+
+4、烧录内核固件和本项目的Lua脚本:main.lua:主程序入口,netif_app.lua:网络管理模块
+
+5、启动设备,观察日志输出:
+
+``` lua
+[INFO] exnetif setproxy success
+[INFO] http执行结果 200 ... 
+```
+
+6、其他设备通过wifi或以太网接入Air8101,其他设备都能正常上网,则表示验证成功。

+ 71 - 0
module/Air8101/demo/network_routing/wifi_out_ethernet_in_wifi_in/main.lua

@@ -0,0 +1,71 @@
+--[[
+@module  main
+@summary LuatOS用户应用脚本文件入口,总体调度应用逻辑 
+@version 1.0
+@date    2025.08.05
+@author  魏健强
+@usage
+本demo演示的核心功能为:
+1.设置多网融合功能,wifi提供网络供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 = "wifi_out_ethernet_in_wifi_in"
+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 "netif_app"
+
+-- 用户代码已结束---------------------------------------------
+-- 结尾总是这一句
+sys.run()
+-- sys.run()之后后面不要加任何语句!!!!!

+ 65 - 0
module/Air8101/demo/network_routing/wifi_out_ethernet_in_wifi_in/netif_app.lua

@@ -0,0 +1,65 @@
+--[[
+@module  netif_app
+@summary netif_app 网络管理模块,开启多网融合功能,wifi提供网络供以太网和wifi设备上网
+@version 1.0
+@date    2025.08.05
+@author  魏健强
+@usage
+本文件为网络管理模块,核心业务逻辑为:
+1.设置多网融合功能,wifi提供网络供wifi和以太网设备上网
+2、http测试wifi网络
+本文件没有对外接口,直接在main.lua中require "netif_app"就可以加载运行;
+]] 
+exnetif = require "exnetif"
+
+function netif_app_task_func()
+    local res
+    -- 设置多网融合功能,wifi提供网络供wifi设备上网
+    res = exnetif.setproxy(socket.LWIP_AP, socket.LWIP_STA, {
+        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
+        main_adapter = {                -- 提供网络的网卡开启参数
+            ssid = "test", 
+            password = "HZ88888888"
+        }
+    })
+    -- 设置多网融合功能,wifi提供网络供以太网设备上网,RMII方式外挂
+    res = exnetif.setproxy(socket.LWIP_ETH, socket.LWIP_STA, {
+        ethpower_en = 13,               -- 以太网模块的pwrpin引脚(gpio编号)
+        main_adapter = {                -- 提供网络的网卡开启参数
+            ssid = "test", 
+            password = "HZ88888888"
+        }
+    })
+    -- 设置多网融合功能,wifi提供网络供以太网设备上网,SPI方式外挂
+    -- res = exnetif.setproxy(socket.LWIP_USER1, socket.LWIP_STA, {
+    --     tp = netdrv.CH390,           -- 网卡芯片型号(选填参数),仅spi方式外挂以太网时需要填写。
+    --     opts = {                     -- 外挂方式,需要额外的参数(选填参数),仅spi方式外挂以太网时需要填写。
+    --         spi = 0,
+    --         cs = 15
+    --     },
+    --     main_adapter = {             -- 提供网络的网卡开启参数
+    --         ssid = "test", 
+    --         password = "HZ88888888"
+    --     }
+    -- })
+
+    if res then
+        log.info("exnetif", "setproxy success")
+    else
+        log.info("开启失败,请检查配置项是否正确,日志中是否打印了错误信息")
+    end
+    -- 每5秒进行HTTPS连接测试,实时监测wifi网络连接状态, 仅供测试需要,量产不需要,用来判断当前网络是否可用,需要的话可以打开注释
+    -- while 1 do
+    --     local code, headers, body = http.request("GET", "https://httpbin.air32.cn/bytes/2048", nil, nil, {adapter=socket.LWIP_STA,timeout=5000,debug=false}).wait()
+    --     log.info("http执行结果", code, headers, body and #body)
+    --     sys.wait(5000)
+    -- end
+end
+
+sys.taskInit(netif_app_task_func)

+ 83 - 0
module/Air8101/demo/network_routing/wifi_out_ethernet_in_wifi_in/readme.md

@@ -0,0 +1,83 @@
+## 功能模块介绍
+
+1、main.lua:主程序入口;
+
+2、netif_app: 网络管理模块,开启多网融合功能,wifi提供网络供以太网和wifi设备上网;
+
+## 演示功能概述
+
+1、开启多网融合模式,WIFI连接外部网络,支持以太网lan模式为其他以太网设备提供接入,支持生成WiFi热点为WiFi终端设备提供接入
+
+2、​网络监控​,每5秒进行HTTPS连接测试,实时监测WIFI网络的连接状态
+
+## 演示硬件环境
+
+![](https://docs.openluat.com/air8101/product/file/AirPHY_1000/hw_connection.jpg)
+
+![](https://docs.openluat.com/air8101/product/file/AirPHY_1000/hw_connection1.jpg)
+
+1、Air8101核心板
+
+2、AirPHY_1000配件板
+
+3、公对母的杜邦线11根(连接核心板和配件板)
+
+4、网线1根(一端接配件板,一端接路由器)
+
+5、Air8101核心板和AirPHY_1000配件板的硬件接线方式为
+
+- Air8101核心板通过TYPE-C USB口供电(核心板背面的功耗测试开关拨到OFF一端);如果测试发现软件重启,并且日志中出现  poweron reason 0,表示供电不足,此时再通过直流稳压电源对核心板的VIN管脚进行5V供电;
+
+| Air8101核心板 | AirPHY_1000配件板  |
+| ------------ | ------------------ |
+|    59/3V3    |         3.3v       |
+|     gnd      |         gnd        |
+|     5/D2     |         RX1        |
+|    72/D1     |         RX0        |
+|    71/D3     |         CRS        |
+|     4/D0     |         MDIO       |
+|     6/D4     |         TX0        |
+|    74/PCK    |         MDC        |
+|    70/D5     |         TX1        |
+|     7/D6     |         TXEN       |
+|     不接     |          NC        |
+|    69/D7     |         CLK        |
+
+可选AirETH_1000配件板一块,Air8101核心板和AirETH_1000配件板的硬件接线方式为:
+
+| Air8101核心板   |  AirETH_1000配件板 |
+| --------------- | ----------------- |
+| 59/3V3          | 3.3v              |
+| gnd             | gnd               |
+| 28/DCLK         | SCK               |
+| 54/DISP         | CSS               |
+| 55/HSYN         | SDO               |
+| 57/DE           | SDI               |
+| 14/GPIO8        | INT               |
+
+## 演示软件环境
+
+1、Luatools下载调试工具
+
+2、[Air8101 V1005版本固件](https://docs.openluat.com/air8101/luatos/firmware/)(理论上最新版本固件也可以,如果使用最新版本的固件不可以,可以烧录V1005固件对比验证)
+
+## 演示核心步骤
+
+1、搭建好硬件环境,按接线图连接硬件,
+
+2、按需修改WiFi配置(在netif_app.lua中):
+ssid = "WIFI名称"
+password = "WiFi密码"
+
+3、如果使用spi方式外挂网卡,打开SPI方式外挂网卡的代码,注释掉RMII方式外挂网卡的代码
+
+4、内核固件和本项目的Lua脚本:main.lua:主程序入口,netif_app.lua:网络管理模块
+
+5、启动设备,观察日志输出:
+
+``` lua
+[INFO] exnetif setproxy success
+[INFO] http执行结果 200 ... 
+```
+
+6、其他设备通过wifi或以太网接入Air8101,其他设备都能正常上网,则表示验证成功。