跳转至

25 iperf 吞吐量测试

作者:拓毅恒 | 最后修改:2026-04-09

一、iperf 概述

简介

iperf 是一种网络性能测试核心库,用于测量网络的最大带宽和网络吞吐量。它通过在客户端和服务器之间传输数据来测试网络的实际性能,可以提供详细的带宽报告、延迟统计等信息。

二、准备硬件环境

参考:Air780EPM/Air780EHM 硬件环境清单,准备好硬件环境。

2.1 两套 Air780EPM 开发板(Air780EPM 验证时使用)

2.2 两套 Air780EHM 核心板 + AirETH_1000 配件板

2.2.1 Air780EHM 核心板 +AirETH_1000 配件板的硬件接线方式

如上图所示,Air780EHM 核心板和 AirETH_1000 配件板的硬件接线方式为:

Air780EHM核心板
AirETH_1000配件板
3V3
3.3v
gnd
gnd
86/SPI0CLK
SCK
83/SPI0CS
CSS
84/SPI0MISO
SDO
85/SPI0MOSI
SDI
107/GPIO21
INT

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

2.4 一台电脑和两根网线

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

2.5 Type-C 接口的 USB 数据线

请准备两根用于连接 Air8000 核心板和 PC 电脑的 Type-C 接口的 USB 数据线。

USB 数据线的一端为 Type-C 接口,用于连接 Air8000 开发板;

USB 数据线的一端为 Type-A 接口,用于连接电脑。

通常,这种数据线的外观如下示意图所示:

三、准备软件环境

3.1 文章内容应用

在开始实践本示例之前,先筹备一下软件环境:

1. 烧录工具:Luatools 工具

2. 本demo开发测试时使用的固件为LuatOS-SoC_V2028_Air780EPM,本demo对固件版本没有什么特殊要求,所以你如果要测试本demo时,可以直接使用最新版本的内核固件Air780EPM固件Air780EHM固件;如果发现最新版本的内核固件测试有问题,可以使用我们开发本demo时使用的内核固件版本来对比测试;

3. 脚本文件:Air780EPM/demo/iperf / Air780EHM/demo/iperf

4. LuatOS 运行所需要的 lib 文件:使用 Luatools 烧录时,勾选 添加默认 lib 选项,使用默认 lib 脚本文件。

软件环境准备就绪后,即可开始烧录。EHM 与 EGH 核心板的烧录步骤完全一致,请参考 Air780EPM 开发板烧录指南Air780EGH 核心板烧录指南,将本文演示所需的项目文件烧录至 Air780EPM 开发板或 Air780EHM 核心板。

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 功能实现概述

本小节详细介绍 Air780EPM 开发板/Air780EHM 核心板上 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 = 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)

4.3 iperf 客户端模式

iperf 客户端模式允许设备作为客户端主动连接到服务器,用于测量网络上行方向的带宽性能。

4.3.1 功能定义

初始化以太网接口,配置网络参数,连接到指定的 iperf 服务器,进行带宽测试,并处理测试报告。

4.3.2 代码示例

-- 引入必要的模块
local exnetif = require "exnetif"

-- 配置服务器IP地址(需要根据实际服务器IP进行修改)
local SERVER_IP = "192.168.31.35"  -- 这里需要修改为实际的服务器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)

五、功能演示

5.1 iperf 服务器模式演示

使用 Luatools 将服务器模式代码烧录到 Air780EPM 开发板/Air780EHM 核心板

烧录完毕后,将核心板外挂 AirETH_1000 配件板连接到路由器的 LAN 口。设备启动后会初始化网络并启动 iperf 服务器,等待客户端连接。

日志中会显示服务器 IP 地址和启动状态:

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

5.2 iperf 客户端模式演示

使用 Luatools 将客户端模式代码烧录到另一台 Air780EPM 开发板/Air780EHM 核心板

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

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

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

5.3 完整测试场景演示

完整的测试场景需要两台 Air780EPM 开发板或两台 Air780EHM 核心板外挂 AirETH_1000 配件板通过路由器连接

测试步骤:

  1. 将服务器核心板烧录服务器模式代码并连接到路由器
  2. 记录服务器核心板的 IP 地址
  3. 修改客户端代码中的服务器 IP 地址
  4. 将客户端核心板烧录客户端模式代码并连接到路由器
  5. 同时观察两台设备的日志输出

测试完成后,可以在客户端日志中看到最终的带宽测试结果:

六、总结

本 demo 实现了使用 Air780EPM 开发板/Air780EHM 核心板通过外挂 AirETH_1000 配件板进行 iperf 网络性能测试的功能。通过服务器模式和客户端模式的配合使用,可以有效地测量网络的实际带宽和稳定性,为评估设备的网络通信能力提供重要参考。

七、常见问题

7.1 客户端无法连接服务器

问题:客户端无法连接到服务器,日志中显示连接失败。

解决方案

  • 确认两台设备都已成功获取 IP 地址
  • 检查服务器 IP 地址是否在客户端代码中正确设置
  • 确认两台设备连接在同一个路由器网络中