Bläddra i källkod

add: 新增iperf demo示例

tuoyiheng 4 månader sedan
förälder
incheckning
c46d3ec31a

+ 104 - 0
module/Air780EHM_Air780EHV_Air780EGH/demo/iperf/iperf_client.lua

@@ -0,0 +1,104 @@
+--[[
+@module  iperf_client
+@summary iperf客户端模式测试模块
+@version 1.0
+@date    2025.10.29
+@author  拓毅恒
+@usage
+本模块演示如何初始化CH390以太网并启动iperf客户端模式进行测试。
+适用于路由器连接场景,设备通过DHCP从路由器获取IP地址。
+1、初始化SPI接口连接CH390
+2、设置CH390驱动和网络参数
+3、配置从路由器获取IP地址
+4、连接到指定的iperf服务器并进行测试
+
+本文件没有对外接口,直接在 main.lua 中 require "iperf_client" 即可加载运行。
+]]
+
+-- 引入必要的模块
+local exnetif = require "exnetif"
+
+-- 配置服务器IP地址(需要根据实际服务器IP进行修改)
+local SERVER_IP = "192.168.1.3"  -- 这里需要修改为实际的服务器IP地址
+
+-- iperf测试报告处理函数
+local function iperf_report_handler(bytes, ms_duration, bandwidth)
+    -- 转换为Mbps显示
+    local bandwidth_mbps = bandwidth / 1024 / 1024 * 8
+    log.info("iperf报告", string.format("数据量: %d bytes, 持续时间: %d ms, 带宽: %.2f Mbps", bytes, ms_duration, bandwidth_mbps))
+end
+
+-- iperf客户端任务
+local function iperf_client_task()
+    log.info("iperf测试", "开始初始化网络...")
+    -- 使用exnetif配置SPI外接以太网芯片CH390H
+    exnetif.set_priority_order({
+        {
+            ETHERNET = {
+                pwrpin = 20, 
+                tp = netdrv.CH390,
+                opts = {spi = 0, cs = 8}
+            }
+        }
+    })
+    -- 等待IP地址获取成功
+    log.info("iperf测试", "等待获取IP地址...")
+    -- 设置IP获取超时
+    local ip_wait_count = 60
+    while true do
+        local ipv4 = socket.localIP(socket.LWIP_ETH)
+        if ipv4 and ipv4 ~= "0.0.0.0" then
+            log.info("iperf测试", "IP获取成功:", ipv4)
+            break
+        end
+        
+        -- 超时检查
+        if ip_wait_count <= 0 then
+            log.error("iperf测试", "获取IP地址超时")
+            return
+        end
+        ip_wait_count = ip_wait_count - 1
+        sys.wait(1000)
+    end
+    
+    -- 等待以太网连接
+    while not socket.adapter(socket.LWIP_ETH) do
+        sys.wait(100)
+    end
+    log.info("iperf测试", "以太网连接状态: 已连接")
+
+    -- 启动客户端模式,连接到指定服务器
+    log.info("iperf测试", "启动客户端模式")
+    log.info("iperf测试", "连接到服务器IP:", SERVER_IP, "端口: 5001")
+    
+    -- 连接服务器
+    iperf.client(socket.LWIP_ETH, SERVER_IP, 5001)
+    
+    -- 订阅iperf测试报告事件
+    sys.subscribe("IPERF_REPORT", iperf_report_handler)
+    
+    log.info("iperf测试", "测试开始")
+    
+        -- 设置测试循环次数,共测试2分钟
+    local test_count = 24
+    while test_count > 0 do
+        -- 等待IPERF_REPORT事件,超时时间5秒
+        local report_received = sys.waitUntil("IPERF_REPORT", 5000)
+        if report_received then
+            -- 如果收到报告事件,退出循环
+            log.info("iperf测试", "收到报告,结束测试")
+            break
+        else
+            -- 如果超时,继续测试
+            test_count = test_count - 1
+            log.info("iperf测试", "测试进行中...")
+        end
+    end
+    
+    -- 测试结束
+    log.info("iperf测试", "测试结束,关闭客户端")
+    iperf.abort()
+end
+
+-- 执行iperf客户端模式测试
+sys.taskInit(iperf_client_task)

+ 87 - 0
module/Air780EHM_Air780EHV_Air780EGH/demo/iperf/iperf_server.lua

@@ -0,0 +1,87 @@
+--[[
+@module  iperf_server
+@summary iperf服务器模式测试模块
+@version 1.0
+@date    2025.10.29
+@author  拓毅恒
+@usage
+本模块演示如何初始化CH390以太网并启动iperf服务器模式进行测试。
+适用于路由器连接场景,设备通过DHCP从路由器获取IP地址。
+使用步骤:
+1、初始化SPI接口连接CH390
+2、设置CH390驱动和网络参数
+3、配置从路由器获取IP地址
+4、启动iperf服务器并处理测试结果
+
+本文件没有对外接口,直接在 main.lua 中 require "iperf_server" 即可加载运行。
+]]
+
+-- 引入必要的模块
+local exnetif = require "exnetif"
+
+-- 记录服务器IP
+local server_ip = "0.0.0.0"
+
+-- iperf测试报告处理函数
+local function iperf_report_handler(bytes, ms_duration, bandwidth)
+    -- 转换为Mbps显示
+    local bandwidth_mbps = bandwidth / 1024 / 1024 * 8
+    log.info("iperf报告", string.format("数据量: %d bytes, 持续时间: %d ms, 带宽: %.2f Mbps", bytes, ms_duration, bandwidth_mbps))
+end
+
+-- iperf服务器任务
+local function iperf_server_task()
+    log.info("iperf测试", "开始初始化网络...")
+    -- 使用exnetif配置SPI外接以太网芯片CH390H
+    exnetif.set_priority_order({
+        {
+            ETHERNET = {
+                pwrpin = 20, 
+                tp = netdrv.CH390,
+                opts = {spi = 0, cs = 8}
+            }
+        }
+    })
+    -- 等待IP地址获取成功
+    log.info("iperf测试", "等待获取IP地址...")
+    local ip_wait_count = 60
+    while true do
+        local ipv4 = socket.localIP(socket.LWIP_ETH)
+        if ipv4 and ipv4 ~= "0.0.0.0" then
+            log.info("iperf测试", "IP获取成功:", ipv4)
+            server_ip = ipv4
+            break
+        end
+        
+        -- 超时检查
+        if ip_wait_count <= 0 then
+            log.error("iperf测试", "获取IP地址超时")
+            return
+        end
+        
+        ip_wait_count = ip_wait_count - 1
+        sys.wait(1000)
+    end
+    -- 等待以太网连接
+    while not socket.adapter(socket.LWIP_ETH) do
+        sys.wait(100)
+    end
+    log.info("iperf测试", "以太网连接状态: 已连接")
+    
+    -- 连接到路由器场景,不需要配置DHCP服务器
+    log.info("iperf测试", "网络配置完成")
+    
+    -- 订阅iperf测试报告事件
+    sys.subscribe("IPERF_REPORT", iperf_report_handler)
+    
+    -- 启动iperf服务器
+    log.info("iperf测试", "启动服务器模式")
+    log.info("iperf测试", "服务器IP地址:", server_ip, "端口: 5001")
+    iperf.server(socket.LWIP_ETH)
+    sys.wait(2000)
+    log.info("iperf测试", "服务器已启动,等待客户端连接")
+    log.info("iperf测试", "请在客户端设备上设置服务器IP地址为:", server_ip)
+end
+
+-- 执行iperf服务器模式测试
+sys.taskInit(iperf_server_task)

+ 67 - 0
module/Air780EHM_Air780EHV_Air780EGH/demo/iperf/main.lua

@@ -0,0 +1,67 @@
+--[[
+@module  main
+@summary LuatOS用户应用脚本文件入口,总体调度应用逻辑
+@version 1.0
+@date    2025.10.28
+@author  拓毅恒
+@usage
+演示功能概述
+本demo演示如何使用LuatOS的iperf模块进行网络吞吐量测试。
+iperf是一种网络性能测试工具,支持服务器模式和客户端模式,可以测试网络的带宽和稳定性。
+本demo提供了两个独立的测试用例:
+1、iperf服务器模式 - 设备作为服务器等待客户端连接
+2、iperf客户端模式 - 设备作为客户端主动连接服务器
+
+更多说明参考本目录下的readme.md文件
+]]
+PROJECT = "IPERF_DEMO"
+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)
+
+-- 加载 iperf 服务器测试模块
+require "iperf_server"
+
+-- 加载 iperf 客户端测试模块
+-- require "iperf_client"
+
+-- 用户代码已结束---------------------------------------------
+-- 结尾总是这一句
+sys.run()
+-- sys.run()之后后面不要加任何语句!!!!!

+ 136 - 0
module/Air780EHM_Air780EHV_Air780EGH/demo/iperf/readme.md

@@ -0,0 +1,136 @@
+## 功能模块介绍
+
+1、main.lua:主程序入口,用于选择加载服务器或客户端模块;
+
+2、iperf_server.lua:iperf服务器模块,用于初始化网络并启动iperf服务器;
+
+3、iperf_client.lua:iperf客户端模块,用于初始化网络并连接到服务器进行测试;
+
+## 演示功能概述
+
+本项目演示如何使用Air780EHM/Air780EHV/Air780EGH核心板进行网络性能测试。通过修改后的代码,可以实现两台Air780EHM/Air780EHV/Air780EGH核心板通过路由器连接,进行网络吞吐量测试。
+
+1、支持以下功能特性:
+
+- 支持DHCP客户端模式,自动从路由器获取IP地址
+- 服务器模式和客户端模式分离,可在不同设备上运行
+- 增强的错误处理和超时机制
+- 清晰的日志输出,便于调试和监控
+- 带宽自动计算并以Mbps显示
+
+## 演示硬件环境
+
+![](https://docs.openluat.com/air780ehv/luatos/common/hwenv/image/Air780EHV.png)
+
+1、两台Air780EHM/Air780EHV/Air780EGH核心板
+
+2、一台路由器(支持DHCP功能)
+
+3、网线两根
+
+4、Air780EHM/Air780EHV/Air780EGH核心板和数据线的硬件接线方式为
+
+- Air780EHM/Air780EHV/Air780EGH核心板通过TYPE-C USB口供电;
+
+- 如果测试发现软件频繁重启,重启原因值为:poweron reason 0,可能是供电不足,此时再通过直流稳压电源对核心板的vbat管脚进行4V供电,或者5V管脚进行5V供电;
+
+- TYPE-C USB数据线直接插到核心板的TYPE-C USB座子,另外一端连接电脑USB口;
+
+5、AirETH_1000配件板一块,Air780EHM/Air780EHV/Air780EGH核心板和AirETH_1000配件板的硬件接线方式为:
+
+| Air780EHM/Air780EHV/Air780EGH核心板  |  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 固件](https://docs.openluat.com/air780epm/luatos/firmware/version/#air780ehmluatos)
+
+[Air780EHV 固件](https://docs.openluat.com/air780ehv/luatos/firmware/version/)
+
+[Air780EGH 固件](https://docs.openluat.com/air780egh/luatos/firmware/version/)
+
+## 演示核心步骤
+
+1、搭建好硬件环境
+
+2、配置服务器端(一台核心板+AirETH_1000配件板)
+
+   a. 确保`main.lua`中已启用服务器模块,禁用客户端模块:
+   ```lua
+   -- 加载 iperf 服务器测试模块
+   require "iperf_server"
+
+   -- 加载 iperf 客户端测试模块
+   -- require "iperf_client"
+   ```
+
+   b. 烧录到一台Air780EHM/Air780EHV/Air780EGH核心板
+
+   c. 连接AirETH_1000配件板到路由器的LAN口
+
+   d. 启动核心板,它将自动从路由器获取IP地址并启动iperf服务器
+
+3、配置客户端(另一台核心板+AirETH_1000配件板)
+
+   a. 修改`iperf_client.lua`文件中的服务器IP地址为服务器核心板的实际IP地址:
+
+   ```lua
+   -- 配置服务器IP地址(需要根据实际服务器IP进行修改)
+   local SERVER_IP = "192.168.1.3"  -- 这里需要修改为实际的服务器IP地址
+   ```
+
+   b. 确保`main.lua`中已启用客户端模块,禁用服务器模块:
+
+   ```lua
+   -- 加载 iperf 服务器测试模块
+   -- require "iperf_server"
+
+   -- 加载 iperf 客户端测试模块
+   require "iperf_client"
+   ```
+
+   c. 烧录到另一台Air780EHM/Air780EHV/Air780EGH核心板
+
+   d. 连接AirETH_1000配件板到路由器的LAN口
+
+   e. 启动核心板,它将自动从路由器获取IP地址并尝试连接到服务器
+
+## 查看测试结果
+
+测试启动后,可以通过Luatools工具查看测试日志。客户端将显示实时的测试报告,包括数据量、持续时间和带宽(以Mbps为单位)。
+
+```lua
+2025-11-06 17:02:24.658][000000013.298] I/user.iperf测试 测试进行中...
+[2025-11-06 17:02:24.675][000000013.314] D/iperf iperf正常结束, type 1
+[2025-11-06 17:02:24.677][000000013.314] D/lwiperf iperf_free 88 c1d553c
+[2025-11-06 17:02:24.678][000000013.316] D/iperf report bytes 5989824 ms_duration 10002 bandwidth 4784 kbps
+[2025-11-06 17:02:24.680][000000013.317] I/user.iperf报告 数据量: 5989824 bytes, 持续时间: 10002 ms, 带宽: 0.04 Mbps
+```
+
+## 注意事项
+
+1、确保两台核心板和电脑都连接到同一个路由器,并且路由器已启用DHCP功能
+
+2、服务器的IP地址需要在客户端配置文件中正确设置,否则客户端将无法连接
+
+3、默认情况下,服务器在端口5001上监听连接请求
+
+4、测试默认持续2分钟后自动结束
+
+## 常见问题排查
+
+1、无法连接到服务器
+   - 确认服务器IP地址是否正确
+   - 检查两台设备是否在同一网段
+   - 检查网线连接是否牢固

+ 104 - 0
module/Air780EPM/demo/iperf/iperf_client.lua

@@ -0,0 +1,104 @@
+--[[
+@module  iperf_client
+@summary iperf客户端模式测试模块
+@version 1.0
+@date    2025.10.29
+@author  拓毅恒
+@usage
+本模块演示如何初始化CH390以太网并启动iperf客户端模式进行测试。
+适用于路由器连接场景,设备通过DHCP从路由器获取IP地址。
+1、初始化SPI接口连接CH390
+2、设置CH390驱动和网络参数
+3、配置从路由器获取IP地址
+4、连接到指定的iperf服务器并进行测试
+
+本文件没有对外接口,直接在 main.lua 中 require "iperf_client" 即可加载运行。
+]]
+
+-- 引入必要的模块
+local exnetif = require "exnetif"
+
+-- 配置服务器IP地址(需要根据实际服务器IP进行修改)
+local SERVER_IP = "192.168.1.3"  -- 这里需要修改为实际的服务器IP地址
+
+-- iperf测试报告处理函数
+local function iperf_report_handler(bytes, ms_duration, bandwidth)
+    -- 转换为Mbps显示
+    local bandwidth_mbps = bandwidth / 1024 / 1024 * 8
+    log.info("iperf报告", string.format("数据量: %d bytes, 持续时间: %d ms, 带宽: %.2f Mbps", bytes, ms_duration, bandwidth_mbps))
+end
+
+-- iperf客户端任务
+local function iperf_client_task()
+    log.info("iperf测试", "开始初始化网络...")
+    -- 使用exnetif配置SPI外接以太网芯片CH390H
+    exnetif.set_priority_order({
+        {
+            ETHERNET = {
+                pwrpin = 20, 
+                tp = netdrv.CH390,
+                opts = {spi = 0, cs = 8}
+            }
+        }
+    })
+    -- 等待IP地址获取成功
+    log.info("iperf测试", "等待获取IP地址...")
+    -- 设置IP获取超时
+    local ip_wait_count = 60
+    while true do
+        local ipv4 = socket.localIP(socket.LWIP_ETH)
+        if ipv4 and ipv4 ~= "0.0.0.0" then
+            log.info("iperf测试", "IP获取成功:", ipv4)
+            break
+        end
+        
+        -- 超时检查
+        if ip_wait_count <= 0 then
+            log.error("iperf测试", "获取IP地址超时")
+            return
+        end
+        ip_wait_count = ip_wait_count - 1
+        sys.wait(1000)
+    end
+    
+    -- 等待以太网连接
+    while not socket.adapter(socket.LWIP_ETH) do
+        sys.wait(100)
+    end
+    log.info("iperf测试", "以太网连接状态: 已连接")
+
+    -- 启动客户端模式,连接到指定服务器
+    log.info("iperf测试", "启动客户端模式")
+    log.info("iperf测试", "连接到服务器IP:", SERVER_IP, "端口: 5001")
+    
+    -- 连接服务器
+    iperf.client(socket.LWIP_ETH, SERVER_IP, 5001)
+    
+    -- 订阅iperf测试报告事件
+    sys.subscribe("IPERF_REPORT", iperf_report_handler)
+    
+    log.info("iperf测试", "测试开始")
+    
+        -- 设置测试循环次数,共测试2分钟
+    local test_count = 24
+    while test_count > 0 do
+        -- 等待IPERF_REPORT事件,超时时间5秒
+        local report_received = sys.waitUntil("IPERF_REPORT", 5000)
+        if report_received then
+            -- 如果收到报告事件,退出循环
+            log.info("iperf测试", "收到报告,结束测试")
+            break
+        else
+            -- 如果超时,继续测试
+            test_count = test_count - 1
+            log.info("iperf测试", "测试进行中...")
+        end
+    end
+    
+    -- 测试结束
+    log.info("iperf测试", "测试结束,关闭客户端")
+    iperf.abort()
+end
+
+-- 执行iperf客户端模式测试
+sys.taskInit(iperf_client_task)

+ 87 - 0
module/Air780EPM/demo/iperf/iperf_server.lua

@@ -0,0 +1,87 @@
+--[[
+@module  iperf_server
+@summary iperf服务器模式测试模块
+@version 1.0
+@date    2025.10.29
+@author  拓毅恒
+@usage
+本模块演示如何初始化CH390以太网并启动iperf服务器模式进行测试。
+适用于路由器连接场景,设备通过DHCP从路由器获取IP地址。
+使用步骤:
+1、初始化SPI接口连接CH390
+2、设置CH390驱动和网络参数
+3、配置从路由器获取IP地址
+4、启动iperf服务器并处理测试结果
+
+本文件没有对外接口,直接在 main.lua 中 require "iperf_server" 即可加载运行。
+]]
+
+-- 引入必要的模块
+local exnetif = require "exnetif"
+
+-- 记录服务器IP
+local server_ip = "0.0.0.0"
+
+-- iperf测试报告处理函数
+local function iperf_report_handler(bytes, ms_duration, bandwidth)
+    -- 转换为Mbps显示
+    local bandwidth_mbps = bandwidth / 1024 / 1024 * 8
+    log.info("iperf报告", string.format("数据量: %d bytes, 持续时间: %d ms, 带宽: %.2f Mbps", bytes, ms_duration, bandwidth_mbps))
+end
+
+-- iperf服务器任务
+local function iperf_server_task()
+    log.info("iperf测试", "开始初始化网络...")
+    -- 使用exnetif配置SPI外接以太网芯片CH390H
+    exnetif.set_priority_order({
+        {
+            ETHERNET = {
+                pwrpin = 20, 
+                tp = netdrv.CH390,
+                opts = {spi = 0, cs = 8}
+            }
+        }
+    })
+    -- 等待IP地址获取成功
+    log.info("iperf测试", "等待获取IP地址...")
+    local ip_wait_count = 60
+    while true do
+        local ipv4 = socket.localIP(socket.LWIP_ETH)
+        if ipv4 and ipv4 ~= "0.0.0.0" then
+            log.info("iperf测试", "IP获取成功:", ipv4)
+            server_ip = ipv4
+            break
+        end
+        
+        -- 超时检查
+        if ip_wait_count <= 0 then
+            log.error("iperf测试", "获取IP地址超时")
+            return
+        end
+        
+        ip_wait_count = ip_wait_count - 1
+        sys.wait(1000)
+    end
+    -- 等待以太网连接
+    while not socket.adapter(socket.LWIP_ETH) do
+        sys.wait(100)
+    end
+    log.info("iperf测试", "以太网连接状态: 已连接")
+    
+    -- 连接到路由器场景,不需要配置DHCP服务器
+    log.info("iperf测试", "网络配置完成")
+    
+    -- 订阅iperf测试报告事件
+    sys.subscribe("IPERF_REPORT", iperf_report_handler)
+    
+    -- 启动iperf服务器
+    log.info("iperf测试", "启动服务器模式")
+    log.info("iperf测试", "服务器IP地址:", server_ip, "端口: 5001")
+    iperf.server(socket.LWIP_ETH)
+    sys.wait(2000)
+    log.info("iperf测试", "服务器已启动,等待客户端连接")
+    log.info("iperf测试", "请在客户端设备上设置服务器IP地址为:", server_ip)
+end
+
+-- 执行iperf服务器模式测试
+sys.taskInit(iperf_server_task)

+ 67 - 0
module/Air780EPM/demo/iperf/main.lua

@@ -0,0 +1,67 @@
+--[[
+@module  main
+@summary LuatOS用户应用脚本文件入口,总体调度应用逻辑
+@version 1.0
+@date    2025.10.28
+@author  拓毅恒
+@usage
+演示功能概述
+本demo演示如何使用LuatOS的iperf模块进行网络吞吐量测试。
+iperf是一种网络性能测试工具,支持服务器模式和客户端模式,可以测试网络的带宽和稳定性。
+本demo提供了两个独立的测试用例:
+1、iperf服务器模式 - 设备作为服务器等待客户端连接
+2、iperf客户端模式 - 设备作为客户端主动连接服务器
+
+更多说明参考本目录下的readme.md文件
+]]
+PROJECT = "IPERF_DEMO"
+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)
+
+-- 加载 iperf 服务器测试模块
+require "iperf_server"
+
+-- 加载 iperf 客户端测试模块
+-- require "iperf_client"
+
+-- 用户代码已结束---------------------------------------------
+-- 结尾总是这一句
+sys.run()
+-- sys.run()之后后面不要加任何语句!!!!!

+ 115 - 0
module/Air780EPM/demo/iperf/readme.md

@@ -0,0 +1,115 @@
+## 功能模块介绍
+
+1、main.lua:主程序入口,用于选择加载服务器或客户端模块;
+
+2、iperf_server.lua:iperf服务器模块,用于初始化网络并启动iperf服务器;
+
+3、iperf_client.lua:iperf客户端模块,用于初始化网络并连接到服务器进行测试;
+
+## 演示功能概述
+
+本项目演示如何使用Air780EPM开发板进行网络性能测试。通过修改后的代码,可以实现两台Air780EPM开发板通过路由器连接,进行网络吞吐量测试。
+
+1、支持以下功能特性:
+
+- 支持DHCP客户端模式,自动从路由器获取IP地址
+- 服务器模式和客户端模式分离,可在不同设备上运行
+- 增强的错误处理和超时机制
+- 清晰的日志输出,便于调试和监控
+- 带宽自动计算并以Mbps显示
+
+## 演示硬件环境
+
+1、两台Air780EPM开发板
+
+2、一台路由器(支持DHCP功能)
+
+3、一台电脑(用于查看日志和监控)
+
+4、网线两根
+
+5、TYPE-C USB数据线两根
+
+   - Air780EPM开发板通过TYPE-C USB口供电;(外部供电/USB供电 拨动开关 拨到 USB供电一端)
+   - TYPE-C USB数据线直接插到核心板的TYPE-C USB座子,另外一端连接电脑USB口;
+
+## 演示软件环境
+
+1、Luatools下载调试工具
+
+2、[Air780EPM 固件](https://docs.openluat.com/air780epm/luatos/firmware/version/)
+
+## 演示核心步骤
+
+1、搭建好硬件环境
+
+2、配置服务器端(一台开发板)
+
+   a. 确保`main.lua`中已启用服务器模块,禁用客户端模块:
+   ```lua
+   -- 加载 iperf 服务器测试模块
+   require "iperf_server"
+
+   -- 加载 iperf 客户端测试模块
+   -- require "iperf_client"
+   ```
+
+   b. 烧录到一台Air780EPM开发板
+
+   c. 连接开发板到路由器的LAN口
+
+   d. 启动开发板,它将自动从路由器获取IP地址并启动iperf服务器
+
+3、配置客户端(另一台开发板)
+
+   a. 修改`iperf_client.lua`文件中的服务器IP地址为服务器开发板的实际IP地址:
+
+   ```lua
+   -- 配置服务器IP地址(需要根据实际服务器IP进行修改)
+   local SERVER_IP = "192.168.1.3"  -- 这里需要修改为实际的服务器IP地址
+   ```
+
+   b. 确保`main.lua`中已启用客户端模块,禁用服务器模块:
+
+   ```lua
+   -- 加载 iperf 服务器测试模块
+   -- require "iperf_server"
+
+   -- 加载 iperf 客户端测试模块
+   require "iperf_client"
+   ```
+
+   c. 烧录到另一台Air780EPM开发板
+
+   d. 连接开发板到路由器的LAN口
+
+   e. 启动开发板,它将自动从路由器获取IP地址并尝试连接到服务器
+
+## 查看测试结果
+
+测试启动后,可以通过Luatools工具查看测试日志。客户端将显示实时的测试报告,包括数据量、持续时间和带宽(以Mbps为单位)。
+
+```lua
+2025-11-06 17:02:24.658][000000013.298] I/user.iperf测试 测试进行中...
+[2025-11-06 17:02:24.675][000000013.314] D/iperf iperf正常结束, type 1
+[2025-11-06 17:02:24.677][000000013.314] D/lwiperf iperf_free 88 c1d553c
+[2025-11-06 17:02:24.678][000000013.316] D/iperf report bytes 5989824 ms_duration 10002 bandwidth 4784 kbps
+[2025-11-06 17:02:24.680][000000013.317] I/user.iperf报告 数据量: 5989824 bytes, 持续时间: 10002 ms, 带宽: 0.04 Mbps
+```
+
+## 注意事项
+
+1、确保两台开发板和电脑都连接到同一个路由器,并且路由器已启用DHCP功能
+
+2、服务器的IP地址需要在客户端配置文件中正确设置,否则客户端将无法连接
+
+3、默认情况下,服务器在端口5001上监听连接请求
+
+4、测试默认持续2分钟后自动结束
+
+## 常见问题排查
+
+1、无法连接到服务器
+   - 确认服务器IP地址是否正确
+   - 检查两台设备是否在同一网段
+   - 检查网线连接是否牢固

+ 104 - 0
module/Air8000/demo/iperf/iperf_client.lua

@@ -0,0 +1,104 @@
+--[[
+@module  iperf_client
+@summary iperf客户端模式测试模块
+@version 1.0
+@date    2025.10.29
+@author  拓毅恒
+@usage
+本模块演示如何初始化CH390以太网并启动iperf客户端模式进行测试。
+适用于路由器连接场景,设备通过DHCP从路由器获取IP地址。
+1、初始化SPI接口连接CH390
+2、设置CH390驱动和网络参数
+3、配置从路由器获取IP地址
+4、连接到指定的iperf服务器并进行测试
+
+本文件没有对外接口,直接在 main.lua 中 require "iperf_client" 即可加载运行。
+]]
+
+-- 引入必要的模块
+local exnetif = require "exnetif"
+
+-- 配置服务器IP地址(需要根据实际服务器IP进行修改)
+local SERVER_IP = "192.168.1.3"  -- 这里需要修改为实际的服务器IP地址
+
+-- iperf测试报告处理函数
+local function iperf_report_handler(bytes, ms_duration, bandwidth)
+    -- 转换为Mbps显示
+    local bandwidth_mbps = bandwidth / 1024 / 1024 * 8
+    log.info("iperf报告", string.format("数据量: %d bytes, 持续时间: %d ms, 带宽: %.2f Mbps", bytes, ms_duration, bandwidth_mbps))
+end
+
+-- iperf客户端任务
+local function iperf_client_task()
+    log.info("iperf测试", "开始初始化网络...")
+    -- 使用exnetif配置SPI外接以太网芯片CH390H
+    exnetif.set_priority_order({
+        {
+            ETHERNET = {
+                pwrpin = 140, 
+                tp = netdrv.CH390,
+                opts = {spi = 1, cs = 12}
+            }
+        }
+    })
+    -- 等待IP地址获取成功
+    log.info("iperf测试", "等待获取IP地址...")
+    -- 设置IP获取超时
+    local ip_wait_count = 60
+    while true do
+        local ipv4 = socket.localIP(socket.LWIP_ETH)
+        if ipv4 and ipv4 ~= "0.0.0.0" then
+            log.info("iperf测试", "IP获取成功:", ipv4)
+            break
+        end
+        
+        -- 超时检查
+        if ip_wait_count <= 0 then
+            log.error("iperf测试", "获取IP地址超时")
+            return
+        end
+        ip_wait_count = ip_wait_count - 1
+        sys.wait(1000)
+    end
+    
+    -- 等待以太网连接
+    while not socket.adapter(socket.LWIP_ETH) do
+        sys.wait(100)
+    end
+    log.info("iperf测试", "以太网连接状态: 已连接")
+
+    -- 启动客户端模式,连接到指定服务器
+    log.info("iperf测试", "启动客户端模式")
+    log.info("iperf测试", "连接到服务器IP:", SERVER_IP, "端口: 5001")
+    
+    -- 连接服务器
+    iperf.client(socket.LWIP_ETH, SERVER_IP, 5001)
+    
+    -- 订阅iperf测试报告事件
+    sys.subscribe("IPERF_REPORT", iperf_report_handler)
+    
+    log.info("iperf测试", "测试开始")
+    
+    -- 设置测试循环次数,共测试2分钟
+    local test_count = 24
+    while test_count > 0 do
+        -- 等待IPERF_REPORT事件,超时时间5秒
+        local report_received = sys.waitUntil("IPERF_REPORT", 5000)
+        if report_received then
+            -- 如果收到报告事件,退出循环
+            log.info("iperf测试", "收到报告,结束测试")
+            break
+        else
+            -- 如果超时,继续测试
+            test_count = test_count - 1
+            log.info("iperf测试", "测试进行中...")
+        end
+    end
+    
+    -- 测试结束
+    log.info("iperf测试", "测试结束,关闭客户端")
+    iperf.abort()
+end
+
+-- 执行iperf客户端模式测试
+sys.taskInit(iperf_client_task)

+ 87 - 0
module/Air8000/demo/iperf/iperf_server.lua

@@ -0,0 +1,87 @@
+--[[
+@module  iperf_server
+@summary iperf服务器模式测试模块
+@version 1.0
+@date    2025.10.29
+@author  拓毅恒
+@usage
+本模块演示如何初始化CH390以太网并启动iperf服务器模式进行测试。
+适用于路由器连接场景,设备通过DHCP从路由器获取IP地址。
+使用步骤:
+1、初始化SPI接口连接CH390
+2、设置CH390驱动和网络参数
+3、配置从路由器获取IP地址
+4、启动iperf服务器并处理测试结果
+
+本文件没有对外接口,直接在 main.lua 中 require "iperf_server" 即可加载运行。
+]]
+
+-- 引入必要的模块
+local exnetif = require "exnetif"
+
+-- 记录服务器IP
+local server_ip = "0.0.0.0"
+
+-- iperf测试报告处理函数
+local function iperf_report_handler(bytes, ms_duration, bandwidth)
+    -- 转换为Mbps显示
+    local bandwidth_mbps = bandwidth / 1024 / 1024 * 8
+    log.info("iperf报告", string.format("数据量: %d bytes, 持续时间: %d ms, 带宽: %.2f Mbps", bytes, ms_duration, bandwidth_mbps))
+end
+
+-- iperf服务器任务
+local function iperf_server_task()
+    log.info("iperf测试", "开始初始化网络...")
+    -- 使用exnetif配置SPI外接以太网芯片CH390H
+    exnetif.set_priority_order({
+        {
+            ETHERNET = {
+                pwrpin = 140, 
+                tp = netdrv.CH390,
+                opts = {spi = 1, cs = 12}
+            }
+        }
+    })
+    -- 等待IP地址获取成功
+    log.info("iperf测试", "等待获取IP地址...")
+    local ip_wait_count = 60
+    while true do
+        local ipv4 = socket.localIP(socket.LWIP_ETH)
+        if ipv4 and ipv4 ~= "0.0.0.0" then
+            log.info("iperf测试", "IP获取成功:", ipv4)
+            server_ip = ipv4
+            break
+        end
+        
+        -- 超时检查
+        if ip_wait_count <= 0 then
+            log.error("iperf测试", "获取IP地址超时")
+            return
+        end
+        
+        ip_wait_count = ip_wait_count - 1
+        sys.wait(1000)
+    end
+    -- 等待以太网连接
+    while not socket.adapter(socket.LWIP_ETH) do
+        sys.wait(100)
+    end
+    log.info("iperf测试", "以太网连接状态: 已连接")
+    
+    -- 连接到路由器场景,不需要配置DHCP服务器
+    log.info("iperf测试", "网络配置完成")
+    
+    -- 订阅iperf测试报告事件
+    sys.subscribe("IPERF_REPORT", iperf_report_handler)
+    
+    -- 启动iperf服务器
+    log.info("iperf测试", "启动服务器模式")
+    log.info("iperf测试", "服务器IP地址:", server_ip, "端口: 5001")
+    iperf.server(socket.LWIP_ETH)
+    sys.wait(2000)
+    log.info("iperf测试", "服务器已启动,等待客户端连接")
+    log.info("iperf测试", "请在客户端设备上设置服务器IP地址为:", server_ip)
+end
+
+-- 执行iperf服务器模式测试
+sys.taskInit(iperf_server_task)

+ 67 - 0
module/Air8000/demo/iperf/main.lua

@@ -0,0 +1,67 @@
+--[[
+@module  main
+@summary LuatOS用户应用脚本文件入口,总体调度应用逻辑
+@version 1.0
+@date    2025.10.28
+@author  拓毅恒
+@usage
+演示功能概述
+本demo演示如何使用LuatOS的iperf模块进行网络吞吐量测试。
+iperf是一种网络性能测试工具,支持服务器模式和客户端模式,可以测试网络的带宽和稳定性。
+本demo提供了两个独立的测试用例:
+1、iperf服务器模式 - 设备作为服务器等待客户端连接
+2、iperf客户端模式 - 设备作为客户端主动连接服务器
+
+更多说明参考本目录下的readme.md文件
+]]
+PROJECT = "IPERF_DEMO"
+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)
+
+-- 加载 iperf 服务器测试模块
+require "iperf_server"
+
+-- 加载 iperf 客户端测试模块
+-- require "iperf_client"
+
+-- 用户代码已结束---------------------------------------------
+-- 结尾总是这一句
+sys.run()
+-- sys.run()之后后面不要加任何语句!!!!!

+ 115 - 0
module/Air8000/demo/iperf/readme.md

@@ -0,0 +1,115 @@
+## 功能模块介绍
+
+1、main.lua:主程序入口,用于选择加载服务器或客户端模块;
+
+2、iperf_server.lua:iperf服务器模块,用于初始化网络并启动iperf服务器;
+
+3、iperf_client.lua:iperf客户端模块,用于初始化网络并连接到服务器进行测试;
+
+## 演示功能概述
+
+本项目演示如何使用Air8000开发板进行网络性能测试。通过修改后的代码,可以实现两台Air8000开发板通过路由器连接,进行网络吞吐量测试。
+
+1、支持以下功能特性:
+
+- 支持DHCP客户端模式,自动从路由器获取IP地址
+- 服务器模式和客户端模式分离,可在不同设备上运行
+- 增强的错误处理和超时机制
+- 清晰的日志输出,便于调试和监控
+- 带宽自动计算并以Mbps显示
+
+## 演示硬件环境
+
+1、两台Air8000开发板
+
+2、一台路由器(支持DHCP功能)
+
+3、一台电脑(用于查看日志和监控)
+
+4、网线两根
+
+5、TYPE-C USB数据线两根
+
+   - Air8000开发板通过TYPE-C USB口供电;(外部供电/USB供电 拨动开关 拨到 USB供电一端)
+   - TYPE-C USB数据线直接插到核心板的TYPE-C USB座子,另外一端连接电脑USB口;
+
+## 演示软件环境
+
+1、Luatools下载调试工具
+
+2、[Air8000 固件](https://docs.openluat.com/air8000/luatos/firmware/)
+
+## 演示核心步骤
+
+1、搭建好硬件环境
+
+2、配置服务器端(一台开发板)
+
+   a. 确保`main.lua`中已启用服务器模块,禁用客户端模块:
+   ```lua
+   -- 加载 iperf 服务器测试模块
+   require "iperf_server"
+
+   -- 加载 iperf 客户端测试模块
+   -- require "iperf_client"
+   ```
+
+   b. 烧录到一台Air8000开发板
+
+   c. 连接开发板到路由器的LAN口
+
+   d. 启动开发板,它将自动从路由器获取IP地址并启动iperf服务器
+
+3、配置客户端(另一台开发板)
+
+   a. 修改`iperf_client.lua`文件中的服务器IP地址为服务器开发板的实际IP地址:
+
+   ```lua
+   -- 配置服务器IP地址(需要根据实际服务器IP进行修改)
+   local SERVER_IP = "192.168.1.3"  -- 这里需要修改为实际的服务器IP地址
+   ```
+
+   b. 确保`main.lua`中已启用客户端模块,禁用服务器模块:
+
+   ```lua
+   -- 加载 iperf 服务器测试模块
+   -- require "iperf_server"
+
+   -- 加载 iperf 客户端测试模块
+   require "iperf_client"
+   ```
+
+   c. 烧录到另一台Air8000开发板
+
+   d. 连接开发板到路由器的LAN口
+
+   e. 启动开发板,它将自动从路由器获取IP地址并尝试连接到服务器
+
+## 查看测试结果
+
+测试启动后,可以通过Luatools工具查看测试日志。客户端将显示实时的测试报告,包括数据量、持续时间和带宽(以Mbps为单位)。
+
+```lua
+2025-11-06 17:02:24.658][000000013.298] I/user.iperf测试 测试进行中...
+[2025-11-06 17:02:24.675][000000013.314] D/iperf iperf正常结束, type 1
+[2025-11-06 17:02:24.677][000000013.314] D/lwiperf iperf_free 88 c1d553c
+[2025-11-06 17:02:24.678][000000013.316] D/iperf report bytes 5989824 ms_duration 10002 bandwidth 4784 kbps
+[2025-11-06 17:02:24.680][000000013.317] I/user.iperf报告 数据量: 5989824 bytes, 持续时间: 10002 ms, 带宽: 0.04 Mbps
+```
+
+## 注意事项
+
+1、确保两台开发板和电脑都连接到同一个路由器,并且路由器已启用DHCP功能
+
+2、服务器的IP地址需要在客户端配置文件中正确设置,否则客户端将无法连接
+
+3、默认情况下,服务器在端口5001上监听连接请求
+
+4、测试默认持续2分钟后自动结束
+
+## 常见问题排查
+
+1、无法连接到服务器
+   - 确认服务器IP地址是否正确
+   - 检查两台设备是否在同一网段
+   - 检查网线连接是否牢固

+ 94 - 0
module/Air8101/demo/iperf/iperf_client.lua

@@ -0,0 +1,94 @@
+--[[
+@module  iperf_client
+@summary iperf客户端模式测试模块
+@version 1.0
+@date    2025.10.29
+@author  拓毅恒
+@usage
+本模块演示如何初始化CH390以太网并启动iperf客户端模式进行测试。
+适用于路由器连接场景,设备通过DHCP从路由器获取IP地址。
+1、初始化SPI接口连接CH390
+2、设置CH390驱动和网络参数
+3、配置从路由器获取IP地址
+4、连接到指定的iperf服务器并进行测试
+
+本文件没有对外接口,直接在 main.lua 中 require "iperf_client" 即可加载运行。
+]]
+
+-- 引入必要的模块
+local netdrv_eth_spi = require "netdrv_eth_spi"
+
+-- 配置服务器IP地址(需要根据实际服务器IP进行修改)
+local SERVER_IP = "192.168.1.3"  -- 这里需要修改为实际的服务器IP地址
+
+-- iperf测试报告处理函数
+local function iperf_report_handler(bytes, ms_duration, bandwidth)
+    -- 转换为Mbps显示
+    local bandwidth_mbps = bandwidth / 1024 / 1024 * 8
+    log.info("iperf报告", string.format("数据量: %d bytes, 持续时间: %d ms, 带宽: %.2f Mbps", bytes, ms_duration, bandwidth_mbps))
+end
+
+-- iperf客户端任务
+local function iperf_client_task()
+    log.info("iperf测试", "等待网络初始化完成...")
+    -- 等待IP地址获取成功
+    log.info("iperf测试", "等待获取IP地址...")
+    -- 设置IP获取超时
+    local ip_wait_count = 60
+    while true do
+        local ipv4 = socket.localIP(socket.LWIP_USER1)
+        if ipv4 and ipv4 ~= "0.0.0.0" then
+            log.info("iperf测试", "IP获取成功:", ipv4)
+            break
+        end
+        
+        -- 超时检查
+        if ip_wait_count <= 0 then
+            log.error("iperf测试", "获取IP地址超时")
+            return
+        end
+        ip_wait_count = ip_wait_count - 1
+        sys.wait(1000)
+    end
+    
+    -- 等待以太网连接
+    while not socket.adapter(socket.LWIP_USER1) do
+        sys.wait(100)
+    end
+    log.info("iperf测试", "以太网连接状态: 已连接")
+
+    -- 启动客户端模式,连接到指定服务器
+    log.info("iperf测试", "启动客户端模式")
+    log.info("iperf测试", "连接到服务器IP:", SERVER_IP, "端口: 5001")
+    
+    -- 连接服务器
+    iperf.client(socket.LWIP_USER1, SERVER_IP, 5001)
+    
+    -- 订阅iperf测试报告事件
+    sys.subscribe("IPERF_REPORT", iperf_report_handler)
+    
+    log.info("iperf测试", "测试开始")
+    
+        -- 设置测试循环次数,共测试2分钟
+    local test_count = 24
+    while test_count > 0 do
+        -- 等待IPERF_REPORT事件,超时时间5秒
+        local report_received = sys.waitUntil("IPERF_REPORT", 5000)
+        if report_received then
+            -- 如果收到报告事件,退出循环
+            log.info("iperf测试", "收到报告,结束测试")
+            break
+        else
+            -- 如果超时,继续测试
+            test_count = test_count - 1
+            log.info("iperf测试", "测试进行中...")
+        end
+    end
+    
+    -- 测试结束
+    log.info("iperf测试", "测试结束,关闭客户端")
+    iperf.abort()
+end
+
+-- 执行iperf客户端模式测试
+sys.taskInit(iperf_client_task)

+ 76 - 0
module/Air8101/demo/iperf/iperf_server.lua

@@ -0,0 +1,76 @@
+--[[
+@module  iperf_server
+@summary iperf服务器模式测试模块
+@version 1.0
+@date    2025.10.29
+@author  拓毅恒
+@usage
+本模块演示如何初始化CH390以太网并启动iperf服务器模式进行测试。
+适用于路由器连接场景,设备通过DHCP从路由器获取IP地址。
+使用步骤:
+1、初始化SPI接口连接CH390
+2、设置CH390驱动和网络参数
+3、配置从路由器获取IP地址
+4、启动iperf服务器并处理测试结果
+
+本文件没有对外接口,直接在 main.lua 中 require "iperf_server" 即可加载运行。
+]]
+
+-- 引入必要的模块
+local netdrv_eth_spi = require "netdrv_eth_spi"
+
+-- 记录服务器IP
+local server_ip = "0.0.0.0"
+
+-- iperf测试报告处理函数
+local function iperf_report_handler(bytes, ms_duration, bandwidth)
+    -- 转换为Mbps显示
+    local bandwidth_mbps = bandwidth / 1024 / 1024 * 8
+    log.info("iperf报告", string.format("数据量: %d bytes, 持续时间: %d ms, 带宽: %.2f Mbps", bytes, ms_duration, bandwidth_mbps))
+end
+
+-- iperf服务器任务
+local function iperf_server_task()
+    log.info("iperf测试", "等待网络初始化完成...")
+    -- 等待IP地址获取成功
+    log.info("iperf测试", "等待获取IP地址...")
+    local ip_wait_count = 60
+    while true do
+        local ipv4 = socket.localIP(socket.LWIP_USER1)
+        if ipv4 and ipv4 ~= "0.0.0.0" then
+            log.info("iperf测试", "IP获取成功:", ipv4)
+            server_ip = ipv4
+            break
+        end
+        
+        -- 超时检查
+        if ip_wait_count <= 0 then
+            log.error("iperf测试", "获取IP地址超时")
+            return
+        end
+        
+        ip_wait_count = ip_wait_count - 1
+        sys.wait(1000)
+    end
+    -- 等待以太网连接
+    while not socket.adapter(socket.LWIP_USER1) do
+        sys.wait(100)
+    end
+    log.info("iperf测试", "以太网连接状态: 已连接")
+    
+    log.info("iperf测试", "网络配置完成")
+    
+    -- 订阅iperf测试报告事件
+    sys.subscribe("IPERF_REPORT", iperf_report_handler)
+    
+    -- 启动iperf服务器
+    log.info("iperf测试", "启动服务器模式")
+    log.info("iperf测试", "服务器IP地址:", server_ip, "端口: 5001")
+    iperf.server(socket.LWIP_USER1)
+    sys.wait(2000)
+    log.info("iperf测试", "服务器已启动,等待客户端连接")
+    log.info("iperf测试", "请在客户端设备上设置服务器IP地址为:", server_ip)
+end
+
+-- 执行iperf服务器模式测试
+sys.taskInit(iperf_server_task)

+ 67 - 0
module/Air8101/demo/iperf/main.lua

@@ -0,0 +1,67 @@
+--[[
+@module  main
+@summary LuatOS用户应用脚本文件入口,总体调度应用逻辑
+@version 1.0
+@date    2025.10.28
+@author  拓毅恒
+@usage
+演示功能概述
+本demo演示如何使用LuatOS的iperf模块进行网络吞吐量测试。
+iperf是一种网络性能测试工具,支持服务器模式和客户端模式,可以测试网络的带宽和稳定性。
+本demo提供了两个独立的测试用例:
+1、iperf服务器模式 - 设备作为服务器等待客户端连接
+2、iperf客户端模式 - 设备作为客户端主动连接服务器
+
+更多说明参考本目录下的readme.md文件
+]]
+PROJECT = "IPERF_DEMO"
+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)
+
+-- 加载 iperf 服务器测试模块
+require "iperf_server"
+
+-- 加载 iperf 客户端测试模块
+-- require "iperf_client"
+
+-- 用户代码已结束---------------------------------------------
+-- 结尾总是这一句
+sys.run()
+-- sys.run()之后后面不要加任何语句!!!!!

+ 102 - 0
module/Air8101/demo/iperf/netdrv_eth_spi.lua

@@ -0,0 +1,102 @@
+--[[
+@module  netdrv_eth_spi
+@summary "通过SPI外挂CH390H芯片的以太网卡"驱动模块
+@version 1.0
+@date    2025.07.24
+@author  马梦阳
+@usage
+本文件为"通过SPI外挂CH390H芯片的以太网卡"驱动模块 ,核心业务逻辑为:
+1、打开AirETH_1000配件板供电开关;
+2、初始化spi0,初始化以太网卡,并且在以太网卡上开启DHCP(动态主机配置协议);
+3、以太网卡的连接状态发生变化时,在日志中进行打印;
+
+Air8101核心板和AirETH_1000配件板的硬件接线方式为:
+Air8101核心板通过TYPE-C USB口供电(核心板背面的功耗测试开关拨到OFF一端);
+如果测试发现软件重启,并且日志中出现  poweron reason 0,表示供电不足,此时再通过直流稳压电源对核心板的VIN管脚进行5V供电;
+| Air8101核心板    | AirETH_1000配件板  |
+| --------------- | ----------------- |
+| 59/3V3          | 3.3v              |
+| gnd             | gnd               |
+| 28/DCLK         | SCK               |
+| 54/DISP         | CSS               |
+| 55/HSYN         | SDO               |
+| 57/DE           | SDI               |
+| 14/GPIO8        | INT               |
+
+本文件没有对外接口,直接在其他功能模块中require "netdrv_eth_spi"就可以加载运行;
+]]
+
+local function ip_ready_func(ip, adapter)
+    if adapter == socket.LWIP_USER1 then
+        log.info("netdrv_eth_spi.ip_ready_func", "IP_READY", socket.localIP(socket.LWIP_USER1))
+    end
+end
+
+local function ip_lose_func(adapter)
+    if adapter == socket.LWIP_USER1 then
+        log.warn("netdrv_eth_spi.ip_lose_func", "IP_LOSE")
+    end
+end
+
+
+-- 此处订阅"IP_READY"和"IP_LOSE"两种消息
+-- 在消息的处理函数中,仅仅打印了一些信息,便于实时观察"通过SPI外挂CH390H芯片的以太网卡"的连接状态
+-- 也可以根据自己的项目需求,在消息处理函数中增加自己的业务逻辑控制,例如可以在连网状态发生改变时更新网络图标
+sys.subscribe("IP_READY", ip_ready_func)
+sys.subscribe("IP_LOSE", ip_lose_func)
+
+
+-- 设置默认网卡为socket.LWIP_USER1
+socket.dft(socket.LWIP_USER1)
+
+
+-- 本demo测试使用的是核心板的VDD 3V3引脚对AirETH_1000配件板进行供电
+-- VDD 3V3引脚是Air8101内部的LDO输出引脚,最大输出电流300mA
+-- GPIO13在Air8101内部使能控制这个LDO的输出
+-- 所以在此处GPIO13输出高电平打开这个LDO
+gpio.setup(13, 1, gpio.PULLUP)
+
+
+-- 这个task的核心业务逻辑是:初始化SPI,初始化以太网卡,并在以太网卡上开启动态主机配置协议
+local function netdrv_eth_spi_task_func()
+    -- 初始化SPI0
+    local result = spi.setup(
+        0,--spi_id
+        nil,
+        0,--CPHA
+        0,--CPOL
+        8,--数据宽度
+        25600000--,--频率
+        -- spi.MSB,--高低位顺序    可选,默认高位在前
+        -- spi.master,--主模式     可选,默认主
+        -- spi.full--全双工       可选,默认全双工
+    )
+    log.info("netdrv_eth_spi", "spi open result", result)
+    -- 返回值为0,表示打开成功
+    if result ~= 0 then
+        log.error("netdrv_eth_spi", "spi open error",result)
+        return
+    end
+
+    -- 初始化以太网卡
+
+    -- 以太网联网成功(成功连接路由器,并且获取到了IP地址)后,内核固件会产生一个"IP_READY"消息
+    -- 各个功能模块可以订阅"IP_READY"消息实时处理以太网联网成功的事件
+    -- 也可以在任何时刻调用socket.adapter(socket.LWIP_USER1)来获取以太网是否连接成功
+
+    -- 以太网断网后,内核固件会产生一个"IP_LOSE"消息
+    -- 各个功能模块可以订阅"IP_LOSE"消息实时处理以太网断网的事件
+    -- 也可以在任何时刻调用socket.adapter(socket.LWIP_USER1)来获取以太网是否连接成功
+
+    -- socket.LWIP_USER1 指定网络适配器编号
+    -- netdrv.CH390外挂CH390
+    -- SPI ID 0, 片选 GPIO15
+    netdrv.setup(socket.LWIP_USER1, netdrv.CH390, {spi=0, cs=15})
+
+    -- 在以太上开启动态主机配置协议
+    netdrv.dhcp(socket.LWIP_USER1, true)
+end
+
+-- 创建并且启动一个task
+-- task的处理函数为netdrv_eth_spi_task_func
+sys.taskInit(netdrv_eth_spi_task_func)

+ 135 - 0
module/Air8101/demo/iperf/readme.md

@@ -0,0 +1,135 @@
+## 功能模块介绍
+
+1、main.lua:主程序入口,用于选择加载服务器或客户端模块;
+
+2、iperf_server.lua:iperf服务器模块,引用网络初始化模块并启动iperf服务器;
+
+3、iperf_client.lua:iperf客户端模块,引用网络初始化模块并连接到服务器进行测试;
+
+4、netdrv_eth_spi.lua:网络初始化模块,负责CH390网卡的初始化、SPI配置和DHCP获取;
+
+## 演示功能概述
+
+本项目演示如何使用Air8101核心板进行网络性能测试。通过修改后的代码,可以实现两台Air8101核心板通过路由器连接,进行网络吞吐量测试。
+
+1、支持以下功能特性:
+
+- 支持DHCP客户端模式,自动从路由器获取IP地址
+- 服务器模式和客户端模式分离,可在不同设备上运行
+- 增强的错误处理和超时机制
+- 清晰的日志输出,便于调试和监控
+- 带宽自动计算并以Mbps显示
+
+## 演示硬件环境
+
+![](https://docs.openluat.com/air8101/luatos/app/image/netdrv_multi.jpg)
+
+1、两台Air8101核心板
+
+2、一台路由器(支持DHCP功能)
+
+3、网线两根
+
+4、Air8101核心板和数据线的硬件接线方式为
+
+- Air8101核心板通过TYPE-C USB口供电;
+
+- 如果测试发现软件频繁重启,重启原因值为:poweron reason 0,可能是供电不足,此时再通过直流稳压电源对核心板的vbat管脚进行4V供电,或者5V管脚进行5V供电;
+
+- TYPE-C USB数据线直接插到核心板的TYPE-C USB座子,另外一端连接电脑USB口;
+
+5、AirETH_1000配件板一块,Air8101核心板和AirETH_1000配件板的硬件接线方式为:
+
+Air8101核心板通过TYPE-C USB口供电(核心板背面的功耗测试开关拨到OFF一端);
+如果测试发现软件重启,并且日志中出现  poweron reason 0,表示供电不足,此时再通过直流稳压电源对核心板的VIN管脚进行5V供电;
+
+| 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 固件](https://docs.openluat.com/air8101/luatos/firmware/)
+
+## 演示核心步骤
+
+1、搭建好硬件环境
+
+2、配置服务器端(一台核心板+AirETH_1000配件板)
+
+   a. 确保`main.lua`中已启用服务器模块,禁用客户端模块:
+   ```lua
+   -- 加载 iperf 服务器测试模块
+   require "iperf_server"
+
+   -- 加载 iperf 客户端测试模块
+   -- require "iperf_client"
+   ```
+
+   b. 烧录到一台Air8101核心板
+
+   c. 连接AirETH_1000配件板到路由器的LAN口
+
+   d. 启动核心板,系统会自动加载netdrv_eth_spi模块进行网络初始化,获取IP地址并启动iperf服务器
+
+3、配置客户端(另一台核心板+AirETH_1000配件板)
+
+   a. 修改`iperf_client.lua`文件中的服务器IP地址为服务器核心板的实际IP地址:
+
+   ```lua
+   -- 配置服务器IP地址(需要根据实际服务器IP进行修改)
+   local SERVER_IP = "192.168.1.3"  -- 这里需要修改为实际的服务器IP地址
+   ```
+
+   b. 确保`main.lua`中已启用客户端模块,禁用服务器模块:
+
+   ```lua
+   -- 加载 iperf 服务器测试模块
+   -- require "iperf_server"
+
+   -- 加载 iperf 客户端测试模块
+   require "iperf_client"
+   ```
+
+   c. 烧录到另一台Air8101核心板
+
+   d. 连接AirETH_1000配件板到路由器的LAN口
+
+   e. 启动核心板,系统会自动加载netdrv_eth_spi模块进行网络初始化,获取IP地址并尝试连接到服务器
+
+## 查看测试结果
+
+测试启动后,可以通过Luatools工具查看测试日志。客户端将显示实时的测试报告,包括数据量、持续时间和带宽(以Mbps为单位)。
+
+```lua
+2025-11-06 17:02:24.658][000000013.298] I/user.iperf测试 测试进行中...
+[2025-11-06 17:02:24.675][000000013.314] D/iperf iperf正常结束, type 1
+[2025-11-06 17:02:24.677][000000013.314] D/lwiperf iperf_free 88 c1d553c
+[2025-11-06 17:02:24.678][000000013.316] D/iperf report bytes 5989824 ms_duration 10002 bandwidth 4784 kbps
+[2025-11-06 17:02:24.680][000000013.317] I/user.iperf报告 数据量: 5989824 bytes, 持续时间: 10002 ms, 带宽: 0.04 Mbps
+```
+
+## 注意事项
+
+1、确保两台核心板和电脑都连接到同一个路由器,并且路由器已启用DHCP功能
+
+2、服务器的IP地址需要在客户端配置文件中正确设置,否则客户端将无法连接
+
+3、默认情况下,服务器在端口5001上监听连接请求
+
+4、测试默认持续2分钟后自动结束
+
+## 常见问题排查
+
+1、无法连接到服务器
+   - 确认服务器IP地址是否正确
+   - 检查两台设备是否在同一网段
+   - 检查网线连接是否牢固