Android使用iperf测试wifi吞吐量

大体上分为三个步骤

  1. 编译生成android端的可执行文件iperf
  2. 把该文件拷贝到/data/data/包名/iperf目录下
  3. 根据iperf命令执行该文件

第一部分,在android下编译生成iperf文件

1.获取需要编译的源代码:https://osdn.net/projects/sfnet_iperf/downloads/iperf-2.0.5.tar.gz/

2.将下载来的文件解压后放置到android/external目录下

3.在该android/external/iperf-2.0.5目录下创建Android.mk文件

LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS) LOCAL_SRC_FILES := compat/Thread.c \    compat/error.c \    compat/delay.cpp \    compat/gettimeofday.c \    compat/inet_ntop.c \    compat/inet_pton.c \    compat/signal.c \    compat/snprintf.c \    compat/string.c \    src/Client.cpp \    src/Extractor.c \    src/Launch.cpp \    src/List.cpp \    src/Listener.cpp \    src/Locale.c \    src/PerfSocket.cpp \    src/ReportCSV.c \    src/ReportDefault.c \    src/Reporter.c \    src/Server.cpp \    src/Settings.cpp \    src/SocketAddr.c \    src/main.cpp \    src/sockets.c \    src/stdio.c \    src/tcp_window_size.c \    src/gnu_getopt.c \    src/gnu_getopt_long.c \    src/service.cLOCAL_C_INCLUDES += \    $(LOCAL_PATH) \    $(LOCAL_PATH)/includeLOCAL_CFLAGS += -O2 LOCAL_CFLAGS += -DHAVE_CONFIG_HLOCAL_SHARED_LIBRARIES := libc libm libcutils libnetutils LOCAL_MODULE := iperfLOCAL_MODULE_TAGS := debuginclude $(BUILD_EXECUTABLE) 

4.4.生成需要的头文件

./configure --host=arm 

5.修改源码的头文件:

1. 把 compact/signal.c 里面的 #include "util.h"改成 #include "../include/util.h"2. 把 src/sockets.c 里面的 #include "util.h"改成 #include "../include/util.h"

6.在android目录下编译生成iperf

$source build/envsetup.sh$mmm external/iperf-2.0.5

7.会在out里面目录下生成一个iperf文件,这个文件就是要拷贝到/data/data…目录的文件

第二部分,copy iperf

 /*** 1. 拷贝iperf到该目录下*/private static final String IPERF_PATH = "/data/data/com.android.wifiiperf/iperf";public void copyiperf() {    File localfile;    Process p;    try {        localfile = new File(IPERF_PATH);        p = Runtime.getRuntime().exec("chmod 777 " + localfile.getAbsolutePath());        InputStream localInputStream = getAssets().open("iperf");        Log.i(TAG,"chmod 777 " + localfile.getAbsolutePath());        FileOutputStream localFileOutputStream = new FileOutputStream(localfile.getAbsolutePath());        FileChannel fc = localFileOutputStream.getChannel();        FileLock lock = fc.tryLock(); //给文件设置独占锁定        if (lock == null) {            Toast.makeText(this,"has been locked !",Toast.LENGTH_SHORT).show();            return;        } else {            FileOutputStream fos = new FileOutputStream(new File(IPERF_PATH));            byte[] buffer = new byte[1024];            int byteCount = 0;            while ((byteCount = localInputStream.read(buffer)) != -1) {// 循环从输入流读取                // buffer字节                fos.write(buffer, 0, byteCount);// 将读取的输入流写入到输出流                Log.i(TAG, "byteCount: "+byteCount);            }            fos.flush();// 刷新缓冲区            localInputStream.close();            fos.close();        }        //两次才能确保开启权限成功        p = Runtime.getRuntime().exec("chmod 777 " + localfile.getAbsolutePath());        lock.release();        p.destroy();        Log.i(TAG, "the iperf file is ready");    } catch (Exception e) {        e.printStackTrace();    }}

第三部分,执行iperf文件,其中CommandResult、CommandHelper和iperf文件在GitHub里面了。

/** * 2. 在Android应用中执行iperf命令 */private void sercomfun(final String cmd) {    Log.i(TAG, "sercomfun = " + cmd);    Thread lthread = new Thread(new Runnable() {        @Override        public void run() {            try {                String errorreply = "";                CommandHelper.DEFAULT_TIMEOUT = 150000;                CommandResult result = CommandHelper.exec(cmd);                if (result != null) {                    //start to connect the service                    if (result.getError() != null) {                        errorreply = result.getError();                        Message m = new Message();                        m.obj = errorreply;                        m.what = IPERF_ERROR;                        handler.sendMessage(m);                        Log.i(TAG,"Error:" + errorreply);                    }                    if (result.getOutput() != null) {                        iperfreply = getThroughput(result.getOutput());                        IPERF_OK = true;                        Message m = new Message();                        m.obj = iperfreply;                        m.what = IPERF_SCCESS;                        handler.sendMessage(m);                        Log.i(TAG,"Output:" + iperfreply);                    }                    Log.i(TAG,"result.getExitValue(): "+result.getExitValue());                }            } catch (Exception e) {                e.printStackTrace();            }        }    });    lthread.start();}

GitHub项目地址(包括wifi地址,信号),https://github.com/xhunmon/wifiIperf

更多相关文章

  1. 【Android 应用开发】Android资源文件 - 使用资源存储字符串 颜
  2. android 布局文件属性说明
  3. Android 属性文件build.prop,获取属性以及设置属性
  4. Android获取打开各种文件Intent汇总
  5. CMD命令创建、编译Android应用程序
  6. Android 使用PdfDocument生成PDF文件及遇到的问题
  7. android MTP 过滤指定的文件格式

随机推荐

  1. android 桌面快捷方式
  2. android各种分辨率和屏幕密度
  3. Android中Binder类代码(android-5.0.2)
  4. 史上最懒的android开发环境配置教程
  5. android service完全解析。
  6. android Vibrator 使用
  7. android broadcast intent
  8. android webview ERR_UNKNOWN_URL_SCHEME
  9. Android模拟、实现、触发系统按键事件的
  10. android中之断点续传