25 iperf 吞吐量测试
作者:拓毅恒 | 最后修改:2026-04-13
一、iperf 概述
简介
iperf 是一种网络性能测试核心库,用于测量网络的最大带宽和网络吞吐量。它通过在客户端和服务器之间传输数据来测试网络的实际性能,可以提供详细的带宽报告、延迟统计等信息。
二、准备硬件环境
参考:Air8000 硬件环境清单,准备好硬件环境。
2.1 两台 Air8000 整机开发板
Air8000 开发板提供了丰富的 GPIO 引脚资源,可通过开发板上的排针或排座进行连接和测试。

2.2 一台路由器(支持 DHCP 功能)

2.3 一台电脑和两根网线
电脑用于查看日志和监控,网线用于将设备连接到路由器组成同一局域网

2.4 Type-C 接口的 USB 数据线
请准备两根用于连接 Air8000 核心板和 PC 电脑的 Type-C 接口的 USB 数据线。
USB 数据线的一端为 Type-C 接口,用于连接 Air8000 开发板;
USB 数据线的一端为 Type-A 接口,用于连接电脑。
通常,这种数据线的外观如下示意图所示:

三、准备软件环境
3.1 文章内容应用
-
烧录工具:Luatools 工具
-
Air8000 烧录需要的固件:
本demo开发测试时使用的固件为Air8000 V2032 版本固件,本demo对固件版本没有什么特殊要求,所以你如果要测试本demo时,可以直接使用最新版本的内核固件;如果发现最新版本的内核固件测试有问题,可以使用我们开发本demo时使用的内核固件版本来对比测试;
-
Air8000 烧录需要脚本文件:https://gitee.com/openLuat/LuatOS/tree/master/module/Air8000/demo/iperf
-
LuatOS 运行所需要的 lib 文件:使用 Luatools 烧录时,勾选 添加默认 lib 选项,使用默认 lib 脚本文件。
准备好软件环境之后,接下来查看如何烧录项目文件到 Air8000 开发板中,将本篇文章中演示使用的项目文件烧录到 Air8000 开发板中。
3.2 API 介绍
这里仅介绍本篇文档所使用的 API,详情请查看:API - iperf
iperf.server(netType)
启动 iperf 服务器模式
iperf.client(netType, serverIp, serverPort)
启动 iperf 客户端模式并连接到指定服务器
iperf.abort()
中止正在进行的 iperf 测试
netdrv.setup(type, drv, param)
设置网络驱动参数
netdrv.dhcp(type, enable)
配置 DHCP 客户端
netdrv.ipv4(type, ip, mask, gw)
获取或设置 IPv4 地址信息
netdrv.link(type)
获取网络连接状态
四、iperf 功能实现概述
本小节详细介绍 Air8000 开发板上 iperf 网络性能测试各种功能的实现方法和核心代码逻辑。
4.1 主程序配置
主程序用于选择加载服务器模式或客户端模式,并提供基本的系统配置。
4.1.1 功能定义
配置项目信息,初始化系统组件,并选择加载 iperf 服务器或客户端模块。
4.1.2 代码示例
-- 定义项目信息
PROJECT = "IPERF_DEMO"
VERSION = "001.000.000"
-- 在日志中打印项目名和项目版本号
log.info("main", PROJECT, VERSION)
-- 初始化看门狗功能(如果支持)
if wdt then
wdt.init(9000)
sys.timerLoopStart(wdt.feed, 3000)
end
-- 选择加载服务器或客户端模块
-- 加载 iperf 服务器测试模块
require "iperf_server"
-- 加载 iperf 客户端测试模块
-- require "iperf_client"
-- 启动系统运行
-- sys.run()之后后面不要加任何语句
sys.run()
4.2 iperf 服务器模式
iperf 服务器模式允许设备作为服务器等待客户端连接,用于测量网络下行方向的带宽性能。
4.2.1 功能定义
初始化以太网接口,配置网络参数,启动 iperf 服务器,并处理客户端连接和测试报告。
4.2.2 代码示例
-- 引入必要的模块
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)
4.3 iperf 客户端模式
iperf 客户端模式允许设备作为客户端主动连接到服务器,用于测量网络上行方向的带宽性能。
4.3.1 功能定义
初始化以太网接口,配置网络参数,连接到指定的 iperf 服务器,进行带宽测试,并处理测试报告。
4.3.2 代码示例
-- 引入必要的模块
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)
五、功能演示
5.1 iperf 服务器模式演示
使用 Luatools 将服务器模式代码烧录到 Air8000 开发板

烧录完毕后,将开发板连接到路由器的 LAN 口。设备启动后会初始化网络并启动 iperf 服务器,等待客户端连接。
日志中会显示服务器 IP 地址和启动状态:

当有客户端连接后会自动开始 iperf 测试,测试完毕后会在测试报告中打印数据量、持续时间和带宽等参数:

5.2 iperf 客户端模式演示
使用 Luatools 将客户端模式代码烧录到另一台 Air8000 开发板

在烧录前,需要修改 iperf_client.lua 文件中的服务器 IP 地址为服务器开发板的实际 IP 地址:

烧录完成后,将客户端开发板也连接到路由器的 LAN 口。设备启动后会初始化网络并尝试连接到服务器。

连接成功后,客户端会开始进行带宽测试,测试完毕后会在测试报告中打印数据量、持续时间和带宽等参数:

5.3 完整测试场景演示
完整的测试场景需要两台 Air8000 开发板通过路由器连接
测试步骤:
- 将服务器开发板烧录服务器模式代码并连接到路由器
- 记录服务器开发板的 IP 地址
- 修改客户端代码中的服务器 IP 地址
- 将客户端开发板烧录客户端模式代码并连接到路由器
- 同时观察两台设备的日志输出
测试完成后,可以在客户端日志中看到最终的带宽测试结果:

六、总结
本 demo 实现了使用 Air8000 开发板通过 CH390 以太网模块进行 iperf 网络性能测试的功能。通过服务器模式和客户端模式的配合使用,可以有效地测量网络的实际带宽和稳定性,为评估设备的网络通信能力提供重要参考。
七、常见问题
7.1 客户端无法连接服务器
问题:客户端无法连接到服务器,日志中显示连接失败。
解决方案:
- 确认两台设备都已成功获取 IP 地址
- 检查服务器 IP 地址是否在客户端代码中正确设置
- 确认两台设备连接在同一个路由器网络中