简介: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>