[转载请注明出处,做者:张洪耿,patrick_zhg@hotmail.com]
讨论采用开放源码的UCD-SNMP 4.2.1软件包开发本身的SNMP Agent,不涉及SNMP协议包的组包、解析等问题。本文从如下部分进行介绍:
一:UCD-SNMP 4.2.1简介及SNMP Agent开发步骤
二:MIB库模块设计及代码转换
三:SNMP Agent功能扩展方式
四:uCLinux系统上SNMP Agent的实现
五:建立SNMP Agent配置文件snmpd.conf
一:UCD-SNMP 4.2.1简介及SNMP Agent开发步骤
UCD-SNMP 4.2.1开源软件包支持SNMPv1 (RFCs 1155-1157)、SNMPv2c(RFCs 1901-1908)、SNMPv3 (RFCs 2271-2275)三种SNMP协议版本,其由如下内容组成:
可扩展的SNMP Agent程序(snmpd);
SNMP Agent和管理程序开发库;
用于检索或设置SNMP Agent端变量的工具程序(snmpget, snmpset, snmptable, snmpwalk等);
用于生成或处理SNMP陷阱的工具程序(snmptrapd和snmptrap);
基于Tk/perl的MIB浏览器(tkmib)
SNMP Agent的开发通常采用如下步骤:
MIB库模块设计。
MIB库模块转换为C语言代码。
转换后的C语言代码添加到UCD-SNMP源码包,实现SNMP Agent的功能扩展。
二:MIB库模块设计及代码转换
在SNMPAgent开发中,首先要定义出MIB库模块,这样,SNMP管理端软件才能经过该MIB库模块实现对相应设备的管理。MIB库模块定义的语法,能够参照SNMP 协议中的SMI描述部分,本文使用MG-SOFT公司的“Visual MIBBuilder”可视化设计软件完成MIB库模块的定义。MIB库模块定义后,须要在代理程序中增长与所定义的MIB库模块相对应的源代码,这里就要使用MIB2C工具程序把MIB库模块文件转换成C源代码。
MIB2C是UCD-SNMP 4.2.1软件包中的工具程序,该工具程序须要SNMPperl扩展模块支持。按如下步骤进行转换,首先将设计好的MIB库模块定义文件拷贝到UCD-SNMP源代码的mibs目录(如/usr/local/share/snmp/mibs),而后运行MIB2C命令(假定MIB库模块为modulename)。
/usr/local/bin/mib2c modulename
此时,MIB2C会在当前目录下生成两个C源文件:modulename.h 和modulename.c,这两个文件是根据所设计的MIB库模块转换而成的,也是须要加入到UCD-SNMP软件包实现SNMP Agent功能扩展的源代码。
三:SNMP Agent功能扩展方式
SNMP Agent功能扩展即snmpd功能扩展,假定UCD-SNMP源代码存放在/usr/local/src/目录下,下面是实现snmpd功能扩展的两种方式:
静态连接方式
先将生成的两个文件, modulename.h和modulename.c,拷贝到UCD-SNMP源代码的/usr/local/src/ucd-snmp-4.2.1/agent/mibgroup目录,而后,在ucd-snmp 4.2.1目录下(/usr/local/src/ucd-snmp-4.2.1)执行如下命令生成snmpd。
# ./configure -with-mib-modules="modulename"
# make
# make install
共享连接库方式
首先, 在任一目录(如/usr/local/temp)编译生成共享连接库。将两个源文件, modulename.h和modulename.c拷贝到此目录下,执行以下命令生成共享连接库:
gcc -g -I/usr/local/include -c -o modulename.o modulename.c
gcc -g -fPIC -shared -o modulename.so modulename.o
而后,经过如下任意一种方式动态加载共享连接库。
若是代理程序(snmpd)已运行,执行以下命令:
#snmpset localhost rwnode UCD-DLMOD-MIB::dlmodStatus.1 i create
#snmpset localhost rwnode UCD-DLMOD-MIB::dlmodName.1 s " modulename"
#snmpset localhost rwnode UCD-DLMOD-MIB::dlmodPath.1 s "/usr/local/temp/ modulename.so"
#snmpset localhost rwnode UCD-DLMOD-MIB::dlmodStatus.1 i load
这样便可加载刚才生成的共享链接库,装载后,能够用工具程序检索或设置相应的变量。
若是代理程序(snmpd)未运行,在snmpd.conf配置文件中增长一行:
dlmod modulename /usr/local/temp/modulename.so
而后从新启动snmpd代理程序, 程序会自动装载共享库。
四:uCLinux系统上SNMP Agent的实现
考虑到嵌入式设备应用程序自动启动的特色,通常采用静态连接方式开发SNMP Agent。因为uCLinux交叉编译环境的特殊性,在uCLinux系统上实现SNMP Agent须要按如下步骤。
增长新文件及修改Makefile文件:
复制modulename.c和modulename.h到agent/mibgroup/目录下。
修改agent/Makefile文件:
增长"mibgroup/modulename.lo"到LMIBOBJS符号下。
增长"mibgroup/modulename.o"到MIBOBJS符号下。
修改agent/mibgroup/Makefile文件:
增长"modulename.o"到OBJS符号下。
增长"modulename.lo"到LOBJS符号下。
增长"modulename.c"到SRCS符号下。
修改agent/mibgroup/mib_module_includes.h文件:
增长 #include "mibgroup/modulename.h"一行。
修改agent/mibgroup/mib_module_inits.h文件:
增长“if (should_init("modulename")) init_ modulename ();”一行。
从新配置内核
要生成SNMP Agent程序snmpd,须要从新配置应用程序。
切换到uClinux-dist目录,开始从新配置应用程序:
cd ../uClinux-dist
make menuconfig
进行以下选择:
Kernel/Library/Defaults Selection:
(Linux-2.4.x) Kernel Version
[X] Customize Vendor/User Settings (NEW)
按Esc后保存。随后自动进入 uClinux v3.1.0 Configurationm,选中“Network Application---->”并进入下一级选项菜单,在这里能够配置arp、ifconfig、ping、route和snmpd等应用程序,选中ucd-snmpsnmpd一项。
[X] ucd-snmp snmpd
保存后退出,而后在终端提示符下执行命令“make user_only”生成SNMP Agent程序snmpd。
五:建立SNMP Agent配置文件snmpd.conf
snmpd启动时须要读取snmpd.conf配置文件,经过该配置文件,能够控制SNMP管理端对变量的读写属性,下面是该配置文件的一个示例:
syslocation Shanghai
syscontact localhost
sysservices 72
com2sec public default public
com2sec private default private
group public v1 public
group private v1 private
group public v2c public
group private v2c private
group public usm public
group private usm private
view all included .1 80
view system included .1.3.6.1.2.1.1 fe
access public "" any noauth exact all none all
access private "" any noauth exact none all all
trapsink 200.162.162.27