Android 移植iperf3.13 测试网络

news2024/12/23 19:03:22

iperf,测试网络性能的,不同于 webrtc里面的gcc 算法预估网络带宽,iperf是实际占用网络来传输数据测量实际的网络性能。

官网:https://iperf.fr/
官方就有 android 的下载 https://iperf.fr/iperf-download.php#android, 但是看起来要访问 play.google. 墙。急用,怎么自己拿源码来ndk 编译一下。
1. 最适配的方式,应该是用 configure + make, configure来配置ndk编译器。 (ubuntu环境下) 没有环境,不想太折腾
2. 在AndroidStudio 上用cmake 编译
3. 还是用比较熟悉的 Android.mk , 在AS中编译
 

目录

一:下载源码

 二:AS 创建一个空的demo,src/main 目录下建一个jni, 把源码解压到这里, 然后编写 Android.mk 来编译。(如果直接使用ndk-build 命令,就不需要AS了。)

  在app 的build.gradle中手动指定Android.mk 文件位置,使用的ndk版本,以及要编译的平台

Android.mk

对源码需要做一点头文件的修改

1. 在src 中加上 iperf_config.h

2. src 目录下 version.h    同上,来源为version.h.in

3.修改源码里面一个 字符串,临时文件的路径

最后,build

1. 测试带宽

 2. 测试udp 丢包


一:下载源码

发布的只有3.1.3 iPerf - Download iPerf3 and original iPerf pre-compiled binaries

 二:AS 创建一个空的demo,src/main 目录下建一个jni, 把源码解压到这里, 然后编写 Android.mk 来编译。(如果直接使用ndk-build 命令,就不需要AS了。)


  在app 的build.gradle中手动指定Android.mk 文件位置,使用的ndk版本,以及要编译的平台

android {
    compileSdk 32

    defaultConfig {
        applicationId "com.example.iperf3"
        minSdk 23
        targetSdk 32
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"

// 平台指定
        ndk{
            abiFilters "arm64-v8a"
        }
    }
// ndk 版本指定(可不选,AS会根据gradle版本指定默认)
//    ndkVersion "22.0.7026061"
    ndkVersion '24.0.8215888'
//    ndkVersion "21.1.6352462"
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

// Android.mk 文件指定
    externalNativeBuild{
        ndkBuild{
            path file("src/main/jni/Android.mk")
        }
    }
}

Android.mk

LOCAL_PATH := $(call my-dir)

#-------------------iperf3-----
include $(CLEAR_VARS)
LOCAL_MODULE := iperf3
MY_SRC_PATH = iperf-3.1.3/src
LOCAL_C_INCLUDES := $(LOCAL_PATH)/$(MY_SRC_PATH)
#LOCAL_SRC_FILES := $(call all-c-files-under, iperf-3.1.3/src) 没效果??
LOCAL_SRC_FILES += $(MY_SRC_PATH)/cjson.c
LOCAL_SRC_FILES += $(MY_SRC_PATH)/iperf_api.c
LOCAL_SRC_FILES += $(MY_SRC_PATH)/iperf_client_api.c
LOCAL_SRC_FILES += $(MY_SRC_PATH)/iperf_error.c
LOCAL_SRC_FILES += $(MY_SRC_PATH)/iperf_locale.c
LOCAL_SRC_FILES += $(MY_SRC_PATH)/iperf_sctp.c
LOCAL_SRC_FILES += $(MY_SRC_PATH)/iperf_server_api.c
LOCAL_SRC_FILES += $(MY_SRC_PATH)/iperf_tcp.c
LOCAL_SRC_FILES += $(MY_SRC_PATH)/iperf_udp.c
LOCAL_SRC_FILES += $(MY_SRC_PATH)/iperf_util.c
LOCAL_SRC_FILES += $(MY_SRC_PATH)/main.c
LOCAL_SRC_FILES += $(MY_SRC_PATH)/net.c
#LOCAL_SRC_FILES += $(MY_SRC_PATH)/t_timer.c
#LOCAL_SRC_FILES += $(MY_SRC_PATH)/t_units.c
#LOCAL_SRC_FILES += $(MY_SRC_PATH)/t_uuid.c
LOCAL_SRC_FILES += $(MY_SRC_PATH)/tcp_info.c
LOCAL_SRC_FILES += $(MY_SRC_PATH)/tcp_window_size.c
LOCAL_SRC_FILES += $(MY_SRC_PATH)/timer.c
LOCAL_SRC_FILES += $(MY_SRC_PATH)/units.c

LOCAL_LDFLAGS += -pie -fPIE
include $(BUILD_EXECUTABLE)
#include $(BUILD_STATIC_LIBRARY)

对源码需要做一点头文件的修改

本来这些头文件是 configure 命令自动添加上去的,我们没有configure,需要自己动手补上。

1. 在src 中加上 iperf_config.h

(来源是源码中的 iperf_config.h.in,  configure命令以这个为输入,定义了一些宏, 不确定的话,直接把这个iperf3搞到ubuntu上,运行一下./configure  可以得到一版,然参考修改) 可直接参考:
iperf_config.h

/* src/iperf_config.h.in.  Generated from configure.ac by autoheader.  */

/* Define to 1 if you have the `cpuset_setaffinity' function. */
#undef HAVE_CPUSET_SETAFFINITY

/* Have CPU affinity support. */
#undef HAVE_CPU_AFFINITY

/* Define to 1 if you have the <dlfcn.h> header file. */
#undef HAVE_DLFCN_H

/* Have IPv6 flowlabel support. */
#undef HAVE_FLOWLABEL

/* Define to 1 if you have the <inttypes.h> header file. */
#undef HAVE_INTTYPES_H

/* Define to 1 if you have the <memory.h> header file. */
#undef HAVE_MEMORY_H

/* Define to 1 if you have the <netinet/sctp.h> header file. */
#undef HAVE_NETINET_SCTP_H

/* Define to 1 if you have the `sched_setaffinity' function. */
#undef HAVE_SCHED_SETAFFINITY

/* Have SCTP support. */
#undef HAVE_SCTP

/* Define to 1 if you have the `sendfile' function. */
#undef HAVE_SENDFILE

/* Have SO_MAX_PACING_RATE sockopt. */
#undef HAVE_SO_MAX_PACING_RATE

/* Define to 1 if you have the <stdint.h> header file. */
#undef HAVE_STDINT_H

/* Define to 1 if you have the <stdlib.h> header file. */
#undef HAVE_STDLIB_H

/* Define to 1 if you have the <strings.h> header file. */
#undef HAVE_STRINGS_H

/* Define to 1 if you have the <string.h> header file. */
#undef HAVE_STRING_H

/* Define to 1 if the system has the type `struct sctp_assoc_value'. */
#undef HAVE_STRUCT_SCTP_ASSOC_VALUE

/* Define to 1 if you have the <sys/socket.h> header file. */
#undef HAVE_SYS_SOCKET_H

/* Define to 1 if you have the <sys/stat.h> header file. */
#undef HAVE_SYS_STAT_H

/* Define to 1 if you have the <sys/types.h> header file. */
#undef HAVE_SYS_TYPES_H

/* Have TCP_CONGESTION sockopt. */
#undef HAVE_TCP_CONGESTION

/* Define to 1 if you have the <unistd.h> header file. */
#undef HAVE_UNISTD_H

/* Define to the sub-directory where libtool stores uninstalled libraries. */
#undef LT_OBJDIR

/* Name of package */
#define PACKAGE "iperf"

/* Define to the address where bug reports for this package should be sent. */
#define PACKAGE_BUGREPORT "https://github.com/esnet/iperf"

/* Define to the full name of this package. */
#define PACKAGE_NAME "iperf"

/* Define to the full name and version of this package. */
#define PACKAGE_STRING "iperf 3.1.3"

/* Define to the one symbol short name of this package. */
#define PACKAGE_TARNAME "iperf"

/* Define to the home page for this package. */
#define PACKAGE_URL "http://software.es.net/iperf/"

/* Define to the version of this package. */
#define PACKAGE_VERSION "3.1.3"

/* Define to 1 if you have the ANSI C header files. */
#define STDC_HEADERS 1

/* Version number of package */
#define VERSION "3.1.3"


2. src 目录下 version.h    同上,来源为version.h.in
 

/*
 * iperf, Copyright (c) 2014, The Regents of the University of
 * California, through Lawrence Berkeley National Laboratory (subject
 * to receipt of any required approvals from the U.S. Dept. of
 * Energy).  All rights reserved.
 *
 * If you have questions about your rights to use or distribute this
 * software, please contact Berkeley Lab's Technology Transfer
 * Department at TTD@lbl.gov.
 *
 * NOTICE.  This software is owned by the U.S. Department of Energy.
 * As such, the U.S. Government has been granted for itself and others
 * acting on its behalf a paid-up, nonexclusive, irrevocable,
 * worldwide license in the Software to reproduce, prepare derivative
 * works, and perform publicly and display publicly.  Beginning five
 * (5) years after the date permission to assert copyright is obtained
 * from the U.S. Department of Energy, and subject to any subsequent
 * five (5) year renewals, the U.S. Government is granted for itself
 * and others acting on its behalf a paid-up, nonexclusive,
 * irrevocable, worldwide license in the Software to reproduce,
 * prepare derivative works, distribute copies to the public, perform
 * publicly and display publicly, and to permit others to do so.
 *
 * This code is distributed under a BSD style license, see the LICENSE
 * file for complete information.
 */
#define IPERF_VERSION "3.1.3"

3.修改源码里面一个 字符串,临时文件的路径

iperf_aip.c::

 /tmp/ 这个是linux路径,android 上没有,直接改为 /data/ 或者就是当前运行目录。

最后,build

在app\build\intermediates\ndkBuild\debug\obj\local\arm64-v8a  得到可执行文件, push 到/data/xx上去运行。

附上测试命令:

1. 测试带宽

服务端:#iperf3 -s -p 5001
                -s 表示作为服务端, -p 指定端口号

        
客户端:#iperf3 -c 127.0.0.1(服务器IP) -P 4 -t 30 -i 2 -p 5001
                -c 表示作为客户端, 后面跟服务端ip,  -P (大写) 表示process, 同时并发任务数,这里是4,  -t 表示测试持续时间,单位秒。   -i 表示每隔2秒报一次结果。  -p 端口号

 2. 测试udp 丢包

(udp无连接,发快网络带宽不够导致丢包,所以测udp在限制带宽的情况下丢包率)
服务端:#iperf3 -s -p 5001
客户端:
 #iperf3 -u -c 192.168.43.129 -p 8989 -b 100M -t 30
                -u 指定使用udp, -c 表示作为客户端   -b 限制在100Mbit 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/74054.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

绕线机算法模型(Simulink仿真验证+PLC代码实现)

绕线机应用的详细内容大家可以参看下面这篇博客,这里不再赘述。本文主要借助Simulink仿真分析和解决工程实际问题。希望对大家学习Simulink有所帮助。限于水平和能力所限,文中难免出现错误和不足之处,诚恳的希望大家批评和指正。 S7-200 SMART PLC和V20变频器绕线机控制应用…

Linux(在 Linux 上搭建 java 部署环境(安装jdk/tomcat/mysql) + 将程序部署到云服务器上的操作)

目录 &#x1f432; 1. 在 Linux 上搭建 java 部署环境 &#x1f984; 1.1 安装 jdk &#x1f984; 1.2 安装 tomcat &#x1f984; 1.3 安装 mysql &#x1f432; 2. 将[博客系统]部署到云服务器上 &#x1f984; 2.1 先在云服务器上,创建和之前 windows 上一样的数据库…

德勤、阿里为数据智能时代造势,是风口还是韭菜?

前不久&#xff0c;德勤和阿里高调发布了业内首个DAAS报告《DAAS数字化新世代的最优解》&#xff0c;强调“企业不应该继续将数据智能建设当作‘选择题’&#xff0c;而是一道‘必答题’&#xff01;” 德勤管理咨询中国首席执行官戴耀华&#xff08;右&#xff09;与阿里巴巴集…

自学编程技术如何选择书籍?

首先自学编程的话&#xff0c;也是要先确定要选择适合自己的编程语言。然后再购买相应的编程教材&#xff0c;不知道怎么选择的话&#xff0c;可以直接选择黑马的原创书籍。 《C语言开发基础》 内容简介 本书是对《C语言开发入门教程》一书的全新改版&#xff0c;本次改版结合…

智能驾驶穿越“寒冬”:Argo AI们倒下,复睿智行们崛起

作者 | 曾响铃 文 | 响铃说&#xff08;xiangling0815&#xff09; 寒气还在智能驾驶领域蔓延。 在过去的一段时间&#xff0c;裁员、倒闭、破产、市值下跌、巨头撤离等等一系列不好的消息在智能驾驶行业频频爆出&#xff0c;一批老牌的智能驾驶企业更是倒在了黎明前。 智能…

OpenCV实战——实现高效图像扫描循环

OpenCV实战——实现高效图像扫描循环0. 前言1. 测量代码运行时间2. 计算不同扫描算法的执行时间4. 完整代码及运行结果相关链接0. 前言 在《像素操作》一节中&#xff0c;我们介绍了扫描图像以处理其像素的不同方法。在本节中&#xff0c;我们将学习比较这些方法的计算效率。编…

Linux篇 一、香橙派Zero2设置开机连接wifi

香橙派Zero2系列文章目录 一、香橙派Zero2设置开机连接wifi 文章目录香橙派Zero2系列文章目录前言一、调试串口的连接说明二、WIFI 连接测试1.首先使用 nmcli dev wifi 命令扫描周围的 WIFI 热点2.找到自己的wifi&#xff0c;准备好wifi名称和密码三、设置开机连接WiFi总结前言…

【MySQL】第10章_创建和管理表

创建和管理表1. 基础知识1.1 一条数据存储的过程1.2 标识符命名规则1.3 MySQL中的数据类型2. 创建和管理数据库2.1 创建数据库2.2 使用数据库查看当前所有的数据库查看当前正在使用的数据库查看指定库下所有的表查看数据库的创建信息使用/切换数据库2.3 修改数据库更改数据库字…

RadZen 最新注册版,2022年末圣诞-happy

RadZen快速简单地生成业务 Web 应用程序&#xff0c;以可视化方式构建和启动 Web 程序&#xff0c;而我们会为您创建新代码。 从信息开始 连接到数据库。Radzen 推断您的信息并生成功能完备的 Web 应用程序。支持 MSSQL REST 服务。 微调添加页面或编辑生成的页面。通过预览您…

vue使用高德地图,marker低于1000,滑动卡顿问题的探究(已解决)

问题描述 vue使用高德地图点标记&#xff0c;刚开始使用的是Marker&#xff0c;但是数目超过300&#xff0c;滑动就卡顿&#xff0c;按文档来说&#xff0c;Marker 类型推荐在数据量为 500 以内时使用&#xff0c;不应该卡顿。后边就开始对这个bug进行两天脑秃的探究了 1.换成…

pytorch-天气识别

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f366; 参考文章地址&#xff1a; 365天深度学习训练营-第P3周&#xff1a;天气识别&#x1f356; 作者&#xff1a;K同学啊一、前期准备 1.设置GPU import torch import torch.nn as nn impor…

MAC苹果系统安装数字证书的方法

MAC苹果系统安装数字证书的方法之工具/原料 Mac OS电脑一台 数字证书 先讲讲安装方法,mac系统默认浏览器是Safari,那小D在这里就以Safari浏览器为例子,讲解一下相关的安装方法 如果已有开通了数字证书的用户,在重装了系统或是在没有安装安装证书的电脑上进行付款时,会提…

【ELM回归预测】基于非洲秃鹫算法优化极限学习机预测附matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

FL Studio水果21版本助力原创音乐人(中文完整版All Plugins)

最近&#xff0c;网上算是“风言风语”吧&#xff0c;关于FL Studio是否出21版的说法各异。首先呢&#xff0c;这里先肯定一点&#xff0c;FL Studio即将出FL Studio 21版本&#xff0c;但是正式版已经出来。希望大家不要被网上一些所谓冒充发布的FL Studio21正式版所骗&#x…

信息系统分析与设计:摊位管理信息系统

摊位管理信息系统的分析与设计 1 市场分析 1.1 地摊经济发展背景 1.2 地摊经济逐渐复苏 1.3 地摊经济的放管服 2 目标市场定位 2.1 普通城市居民 2.2 政府相关管理部门 3 系统主要介绍 3.1 系统创新描述 3.2 主要搭建流程 3.3 主要业务模块 3.4 业务流程图 3.5 组…

Vue学习笔记--第二章(尚硅谷学习视频总结)

第二章 Vue组件化编程第二章 Vue组件化编程2.1. 模块与组件、模块化与组件化2.1.1. 模块2.1.2. 组件2.1.3. 模块化2.1.4. 组件化2.2. 非单文件组件2.2.1. 基本使用2.2.2. 组件注意事项2.2.3. 组件的嵌套2.2.4. VueComponent2.2.5. 一个重要的内置关系2.3. 单文件组件第二章 Vue…

【C#基础学习】第十七章、数组

目录 数组 1.数组的类型 1.1 一维数组和矩形数组 1.1.1实例化一维数组和矩形数组 1.2 访问数组元素 1.3 初始化数组 1.3.1 显式初始化一维数组 1.3.2 显式初始化矩形数组 1.3.3 显式初始化的快捷语法 1.3.4 隐式类型数组 1.4 交错数组 1.4.1 声明交错数组 1.4.2 实例…

bump map(凹凸贴图)的一个简单生成方法

用于渲染物体表面&#xff0c;增加真实感的bump map(凹凸贴图)的一个简单生成方法。 1. 在 Perlin Noise Map Generator - OpenProcessing 生成一个perlin noise map&#xff0c; 点击代码按钮&#xff0c;修改生成图像的分辨率 点击 paly 按钮&#xff0c;设置参数&#xf…

学习笔记-3-SVM-10-SVR

细节内容请关注微信公众号&#xff1a;运筹优化与数据科学 ID: pomelo_tree_opt outline 1. Linear regression 2. Support vector regression 3. SVR vs. SVM 4. Linear SVR 5. Kernel SVR ------------------------------------ 1. Linear regression OR里最常使用的…

【从零开始学习深度学习】15. Pytorch实战Kaggle比赛:房价预测案例【含数据集与源码】

基于之前学习的内容&#xff0c;让我们动手实战一个Kaggle比赛的&#xff1a;房价预测实战案例。Kaggle是一个著名的供机器学习爱好者交流的平台&#xff0c;该房价预测实战网址&#xff1a;https://www.kaggle.com/competitions/house-prices-advanced-regression-techniques …