snmp trap编写

1、MIB库
查看net
-snmp的安装目录。/usr/share/snmp/mibs目录下: NET-SNMP-EXAMPLES-MIB.mib本件部分内容如下: netSnmpExampleHeartbeatRate OBJECT-TYPE SYNTAX Integer32 MAX-ACCESS accessible-for-notify STATUS current DESCRIPTION "A simple integer object, to act as a payload for the netSnmpExampleHeartbeatNotification. The value has no real meaning, but is nominally the interval (in seconds) between successive heartbeat notifications." ::= { netSnmpExampleNotificationObjects 1 } netSnmpExampleHeartbeatName OBJECT-TYPE SYNTAX SnmpAdminString MAX-ACCESS accessible-for-notify STATUS current DESCRIPTION "A simple string object, to act as an optional payload for the netSnmpExampleHeartbeatNotification. This varbind is not part of the notification definition, so is optional and need not be included in the notification payload. The value has no real meaning, but the romantically inclined may take it to be the object of the sender's affection, and hence the cause of the heart beating faster." ::= { netSnmpExampleNotificationObjects 2 } netSnmpExampleHeartbeatNotification NOTIFICATION-TYPE OBJECTS { netSnmpExampleHeartbeatRate } STATUS current DESCRIPTION "An example notification, used to illustrate the definition and generation of trap and inform PDUs (including the use of both standard and additional varbinds in the notification payload). This notification will typically be sent every 30 seconds, using the code found in the example module agent/mibgroup/examples/notification.c" ::= { netSnmpExampleNotificationPrefix 1 } netSnmpExampleNotification OBJECT-TYPE SYNTAX SnmpAdminString MAX-ACCESS accessible-for-notify STATUS obsolete DESCRIPTION "This object was improperly defined for its original purpose, and should no longer be used." ::= { netSnmpExampleNotifications 1 }
2、源文件 其对应的测试代码在:net
-snmp-5.7.2/agent/mibgroup/examples/notification.c 如果要自己编写的话,那么按照NET-SNMP-EXAMPLES-MIB.mib文件中trap的编写方法编写trap,
通过mib生成.c和.h的工具使用mib2c.nofity.conf这个配置文件生成.c和.h文件。
,再修改一下函数的返回值和参数等,更改成与nofification.c类似就可以运行。
notification.c如下所示,每个30秒发送一个trap给mib browser。

#include
<net-snmp/net-snmp-config.h> #include <net-snmp/net-snmp-includes.h> #include <net-snmp/agent/net-snmp-agent-includes.h> /* * contains prototypes */ #include "notification.h" /* * our initialization routine * (to get called, the function name must match init_FILENAME() */ void init_notification(void) { DEBUGMSGTL(("example_notification", "initializing (setting callback alarm)\n")); snmp_alarm_register(30, /* seconds */ SA_REPEAT, /* repeat (every 30 seconds). */ send_example_notification, /* our callback */ NULL /* no callback data needed */ ); } void send_example_notification(unsigned int clientreg, void *clientarg) { /* * define the OID for the notification we're going to send * NET-SNMP-EXAMPLES-MIB::netSnmpExampleHeartbeatNotification */ oid notification_oid[] = { 1, 3, 6, 1, 4, 1, 8072, 2, 3, 0, 1 }; size_t notification_oid_len = OID_LENGTH(notification_oid); static u_long count = 0; /* * In the notification, we have to assign our notification OID to * the snmpTrapOID.0 object. Here is it's definition. */ oid objid_snmptrap[] = { 1, 3, 6, 1, 6, 3, 1, 1, 4, 1, 0 }; size_t objid_snmptrap_len = OID_LENGTH(objid_snmptrap); /* * define the OIDs for the varbinds we're going to include * with the notification - * NET-SNMP-EXAMPLES-MIB::netSnmpExampleHeartbeatRate and * NET-SNMP-EXAMPLES-MIB::netSnmpExampleHeartbeatName */ oid hbeat_rate_oid[] = { 1, 3, 6, 1, 4, 1, 8072, 2, 3, 2, 1, 0 }; size_t hbeat_rate_oid_len = OID_LENGTH(hbeat_rate_oid); oid hbeat_name_oid[] = { 1, 3, 6, 1, 4, 1, 8072, 2, 3, 2, 2, 0 }; size_t hbeat_name_oid_len = OID_LENGTH(hbeat_name_oid); /* * here is where we store the variables to be sent in the trap */ netsnmp_variable_list *notification_vars = NULL; const char *heartbeat_name = "A girl named Maria"; #ifdef RANDOM_HEARTBEAT int heartbeat_rate = rand() % 60; #else int heartbeat_rate = 30; #endif DEBUGMSGTL(("example_notification", "defining the trap\n")); /* * add in the trap definition object */ snmp_varlist_add_variable(&notification_vars, /* * the snmpTrapOID.0 variable */ objid_snmptrap, objid_snmptrap_len, /* * value type is an OID */ ASN_OBJECT_ID, /* * value contents is our notification OID */ (u_char *) notification_oid, /* * size in bytes = oid length * sizeof(oid) */ notification_oid_len * sizeof(oid)); /* * add in the additional objects defined as part of the trap */ snmp_varlist_add_variable(&notification_vars, hbeat_rate_oid, hbeat_rate_oid_len, ASN_INTEGER, (u_char *)&heartbeat_rate, sizeof(heartbeat_rate)); /* * if we want to insert additional objects, we do it here */ if (heartbeat_rate < 30 ) { snmp_varlist_add_variable(&notification_vars, hbeat_name_oid, hbeat_name_oid_len, ASN_OCTET_STR, heartbeat_name, strlen(heartbeat_name)); } /* * send the trap out. This will send it to all registered * receivers (see the "SETTING UP TRAP AND/OR INFORM DESTINATIONS" * section of the snmpd.conf manual page. */ ++count; DEBUGMSGTL(("example_notification", "sending trap %ld\n",count)); send_v2trap(notification_vars); /* * free the created notification variable list */ DEBUGMSGTL(("example_notification", "cleaning up\n")); snmp_free_varbind(notification_vars); }

mg-soft软件的安装目录中也包含了一些关于trap的mib库.例如UPS-MIB.my。其中有关于snmp trap的mib库编写方法。关键字,NOTIFICATION-TYPE。
upsTrapOnBattery NOTIFICATION-TYPE
       OBJECTS { upsEstimatedMinutesRemaining, upsSecondsOnBattery,
                 upsConfigLowBattTime }
       STATUS  current
       DESCRIPTION
               "The UPS is operating on battery power.  This trap is
               persistent and is resent at one minute intervals until
               the UPS either turns off or is no longer running on
               battery."
     ::= { upsTraps 1 }

   upsTrapTestCompleted NOTIFICATION-TYPE
       OBJECTS { upsTestId, upsTestSpinLock,
                 upsTestResultsSummary, upsTestResultsDetail,
                 upsTestStartTime, upsTestElapsedTime }
       STATUS  current
       DESCRIPTION
               "This trap is sent upon completion of a UPS diagnostic
               test."
     ::= { upsTraps 2 }

   upsTrapAlarmEntryAdded NOTIFICATION-TYPE
       OBJECTS {
            -- upsAlarmId,
            upsAlarmDescr }
       STATUS  current
       DESCRIPTION
               "This trap is sent each time an alarm is inserted into
               to the alarm table.  It is sent on the insertion of
               all alarms except for upsAlarmOnBattery and
               upsAlarmTestInProgress."
     ::= { upsTraps 3 }

   upsTrapAlarmEntryRemoved NOTIFICATION-TYPE
       OBJECTS {
            -- upsAlarmId,
            upsAlarmDescr }
       STATUS  current
       DESCRIPTION
               "This trap is sent each time an alarm is removed from
               the alarm table.  It is sent on the removal of all
               alarms except for upsAlarmTestInProgress."
     ::= { upsTraps 4 }

 

posted @ 2015-12-23 10:57  SuperTao1024  阅读(5056)  评论(0编辑  收藏  举报