yealink学习笔记20200320Android环境下iperf编译、wireless tools工具主要作用

   

wireless tools工具包

    iwconfig:设置基本无线参数
        iwlist:扫描、列出频率,比特率,密钥等
        iwspy:获取每个节点链接的质量(只能查阅与之相连的节点)
        iwpriv:操作Wireless Extensions 特定驱动
        ifrename: 基于各种静态标准命名接口


iperf源码的编译和利用Android.mk编译

 

首先下载源代码,下载地址:https://storage.googleapis.com/google-code-archive-source/v2/code.google.com/iperf/source-archive.zip

解压后删除 Makefile 等不相关的文件,并建立 Android.mk,内容如下:

Android.mk代码:

LOCAL_PATH := $(call my-dir)

# Device executable.
# =========================================================

include $(CLEAR_VARS)

LOCAL_MODULE := iperf

LOCAL_MODULE_PATH := $(TARGET_OUT_OPTIONAL_EXECUTABLES)

LOCAL_C_INCLUDES := $(LOCAL_PATH)/src

LOCAL_SRC_FILES := $(call all-c-files-under, src)

LOCAL_CFLAGS := -Wno-error -DIPERF_HOST=0

LOCAL_MODULE_TAGS := debug

LOCAL_FORCE_STATIC_EXECUTABLE := true

include $(BUILD_EXECUTABLE)


# Host executable.
# =========================================================

include $(CLEAR_VARS)

LOCAL_MODULE := iperf_x86

LOCAL_C_INCLUDES := $(LOCAL_PATH)/src

LOCAL_SRC_FILES := $(call all-c-files-under, src)

LOCAL_CFLAGS := -Wno-error -DIPERF_HOST=1

LOCAL_LDFLAGS := -static

LOCAL_MODULE_TAGS := debug

include $(BUILD_HOST_EXECUTABLE)


include $(call first-makefiles-under,$(LOCAL_PATH))

 

error: unused parameter 'argc' [-Werror,-Wunused-parameter]

main() 函数的 argc 参数没有使用,一般来说报个警告就可以了,为什么直接报成错误了呢?
后来仔细研究了生成的编译命令发现里面带了 -Werror 参数,这个参数会将 warning 转换为 error,强制要求程序编译期间不能出现警告。
为了解决这个问题,只需在 Android.mk 中指定 -Wno-error 参数即可:

LOCAL_CFLAGS := -Wno-error

 

接下来打开 src/flowlabel.h 文件,在 struct in6_flowlabel_req 结构体的定义外面加上条件编译指令,修改后如下所示:

// It's defined in bionic/libc/kernel/uapi/linux/in6.h
#if IPERF_HOST
struct in6_flowlabel_req
{
    struct in6_addr flr_dst;
    __u32   flr_label;
    __u8    flr_action;
    __u8    flr_share;
    __u16   flr_flags;
    __u16   flr_expires;
    __u16   flr_linger;
    __u32   __flr_pad;
    /* Options in format of IPV6_PKTOPTIONS */
};
#endif

IPERF_HOST 这个宏是我们在 Android.mk 里面定义的,因为编译 arm 版 iperf 时,编译参数中会指定 boinic 的库,这个宏会出现重定义的情况。但编译 x86 版本的 iperf 时,不会链接这些库,所以这个结构体必须由本程序来定义。

 

接下来打开 src/iperf_api.c 文件,找到 iperf_new_stream(struct iperf_test *, int) 函数,里面有这样的变量定义:

char template[] = "/tmp/iperf3.XXXXXX";

由于 Android 没有 /tmp 目录,所以运行的时候会报错,所以我们把这个目录修改为 /data 目录,修改后的代码如下:

#if IPERF_HOST
     char template[] = "/tmp/iperf3.XXXXXX";
#else
     char template[] = "/data/iperf3.XXXXXX";
#endif

接下来把 src/config.h.in 重命名为 src/config.h:

>$ mv src/config.h.in src/config.h

mm 编译后会生成两个文件,分别是 arm 版和 x86 版的可执行程序。

>$ mm
[ 33% 3/9] host Executable: iperf_x86 (out/host/linux-x86/obj/EXECUTABLES/iperf_x86_intermediates/iperf_x86)
[ 88% 8/9] target Strip (mini debug info): iperf (out/target/product/sdm660_64/obj/EXECUTABLES/iperf_intermediates/iperf)
prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin/aarch64-linux-android-nm: out/target/product/sdm660_64/symbols/system/xbin/iperf: no symbols
[100% 9/9] Install: out/target/product/sdm660_64/system/xbin/iperf

存放地址分别在:

out/host/linux-x86/obj/EXECUTABLES/iperf_x86_intermediates/iperf_x86

out/target/product/sdm660_64/obj/EXECUTABLES/iperf_intermediates/iperf

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值