做这个需要交叉编译net-snmp
在官网http://www.net-snmp.org下载源码包,我用的是5.7.3
配置交叉编译器,我的交叉编译器是在/usr/local/arm-2014.05/bin
export PATH=$PATH:/usr/local/arm-2014.05/bin
解压源码包之后,cd net-snmp-5.7.3,执行
./configure --build=i686-linux --host=arm-linux CC=arm-linux-gcc --with-endianness=little --prefix=/opt/net-snmp --with-ar=arm-linux-ar --disable-embedded-perl --without-perl-modules -enable-mini-agent -disable-mibs --with-mib-modules=dlmod --enable-ipv6 --enable-shared
之后make install后,会安装在/opt/net-snmp下
在configure中,当我们选择了--enable-mini-agent这个选项之后,将会不自动加载大多数modules,其中包括dlmod mudules,这个模块是用于加载动态库模块。为了使用这个模块,我们需要在选择 --enable-mini-agen之后。再选择--with-mib-modules=dlmod这个选项,同时还要将在agent/mibgroup/ucd-snmp下的dlmod的C文件跟H文件移到agent/mibgroup下,之后就可以使用自己编译的mib库了。
下面是编写一个mib库的基本步骤
编写mib库
先准备一个mib文件,我这里是RFC1628_UPS_MIB.MIB
env MIBS="+./RFC1628_UPS_MIB.MIB" mib2c upsMIB
之后会生成upsMIB.c和upsMIB.h,里面包含所有的点数据接口,可以通过文件或者共享内存的方式获取数据并填充到这些接口上,之后将此编译成so
将生成的.so文件的路径添加到snmpd.conf配置文件中,打开snmpd.conf添加内容如下(样例):
dlmod xxx (你so文件所在地址)/xxx.so
这样以后启动snmpd时就自动加载这个模块了。
编译出.so文件后就可以把该文件链接到snmpd中了,命令如下(该命令用于服务检测,启动以后该终端就一直检测snmp包的信息):
snmpd -f -d -L -Dxxx,dlmod -Dxxx -c /usr/local/share/snmp/snmpd.conf
trap 添加
env MIBS="+/opt/net-snmp/RFC1628_UPS_MIB.MIB" mib2c -c mib2c.notify.conf upsMIB
以下为例程
extern const oid snmptrap_oid[] = {1,3,6,1,6,3,1,1,4,1,0};
const size_t snmptrap_oid_len = OID_LENGTH(snmptrap_oid);
void init_TestTraps(void)
{
DEBUGMSGTL(("TestTraps","Initializing\n"));
snmp_alarm_register(1,SA_REPEAT,read_cpudata_repeat, NULL);
}
int
send_cpuRatioHigh_trap( void )
{
netsnmp_variable_list *var_list = NULL;
const oid cpuRatioHigh_oid[] = { 1,3,6,1,4,1,1000,1,1 };
const oid TestTrapDescription_oid[] = { 1,3,6,1,4,1,1000,1,2,1, 0 };
static char TestTrapDescription[50];
strcpy(TestTrapDescription,"CPU使用率过高");
/*
* Set the snmpTrapOid.0 value
*/
snmp_varlist_add_variable(&var_list,
snmptrap_oid, snmptrap_oid_len,
ASN_OBJECT_ID,
cpuRatioHigh_oid, sizeof(cpuRatioHigh_oid));
/*
* Add any objects from the trap definition
*/
snmp_varlist_add_variable(&var_list,
TestTrapDescription_oid, OID_LENGTH(TestTrapDescription_oid),
ASN_OCTET_STR,
/* Set an appropriate value for TestTrapDescription */
NULL, 0);
/*
* Add any extra (optional) objects here
*/
/*
* Send the trap to the list of configured destinations
* and clean up
*/
send_v2trap( var_list );
snmp_free_varbind( var_list );
return SNMP_ERR_NOERROR;
}
void judge_send_cputrap(int cpu)
{
static unsigned int cputrap_clientreg = 0;
if(cpu > 80)
{
if(cputrap_clientreg == 0){
send_cpuRatioHigh_trap();
cputrap_clientreg = snmp_alarm_register(5,SA_REPEAT,send_cpuRatioHigh_trap,NULL);
}
}
else
{
if(cputrap_clientreg != 0)
{
snmp_alarm_unregister(cputrap_clientreg);
cputrap_clientreg = 0;
}
}
}
void read_cpudata_repeat(unsigned int clientreg, void *clientarg)
{
int cpu = 90;
judge_send_cputrap(cpu);
}