Android平台移植Net-Snmp小记

简介:SNMP(Simple Network Management Protocol,简单网络管理协议),Net-SNMP是一个免费的、开放源码的SNMP实现,以前称为UCD-SNMP。它包括agent和多个管理工具的源代码,支持多种扩展方式。

1.准备原材料,下载ndk,net-snmp源码

下载源码包

配置好NDK环境变量 .bashrc添加

export NDK_10C_PATH=$TOOLS/ndk/android-ndk-r10c

2.编写Makefile和Android.mk文件

编写net-snmp bulid.mk文件

  • 设置NDK环境,交叉编译工具链

WORK_DIR:=$(shell pwd)
OUT_DIR :=$(WORK_DIR)/../out

NDKPATH := $(NDK_10C_PATH)
PLATFORM:= $(NDKPATH)/platforms/android-21/arch-arm
TOOLS_VER := $(NDKPATH)/toolchains/arm-linux-androideabi-4.8
PREBUILT:=  $(TOOLS_VER)/prebuilt/linux-x86/bin

CROSS   :=  $(PREBUILT)/arm-linux-androideabi-
AS      :=  $(CROSS)as  
LD      :=  $(CROSS)ld  
CC      :=  $(CROSS)gcc  
CPP     :=  $(CROSS)g++   
AR      :=  $(CROSS)ar  
NM      :=  $(CROSS)nm  
STRIP   :=  $(CROSS)strip  
OBJCOPY :=  $(CROSS)objcopy  
OBJDUMP :=  $(CROSS)objdump  

TAR_BIN :=  $(OUT_DIR)/system/bin
TAR_LIB :=  $(OUT_DIR)/system/lib
TAR_ETC :=  $(OUT_DIR)/system/etc
PREFIX  :=  /system
CPU     :=  armv7-a
  • 设置编译和链接的相关标志位,在configure阶段会传入这些标志

CFLAGS  +=  --sysroot=$(PLATFORM) -fno-strict-aliasing -fpic -fno-strict-aliasing \
            -Wno-traditional -DANDROID -ggdb -O2 -pipe -mfloat-abi=softfp \
            -mfpu=neon -marm -march=$(CPU) -mtune=cortex-a9  
    
LDFLAGS :=  -Wl,-Bdynamic  -Wl,-dynamic-linker,/system/bin/linker  \
            -L$(PLATFORM)/usr/lib -Wl,-rpath-link=$(PLATFORM)/usr/lib \
			-lc -lstdc++ -lm -lgcc 
  • 设置编译进系统的MIBS,管理信息库(MIB,Management Information Base)是TCP/IP网络管理协议标准框架的内容之一,MIB定义了受管设备必须保存的数据项、允许对每个数据项进行的操作及其含义,即管理系统可访问的受管设备的控制和状态信息等数据变量都保存在MIB中。

MIBS    =   host agentx smux ucd-snmp/diskio tcp-mib udp-mib \
            mibII/mta_sendmail ip-mib/ipv4InterfaceTable \
            ip-mib/ipAddressPrefixTable/ipAddressPrefixTable \
            ip-mib/ipDefaultRouterTable/ipDefaultRouterTable \
            ip-mib/ipv6ScopeZoneIndexTable ip-mib/ipIfStatsTable \
            ip-mib/ipv6InterfaceTable sctp-mib  
  • 设置配置属性,configure成功后会生成Makefile文件,和一些由宏包含的头文件
cfg: 
	./configure \
			--prefix=$(PREFIX) \
            --build=x86_64-linux \
            --host=arm-linux \
            --target=arm-linux-androideabi \
            --with-ldflags="$(LDFLAGS)" \
            --disable-ipv6 \
            --with-endianness=little \
            --with-cflags="$(CFLAGS)" \
            --with-cc="$(CC)"  \
            --with-linkcc="$(CC)"  \
            --with-ar="$(AR)" \
            --with-agentx-socket="/system/usr/share" \
            --disable-manuals \
            --enable-as-needed \
            --enable-ucd-snmp-compatibility \
            --disable-embedded-perl \
            --without-perl-modules \
            --disable-scripts \
            --with-mib-modules="$(MIBS)" \
            --enable-shared \
            --with-default-snmp-version="2" \
            --with-sys-contact="thtfit@thtfit.com" \
            --with-sys-location="Unknow" \
            --with-logfile="/system/log/snmpd.log"  \
            --with-persistent-directory="/system/net-snmp" \
			--sysconfdir="/system/etc"
  • 其他目标,拷贝清除操作

mk:  
	make -j
	@echo -e "\e[0;32;1m Compiles snmp successfully ! \e[0m"

Install: 
	make install DESTDIR=$(WORK_DIR)/temp
	$(call CopyStripFile,$(WORK_DIR)/agent/.libs/snmpd,$(TAR_BIN)/snmpd)
	$(call CopyStripFile,$(WORK_DIR)/apps/.libs/snmpget,$(TAR_BIN)/snmpget)
	$(call CopyStripFile,$(WORK_DIR)/apps/.libs/snmpset,$(TAR_BIN)/snmpset)
	$(call CopyFile,$(WORK_DIR)/agent/.libs/libnetsnmpagent.so,$(TAR_LIB)/libnetsnmpagent.so)
	$(call CopyFile,$(WORK_DIR)/agent/.libs/libnetsnmpagent.so.30,$(TAR_LIB)/libnetsnmpagent.so.30)
	$(call CopyStripFile,$(WORK_DIR)/agent/.libs/libnetsnmpagent.so.30.0.3,$(TAR_LIB)/libnetsnmpagent.so.30.0.3)  
	$(call CopyFile,$(WORK_DIR)/agent/helpers/.libs/libnetsnmphelpers.so,$(TAR_LIB)/libnetsnmphelpers.so)
	$(call CopyFile,$(WORK_DIR)/agent/helpers/.libs/libnetsnmphelpers.so.30,$(TAR_LIB)/libnetsnmphelpers.so.30)
	$(call CopyStripFile,$(WORK_DIR)/agent/helpers/.libs/libnetsnmphelpers.so.30.0.3,$(TAR_LIB)/libnetsnmphelpers.so.30.0.3)
	$(call CopyFile,$(WORK_DIR)/agent/.libs/libnetsnmpmibs.so,$(TAR_LIB)/libnetsnmpmibs.so)
	$(call CopyFile,$(WORK_DIR)/agent/.libs/libnetsnmpmibs.so.30,$(TAR_LIB)/libnetsnmpmibs.so.30)
	$(call CopyStripFile,$(WORK_DIR)/agent/.libs/libnetsnmpmibs.so.30.0.3,$(TAR_LIB)/libnetsnmpmibs.so.30.0.3)
	$(call CopyFile,$(WORK_DIR)/snmplib/.libs/libnetsnmp.so,$(TAR_LIB)/libnetsnmp.so)
	$(call CopyFile,$(WORK_DIR)/snmplib/.libs/libnetsnmp.so.30,$(TAR_LIB)/libnetsnmp.so.30)
	$(call CopyStripFile,$(WORK_DIR)/snmplib/.libs/libnetsnmp.so.30.0.3,$(TAR_LIB)/libnetsnmp.so.30.0.3)
	$(call CopyFile,$(WORK_DIR)/apps/.libs/libnetsnmptrapd.so,$(TAR_LIB)/libnetsnmptrapd.so)
	$(call CopyFile,$(WORK_DIR)/apps/.libs/libnetsnmptrapd.so.30,$(TAR_LIB)/libnetsnmptrapd.so.30)
	$(call CopyStripFile,$(WORK_DIR)/apps/.libs/libnetsnmptrapd.so.30.0.3,$(TAR_LIB)/libnetsnmptrapd.so.30.0.3)
	$(call CopyFile,$(WORK_DIR)/snmplib/.libs/libsnmp.so,$(TAR_LIB)/libsnmp.so)
	$(call CopyFile,$(WORK_DIR)/snmplib/.libs/libsnmp.so.30,$(TAR_LIB)/libsnmp.so.30)
	$(call CopyStripFile,$(WORK_DIR)/snmplib/.libs/libsnmp.so.30.0.3,$(TAR_LIB)/libsnmp.so.30.0.3)
	$(call CopyFile,$(WORK_DIR)/snmpd.conf,$(TAR_ETC)/snmp/snmpd.conf)
	$(call CopyDir,$(WORK_DIR)/temp/system/share/snmp/mibs,$(OUT_DIR)/system/share/snmp)
	@echo -e "\e[0;32;1m Files copy successfully ! \e[0m"

clean:
	make clean

distclean:
	make distclean
	rm $(OUT_DIR) -rf
	rm $(WORK_DIR)/temp -rf

  • 几个方便的拷贝函数

define CopyFile
    @ \
    SrcFile="$(1)"; \
    DstFile="$(2)"; \
    SRC_FILE=$${SrcFile}; \
    DST_FILE=$${DstFile}; \
    RedDenote='\e[0;31;1m'; \
    GreenDenote='\e[0;32;1m'; \
    NoColorDenote='\e[0m'; \
    if [ ! -e "$${SRC_FILE}" ]; then \
        echo -en "$${RedDenote}"; \
        echo "$${SRC_FILE} does not exist."; \
        echo -en "$${NoColorDenote}"; \
        exit 1; \
    fi; \
    if [ -f "$${SRC_FILE}" ] && ([ ! -e "$${DST_FILE}" ] || [ "$${SRC_FILE}" -nt "$${DST_FILE}" ] || [ "$${SRC_FILE}" -ot "$${DST_FILE}" ]); then \
        DstDir=`dirname "$${DST_FILE}"`; \
        ProcessExitCode=$$?;    \
        if [ $${ProcessExitCode} -ne 0 ]; then  \
           exit 1; \
        fi; \
        if [ ! -d "$${DstDir}" ]; then \
            mkdir -p $${DstDir}; \
            ProcessExitCode=$$?;    \
            if [ $${ProcessExitCode} -ne 0 ]; then  \
                exit 1; \
            fi; \
        fi; \
        cp -fa "$${SRC_FILE}" $${DST_FILE}; \
        ProcessExitCode=$$?;    \
        if [ $${ProcessExitCode} -ne 0 ]; then  \
            exit 1; \
        fi; \
    fi;
endef

define CopyStripFile
    @ \
	SrcFile="$(1)"; \
	DstFile="$(2)"; \
    SRC_FILE=$${SrcFile}; \
    DST_FILE=$${DstFile}; \
	RedDenote='\e[0;31;1m'; \
	GreenDenote='\e[0;32;1m'; \
	NoColorDenote='\e[0m'; \
    if [ ! -e "$${SRC_FILE}" ]; then \
    	echo -en "$${RedDenote}"; \
    	echo "$${SRC_FILE} does not exist."; \
    	echo -en "$${NoColorDenote}"; \
        exit 1; \
    fi; \
    if [ -f "$${SRC_FILE}" ] && ([ ! -e "$${DST_FILE}" ] || [ "$${SRC_FILE}" -nt "$${DST_FILE}" ] || [ "$${SRC_FILE}" -ot "$${DST_FILE}" ]); then \
        DstDir=`dirname "$${DST_FILE}"`; \
        ProcessExitCode=$$?;    \
        if [ $${ProcessExitCode} -ne 0 ]; then  \
           exit 1; \
        fi; \
        if [ ! -d "$${DstDir}" ]; then \
            mkdir -p $${DstDir}; \
            ProcessExitCode=$$?;    \
            if [ $${ProcessExitCode} -ne 0 ]; then  \
                exit 1; \
            fi; \
        fi; \
        cp -fa "$${SRC_FILE}" $${DST_FILE}; \
        ProcessExitCode=$$?;    \
        if [ $${ProcessExitCode} -ne 0 ]; then  \
            exit 1; \
        fi; \
        echo "Target strip: $${DST_FILE}";  \
        $(STRIP) --strip-debug $${DST_FILE};    \
        ProcessExitCode=$$?;    \
        if [ $${ProcessExitCode} -ne 0 ]; then  \
            exit 1; \
        fi; \
    fi;
endef

define CopyDir
    @ \
    SrcDir="$(1)"; \
    DstDir="$(2)"; \
    SRC_DIR=$${SrcDir}; \
    DST_DIR=$${DstDir}; \
    RedDenote='\e[0;31;1m'; \
    GreenDenote='\e[0;32;1m'; \
    NoColorDenote='\e[0m'; \
    if [ ! -e "$${SRC_DIR}" ]; then \
        echo -en "$${RedDenote}"; \
        echo "$${SRC_DIR} does not exist."; \
        echo -en "$${NoColorDenote}"; \
        exit 1; \
    fi; \
    if [ -d "$${SRC_DIR}" ] && ([ ! -e "$${DST_DIR}" ] || [ "$${SRC_DIR}" -nt "$${DST_DIR}" ] || [ "$${SRC_DIR}" -ot "$${DST_DIR}" ]); then \
        if [ ! -d "$${DstDir}" ]; then \
            mkdir -p $${DstDir}; \
            ProcessExitCode=$$?;    \
            if [ $${ProcessExitCode} -ne 0 ]; then  \
                exit 1; \
            fi; \
        fi; \
        cp -rfa "$${SRC_DIR}" $${DST_DIR}; \
        ProcessExitCode=$$?;    \
        if [ $${ProcessExitCode} -ne 0 ]; then  \
            exit 1; \
        fi; \
    fi;
endef

net-snmp build.mk基本就编写玩了,最终会生成一个out目录,里面包含所有的目标文件。

编写Client Android.mk,融入我们自己的MIB文件

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE_TAGS := optional

LOCAL_MODULE := libSnmpAgent

LOCAL_C_INCLUDES := \
	$(JNI_H_INCLUDE)\
	$(LOCAL_PATH)/include \
	$(LOCAL_PATH)/linuxBase/include 

LOCAL_SRC_FILES:= \
    subagent.cpp \
    ISnmpClient.cpp \
    SnmpClientApi.cpp \
    data_access/network.cpp \
    data_access/system.cpp \
    data_access/gpio.cpp \
    data_access/player.cpp \
    data_access/monitor.cpp \
    data_access/media.cpp \
    data_access/tuner.cpp\
    fileListing/fileListingTable.cpp \
    fileListing/fileListingTable_data_access.cpp \
    fileListing/fileListingTable_data_get.cpp \
    fileListing/fileListingTable_data_set.cpp \
    fileListing/fileListingTable_interface.cpp\
    channelTable/channelTable.cpp \
    channelTable/channelTable_data_access.cpp \
    channelTable/channelTable_data_get.cpp \
    channelTable/channelTable_data_set.cpp \
    channelTable/channelTable_interface.cpp\
    traps.cpp

LOCAL_SHARED_LIBRARIES :=\
    libutils liblog \
    libcutils libbinder\
	libnetsnmp \
	libnetsnmpmibs \
	libnetsnmpagent \
	libnetsnmphelpers
include $(BUILD_SHARED_LIBRARY) 

include $(CLEAR_VARS)

LOCAL_PREBUILT_LIBS:=\
	libnetsnmp:libs/armeabi/libnetsnmp.so\
	libnetsnmpmibs:libs/armeabi/libnetsnmpmibs.so\
    libnetsnmpagent:libs/armeabi/libnetsnmpagent.so\
    libnetsnmphelpers:libs/armeabi/libnetsnmphelpers.so
include $(BUILD_MULTI_PREBUILT)</span>

编写Server Android.mk

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE_TAGS := optional

LOCAL_MODULE := libSnmpServer

LOCAL_C_INCLUDES := \
	$(JNI_H_INCLUDE)

LOCAL_SRC_FILES:= \
	ISnmpService.cpp \
	snmpServer.cpp \
	snmpJNI.cpp

LOCAL_SHARED_LIBRARIES :=\
    libutils liblog \
    libcutils libbinder

include $(BUILD_SHARED_LIBRARY) </span>


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值