1.配置uClinux
修改config/config.in文件,确保改文件中有如下内容:
配置用户程序,选中ucd-snmp
2.使用snmpconf工具生成配置文件,内容如下:
###########################################################################
#
# snmpd.conf
#
#- created by the snmpconf configuration program
#
###########################################################################
# SECTION: System Information Setup
#
#This section defines some of the information reported in
#the "system" mib group in the mibII tree.
# syslocation: The [typically physical] location of the system.
#Note that setting this value here means that when trying to
#perform an snmp SET operation to the sysLocation.0 variable will make
#the agent return the "notWritable" error code.IE, including
#this token in the snmpd.conf file will disable write access to
#the variable.
#arguments:location_string
syslocationxi'an
# syscontact: The contact information for the administrator
#Note that setting this value here means that when trying to
#perform an snmp SET operation to the sysContact.0 variable will make
#the agent return the "notWritable" error code.IE, including
#this token in the snmpd.conf file will disable write access to
#the variable.
#arguments:contact_string
syscontactlazy_linux@126.com
# sysservices: The proper value for the sysServices object.
#arguments:sysservices_number
sysservices 77
sysservices 0*1 + 0*2 + 0*4 + 0*8 + 0*64
sysservices 0*1 + 0*2 + 1*4 + 1*8 + 0*64
###########################################################################
# SECTION: Access Control Setup
#
#This section defines who is allowed to talk to your running
#snmp agent.
# rwuser: a SNMPv3 read-write user
#arguments:user [noauth|auth|priv] [restriction_oid]
rwuserrw3 noauth
# rwcommunity: a SNMPv1/SNMPv2c read-write access community name
#arguments:community [default|hostname|network/bits] [oid]
rwcommunityrw12
###########################################################################
# SECTION: Trap Destinations
#
#Here we define who the agent will send traps to.
# trap2sink: A SNMPv2c trap receiver
#arguments: host [community] [portnum]
trap2sink202.117.129.75
3.编译生成image.rom并下载到目标板上,运行如下:
4.在开发主机上进行验证
1.主要修改的文件
MIB文件:定义扩展的MIB库
编译的头文件:需要修改头文件,使得编译时包括用户扩展的功能
.c文件:实现SNMP get,set,trap等功能
.h文件:头文件
2.MIB文件
/uClinux-dist/user/ucdsnmp/mibs/UCD-DEMO-MIB.txt
其中定义了用户扩展的agent管理节点
UCD-DEMO-MIB DEFINITIONS ::= BEGIN
IMPORTS
MODULE-IDENTITY, OBJECT-TYPE, Integer32 FROM SNMPv2-SMI
ucdavisFROM UCD-SNMP-MIB;
ucdDemoMIB MODULE-IDENTITY
LAST-UPDATED "9912090000Z"
ORGANIZATION "University of California, Davis"
CONTACT-INFO
"The ucd-snmp-coders mailing list is the best place to
write for public questions about the ucd-snmp
project: ucd-snmp-coders@ucd-snmp.ucdavis.edu
Primary Author: Wes Hardaker
postal:IT-DCAS
UCDavis
Davis CA95616
phone:+1 530 754-7571
email:wjhardaker@ucdavis.edu"
DESCRIPTION
"The UCD-SNMP Demonstration MIB."
REVISION"9912090000Z"
DESCRIPTION
"SMIv2 version converted from older MIB definitions."
::= { ucdavis 14 }
//该节点位于ucdavis下的第14个节点
ucdDemoMIBObjects OBJECT IDENTIFIER ::= { ucdDemoMIB 1 }
//在UCD-SNMP-MIB中定义,
// --ucdDemoMIBOBJECT IDENTIFIER ::= { ucdavis14 } - UCD-DEMO-MIB
//OID: ucdavis.14.1
ucdDemoPublic OBJECT IDENTIFIER ::= { ucdDemoMIBObjects 1 }
//OID: ucdavis.14.1.1
ucdDemoResetKeys OBJECT-TYPE
SYNTAXInteger32 (0..2147483647)
MAX-ACCESSread-write
STATUScurrent
DESCRIPTION
"A set of value 1 to this object resets the
demonstration user's auth and priv keys to the
keys based on the P->Ku->Kul transformation of the
value of the ucdDemoPasspharse object.
Values other than 1 are ignored."
::= { ucdDemoPublic 1 }
//OID: ucdavis.14.1.1
ucdDemoPublicString OBJECT-TYPE
SYNTAXOCTET STRING (SIZE(0..1024))
MAX-ACCESSread-write
STATUScurrent
DESCRIPTION
"A publicly settable string that can be set for testing
snmpsets.This value has no real usage other than
testing purposes."
::= { ucdDemoPublic 2 }
ucdDemoUserList OBJECT-TYPE
SYNTAXOCTET STRING
MAX-ACCESSread-only
STATUScurrent
DESCRIPTION
"The list of users affected by the ucdDemoResetKeys object."
::= { ucdDemoPublic 3 }
ucdDemoPassphraseOBJECT-TYPE
SYNTAXOCTET STRING
MAX-ACCESSread-only
STATUScurrent
DESCRIPTION
"The demo passphrase that ucdDemoResetKeys changes each
users localized key to based on the P->Ku->Kul transformation."
::= { ucdDemoPublic 4 }
//定义了2个trap类型的节点
TheTrap1 NOTIFICATION-TYPE
STATUS current
DESCRIPTION
"This is 1st trap."
::= { ucdDemoPublic 5 }
//OID: ucdavis.14.1.5
TheTrap2 NOTIFICATION-TYPE
SYNTAX Integer32
MAX-ACCESSread-write
STATUSmandatory
DESCRIPTION
"This is 2nd trap."
::= { ucdDemoPublic 6 }
//OID: ucdavis.14.1.6
END
2.编译的头文件
/uClinux-dist/user/ucdsnmp/agent/Makefile
在MIBOBJS中增加需要编译的c文件的目标文件名称:
MIBOBJS=mibgroup/mibII/system_mib.omibgroup/misc/ipfwacc.o mibgroup/mibII/sysORTable.omibgroup/mibII/at.omibgroup/mibII/interfaces.omibgroup/mibII/snmp_mib.omibgroup/mibII/tcp.omibgroup/mibII/icmp.omibgroup/mibII/ip.omibgroup/mibII/udp.omibgroup/mibII/vacm_vars.omibgroup/ucd-snmp/memory.omibgroup/ucd-snmp/proc.omibgroup/ucd-snmp/versioninfo.omibgroup/ucd-snmp/pass.omibgroup/ucd-snmp/pass_persist.omibgroup/ucd-snmp/disk.omibgroup/ucd-snmp/loadave.omibgroup/ucd-snmp/extensible.omibgroup/ucd-snmp/errormib.omibgroup/ucd-snmp/registry.omibgroup/ucd-snmp/file.omibgroup/snmpv3/snmpEngine.omibgroup/snmpv3/snmpMPDStats.omibgroup/snmpv3/usmStats.omibgroup/snmpv3/usmUser.omibgroup/util_funcs.omibgroup/mibII/var_route.omibgroup/mibII/route_write.omib_modules.o mibgroup/examples/ucdDemoPublic.o
/uClinux-dist/user/ucdsnmp/agent/mibgroup/Makefile
OBJS和SRCS中增加目标文件名称和c文件名称
OBJS =misc/ipfwacc.o mibII/system_mib.o mibII/sysORTable.o mibII/at.o mibII/interfaces.o mibII/snmp_mib.o mibII/tcp.o mibII/icmp.o mibII/ip.o mibII/udp.o mibII/vacm_vars.o ucd-snmp/memory.o ucd-snmp/proc.o ucd-snmp/versioninfo.o ucd-snmp/pass.o ucd-snmp/pass_persist.o ucd-snmp/disk.o ucd-snmp/loadave.o ucd-snmp/extensible.o ucd-snmp/errormib.o ucd-snmp/registry.o ucd-snmp/file.o snmpv3/snmpEngine.o snmpv3/snmpMPDStats.o snmpv3/usmStats.o snmpv3/usmUser.o util_funcs.o mibII/var_route.o mibII/route_write.o examples/ucdDemoPublic.o
SRCS =misc/ipfwacc.c mibII/system_mib.c mibII/sysORTable.c mibII/at.c mibII/interfaces.c mibII/snmp_mib.c mibII/tcp.c mibII/icmp.c mibII/ip.c mibII/udp.c mibII/vacm_vars.c ucd-snmp/memory.c ucd-snmp/proc.c ucd-snmp/versioninfo.c ucd-snmp/pass.c ucd-snmp/pass_persist.c ucd-snmp/disk.c ucd-snmp/loadave.c ucd-snmp/extensible.c ucd-snmp/errormib.c ucd-snmp/registry.c ucd-snmp/file.c snmpv3/snmpEngine.c snmpv3/snmpMPDStats.c snmpv3/usmStats.c snmpv3/usmUser.c util_funcs.c mibII/var_route.c mibII/route_write.c examples/ucdDemoPublic.c
/uClinux-dist/user/ucdsnmp/agent/mibgroup/mib_module_inits.h中增加自定义的初始化函数名称
/* This file is automatically generated by configure.Do not modify by hand. */
init_system_mib();
init_sysORTable();
init_at();
init_interfaces();
init_snmp_mib();
init_tcp();
init_icmp();
init_ip();
init_udp();
init_vacm_vars();
init_memory();
init_proc();
init_versioninfo();
init_pass();
init_pass_persist();
init_disk();
init_loadave();
init_extensible();
init_errormib();
init_registry();
init_file();
init_snmpEngine();
init_snmpMPDStats();
init_usmStats();
init_usmUser();
init_var_route();
init_ipfwacc();
init_ucdDemoPublic();
/uClinux-dist/user/ucdsnmp/agent/mibgroup/mib_module_includes.h中增加自定义的头文件名称
/* This file is automatically generated by configure.Do not modify by hand. */
#include "mibgroup/mibII.h"
#include "mibgroup/ucd_snmp.h"
#include "mibgroup/snmpv3mibs.h"
#include "mibgroup/mibII/system_mib.h"
#include "mibgroup/mibII/sysORTable.h"
#include "mibgroup/mibII/at.h"
#include "mibgroup/mibII/interfaces.h"
#include "mibgroup/mibII/snmp_mib.h"
#include "mibgroup/mibII/tcp.h"
#include "mibgroup/mibII/icmp.h"
#include "mibgroup/mibII/ip.h"
#include "mibgroup/mibII/udp.h"
#include "mibgroup/mibII/vacm_vars.h"
#include "mibgroup/ucd-snmp/memory.h"
#include "mibgroup/ucd-snmp/proc.h"
#include "mibgroup/ucd-snmp/versioninfo.h"
#include "mibgroup/ucd-snmp/pass.h"
#include "mibgroup/ucd-snmp/pass_persist.h"
#include "mibgroup/ucd-snmp/disk.h"
#include "mibgroup/ucd-snmp/loadave.h"
#include "mibgroup/ucd-snmp/extensible.h"
#include "mibgroup/ucd-snmp/errormib.h"
#include "mibgroup/ucd-snmp/registry.h"
#include "mibgroup/ucd-snmp/file.h"
#include "mibgroup/snmpv3/snmpEngine.h"
#include "mibgroup/snmpv3/snmpMPDStats.h"
#include "mibgroup/snmpv3/usmStats.h"
#include "mibgroup/snmpv3/usmUser.h"
#include "mibgroup/util_funcs.h"
#include "mibgroup/mibII/var_route.h"
#include "mibgroup/mibII/route_write.h"
#include "mibgroup/misc/ipfwacc.h"
#include "mibgroup/examples/ucdDemoPublic.h"
3..c文件:实现SNMP get,set,trap等功能
/uClinux-dist/user/ucdsnmp/agent/mibgroup/examples/ucdDemoPublic.c
/* ucdDemoPublic.c */
#include
#include
#include
#include
#include
#include
#include "mibincl.h"
#include "snmpv3.h"
#include "snmpusm.h"
#include "agent_read_config.h"
#include "ucdDemoPublic.h"
#include "util_funcs.h"
#define MYMAX 1024
#define MAXUSERS 10
int num=0;
static char demoUsers[MAXUSERS][MYMAX+1];
static char demopass[MYMAX+1];
char mynode_str[300];
void ucdDemo_parse_user(const char *word, char *line) {
if (num == MAXUSERS)
return;
if (strlen(line) > MYMAX)
return;
strcpy(demoUsers[num++], line);
}
void ucdDemo_parse_userpass(const char *word, char *line) {
if (strlen(line) > MYMAX)
return;
strcpy(demopass, line);
}
/* this variable defines function callbacks and type return information
for the ucdDemoPublic mib */
//与MIB中的定义相对应
struct variable2 ucdDemoPublic_variables[] = {
{ UCDDEMORESETKEYS, ASN_INTEGER, RWRITE, var_ucdDemoPublic, 1, { 1 } },
{ UCDDEMOPUBLICSTRING , ASN_OCTET_STR , RWRITE, var_ucdDemoPublic, 1, { 2 } },
{ UCDDEMOUSERLIST, ASN_OCTET_STR , RWRITE, var_ucdDemoPublic, 1, { 3 } },
{ UCDDEMOPASSPHRASE, ASN_OCTET_STR , RWRITE, var_ucdDemoPublic, 1, { 4 } },
{ 5, ASN_INTEGER, RWRITE, var_ucdDemoPublic, 1, {5}},
{ 6, ASN_INTEGER, RWRITE, var_ucdDemoPublic, 1, {6}}
};
/* Define the OID pointer to the top of the mib tree that we're
registering underneath */
oid ucdDemoPublic_variables_oid[] = { 1,3,6,1,4,1,2021,14,1,1 };
void init_ucdDemoPublic(void) {
REGISTER_MIB( "examples/ucdDemoPublic", ucdDemoPublic_variables,
variable2, ucdDemoPublic_variables_oid);
snmpd_register_config_handler("demoUser", ucdDemo_parse_user, NULL, "USER");
snmpd_register_config_handler("demoPass", ucdDemo_parse_userpass, NULL, "PASSPHASE");
//定义定时的trap发送
snmp_alarm_register(10, SA_REPEAT, snmploop_callback, NULL);
}
//定义自定义的定时trap动作
void snmploop_callback(unsigned int reg, void *clientarg){
send_easy_trap(SNMP_TRAP_ENTERPRISESPECIFIC, 1);
}
unsigned char publicString[MYMAX+1];
long long_ret;
unsigned char *
var_ucdDemoPublic(
struct variable *vp,
oid*name,
size_t*length,
intexact,
size_t*var_len,
WriteMethod **write_method)
{
//static long long_ret;
static char string[MYMAX+1], *cp;
int i;
*write_method = 0;/* assume it isnt writable for the time being */
*var_len = sizeof(long_ret); /* assume an integer and change later if not */
if (header_generic(vp,name,length,exact,var_len,write_method))
return 0;
/* this is where we do the value assignments for the mib results. */
switch(vp->magic) {
case UCDDEMORESETKEYS:
*write_method = write_ucdDemoResetKeys;
//long_ret = 0;
return (unsigned char *) &long_ret;
case UCDDEMOPUBLICSTRING:
*write_method = write_ucdDemoPublicString;
*var_len = strlen(publicString);
return (unsigned char *) publicString;
case UCDDEMOUSERLIST:
cp = string;
for(i=0; i < num; i++) {
sprintf(cp, " %s", demoUsers[i]);
cp = cp + strlen(cp);
}
*var_len = strlen(string);
return (unsigned char *) string;
case UCDDEMOPASSPHRASE:
*var_len = strlen(demopass);
return (unsigned char *) demopass;
case 5:
long_ret=0;
*write_method = write_mynodetrap;
return (u_char *)&long_ret;
case 6:
/*
* This object is essentially "write-only".
* It only exists to trigger the sending of a v2 trap.
* Reading it will always return 0.
*/
long_ret = 0; /*FIX*/
*write_method = write_mynodetrap2;
return (u_char *)&long_ret;
default:
DEBUGMSGTL(("snmpd", "unknown sub-id %d in var_ucdDemoPublic ", vp->magic));
}
return 0;
}
int
write_ucdDemoResetKeys(
intaction,
u_char*var_val,
u_charvar_val_type,
size_tvar_val_len,
u_char*statP,
oid*name,
size_tname_len)
{
/* variables we may use later */
//static long long_ret;
static unsigned char string[1500];
static oid objid[MAX_OID_LEN];
static struct counter64 c64;
int bigsize=1000;
unsigned char *engineID;
int engineIDLen;
int i;
struct usmUser *user;
if (var_val_type != ASN_INTEGER) {
printf("ASN_INTEGER ");
DEBUGMSGTL(("ucdDemoPublic","write to ucdDemoResetKeys not ASN_INTEGER "));
return SNMP_ERR_WRONGTYPE;
}
if (var_val_len > sizeof(long_ret)) {
DEBUGMSGTL(("ucdDemoPublic","write to ucdDemoResetKeys: bad length "));
return SNMP_ERR_WRONGLENGTH;
}
if (action == COMMIT) {
int fd = open("/dev/lamp", O_RDWR, 0644);
if(fd<0){
printf("open /dev/lamp error ");
return SNMP_ERR_NOERROR;
}
printf("new value: %x ", *(long*)var_val);
if( *(long *)var_val == 0) write(fd,"00 ", 3);
if( *(long *)var_val == 1) write(fd,"01 ", 3);
if( *(long *)var_val == 2) write(fd,"10 ", 3);
if( *(long *)var_val == 3) write(fd,"11 ", 3);
close(fd);
long_ret = *((long *) var_val);
/*if (long_ret == 1) {
engineID = snmpv3_generate_engineID(&engineIDLen);
for(i=0; i < num; i++) {
user = usm_get_user(engineID, engineIDLen, demoUsers[i]);
if (user) {
usm_set_user_password(user, "userSetAuthPass", demopass);
usm_set_user_password(user, "userSetPrivPass", demopass);
}
}
reset the keys
}*/
}
return SNMP_ERR_NOERROR;
}
int
write_ucdDemoPublicString(
intaction,
u_char*var_val,
u_charvar_val_type,
size_tvar_val_len,
u_char*statP,
oid*name,
size_tname_len)
{
if (var_val_type != ASN_OCTET_STR) {
DEBUGMSGTL(("ucdDemoPublic","write to ucdDemoPublicString not ASN_OCTET_STR "));
return SNMP_ERR_WRONGTYPE;
}
if (var_val_len > MYMAX) {
DEBUGMSGTL(("ucdDemoPublic","write to ucdDemoPublicString: bad length "));
return SNMP_ERR_WRONGLENGTH;
}
if (action == COMMIT) {
strcpy(publicString, var_val);
}
return SNMP_ERR_NOERROR;
}
int write_mynodetrap(int action,
u_char * var_val,
u_char var_val_type,
size_t var_val_len,
u_char * statP, oid * name, size_t name_len)
{
longintval;
DEBUGMSGTL(("mynode", "write_mynodetrap entered: action=%d ",
action));
switch (action) {
case RESERVE1:
/*
*The only acceptable value is the integer 1
*/
if (var_val_type != ASN_INTEGER) {
DEBUGMSGTL(("mynode", "%x not integer type", var_val_type));
return SNMP_ERR_WRONGTYPE;
}
if (var_val_len > sizeof(long)) {
DEBUGMSGTL(("mynode", "wrong length %x", var_val_len));
return SNMP_ERR_WRONGLENGTH;
}
intval = *((long *) var_val);
if (intval != 1) {
DEBUGMSGTL(("mynode", "wrong value %x", intval));
return SNMP_ERR_WRONGVALUE;
}
break;
case RESERVE2:
/*
* No resources are required....
*/
break;
case FREE:
/*
* ... so no resources need be freed
*/
break;
case ACTION:
/*
*Having triggered the sending of a trap,
*it would be impossible to revoke this,
*so we can't actually invoke the action here.
*/
break;
case UNDO:
/*
* We haven't done anything yet,
* so there's nothing to undo
*/
break;
case COMMIT:
/*
*Everything else worked, so it's now safe
*to trigger the trap.
*Note that this is *only* acceptable since
*the trap sending routines are "failsafe".
*(In fact, they can fail, but they return no
*indication of this, which is the next best thing!)
*/
DEBUGMSGTL(("mynode", "write_mynodetrap sending the trap ",
action));
send_easy_trap(SNMP_TRAP_ENTERPRISESPECIFIC, 99);
DEBUGMSGTL(("mynode", "write_mynodetrap trap sent ", action));
break;
}
return SNMP_ERR_NOERROR;
}
/*
* this documents how to send a SNMPv2 (and higher) trap via the
* send_v2trap() API.
*
* Coding SNMP-v2 Trap:
*
* The SNMPv2-Trap PDU contains at least a pair of object names and
* values: - sysUpTime.0 whose value is the time in hundredths of a
* second since the netwok management portion of system was last
* reinitialized.- snmpTrapOID.0 which is part of the trap group SNMPv2
* MIB whose value is the object-id of the specific trap you have defined
* in your own MIB.Other variables can be added to caracterize the
* trap.
*
* The function send_v2trap adds automaticallys the two objects but the
* value of snmpTrapOID.0 is 0.0 by default. If you want to add your trap
* name, you have to reconstruct this object and to add your own
* variable.
*
*/
int write_mynodetrap2(int action,
u_char * var_val,
u_char var_val_type,
size_t var_val_len,
u_char * statP, oid * name, size_t name_len)
{
longintval;
/*
* these variales will be used when we send the trap
*/
oidobjid_snmptrap[] = { 1, 3, 6, 1, 6, 3, 1, 1, 4, 1, 0 };/* snmpTrapOID.0 */
oiddemo_trap[] = { 1, 3, 6, 1, 4, 1, 2021, 13, 990 };/*demo-trap */
oidmynode_string_oid[] =
{ 1, 3, 6, 1, 4, 1, 2021, 254, 1, 0 };
static struct variable_list var_trap;
static struct variable_list var_obj;
DEBUGMSGTL(("mynode", "write_mynodetrap2 entered: action=%d ",
action));
switch (action) {
case RESERVE1:
/*
*The only acceptable value is the integer 1
*/
if (var_val_type != ASN_INTEGER) {
DEBUGMSGTL(("mynode", "%x not integer type", var_val_type));
return SNMP_ERR_WRONGTYPE;
}
if (var_val_len > sizeof(long)) {
DEBUGMSGTL(("mynode", "wrong length %x", var_val_len));
return SNMP_ERR_WRONGLENGTH;
}
intval = *((long *) var_val);
if (intval != 1) {
DEBUGMSGTL(("mynode", "wrong value %x", intval));
return SNMP_ERR_WRONGVALUE;
}
break;
case RESERVE2:
/*
* No resources are required....
*/
break;
case FREE:
/*
* ... so no resources need be freed
*/
break;
case ACTION:
/*
*Having triggered the sending of a trap,
*it would be impossible to revoke this,
*so we can't actually invoke the action here.
*/
//mynode_int = intval;
//Temp_ret=intval;
break;
case UNDO:
/*
* We haven't done anything yet,
* so there's nothing to undo
*/
break;
case COMMIT:
/*
*Everything else worked, so it's now safe
*to trigger the trap.
*Note that this is *only* acceptable since
*the trap sending routines are "failsafe".
*(In fact, they can fail, but they return no
*indication of this, which is the next best thing!)
*/
/*
* trap definition objects
*/
//Temp_ret=intval;
var_trap.next_variable = &var_obj;/* next variable */
var_trap.name = objid_snmptrap;/* snmpTrapOID.0 */
var_trap.name_length = sizeof(objid_snmptrap) / sizeof(oid);/* number of sub-ids */
var_trap.type = ASN_OBJECT_ID;
var_trap.val.objid = demo_trap; /* demo-trap objid*/
var_trap.val_len = sizeof(demo_trap);/* length in bytes (not number of subids!) */
/*
* additional objects
*/
strcpy(mynode_str, "HHHHHHHHHHH");
var_obj.next_variable = NULL;/* No more variables after this one */
var_obj.name = mynode_string_oid;
var_obj.name_length = sizeof(mynode_string_oid) / sizeof(oid); /* number of sub-ids */
var_obj.type = ASN_OCTET_STR;/* type of variable */
var_obj.val.string = mynode_str; /* value */
var_obj.val_len = strlen(mynode_str);
DEBUGMSGTL(("mynode", "write_mynodetrap2 sending the v2 trap ",
action));
send_v2trap(&var_trap);
DEBUGMSGTL(("mynode", "write_mynodetrap2 v2 trap sent ",
action));
break;
}
return SNMP_ERR_NOERROR;
}
4..h文件:头文件
/uClinux-dist/user/ucdsnmp/agent/mibgroup/examples/ ucdDemoPublic.h
/* ucdDemoPublic.h */
#ifndef _MIBGROUP_UCDDEMOPUBLIC_H
#define _MIBGROUP_UCDDEMOPUBLIC_H
#include
#include
/* we use header_generic and checkmib from the util_funcs module */
config_require(util_funcs)
/* Magic number definitions: */
#defineUCDDEMORESETKEYS1
#defineUCDDEMOPUBLICSTRING2
#defineUCDDEMOUSERLIST3
#defineUCDDEMOPASSPHRASE4
/* function definitions */
extern voidinit_ucdDemoPublic(void);
extern FindVarMethod var_ucdDemoPublic;
//自定义的定时trap函数
SNMPAlarmCallbacksnmploop_callback;
WriteMethod write_ucdDemoResetKeys;
WriteMethod write_ucdDemoPublicString;
//自定义的函数声明
WriteMethod write_mynodetrap;
WriteMethod write_mynodetrap2;
#endif /* _MIBGROUP_UCDDEMOPUBLIC_H */
1.开发板的命令运行:
snmptrapd –c /etc/snmpd.conf -V
其中-c /etc/snmpd.conf 用来指定配置文件
2.开发主机的测试命令及其输出:
可以看到可以使用get,set来读取并设置节点的值,由于1.3.6.1.4.1.2021.14.1.1.6.0是trap节点,所以当其值被设置后,就会自动向管理站发送trap。
如果需要检测agent的trap报文,需要在管理站运行snmptrapd命令,可以如下使用:
snmptrapd –f –Lo
另外,如果agent上有定时的trap报文,同样可以使用snmptrapd命令进行检测,如图为10秒中一次的定时trap报文的接收情况。