网站导航: 首页 > 设计参考 > 正文 文章搜索
uclinux平台下ucd-snmp的编译
 
文章编号:
091114110906
文章分类: 单片机 ARM
点 击:
...
关 键 词: uclinux,ucd-snmp
文章来源:
网络
摘 要:
编译环境:操作系统:uClinux-ifax-2007-03-16.tar.gz;交叉编译工具:arm-elf-tools-20030314.sh ; 硬件平台:Samsung 4510B (snds-100)

一、开发环境:

  1.   操作系统:uClinux-ifax-2007-03-16.tar.gz
  2.   交叉编译工具:arm-elf-tools-20030314.sh
  3.   硬件平台:Samsung 4510B (snds-100)

二、编译ucd-snmp主要步骤
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
 
syslocation  xi'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
 
syscontact  lazy_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]
 
rwuser  rw3 noauth
 
# rwcommunity: a SNMPv1/SNMPv2c read-write access community name
#   arguments:  community [default|hostname|network/bits] [oid]
 
rwcommunity  rw12  
  
###########################################################################
# SECTION: Trap Destinations
#
#   Here we define who the agent will send traps to.
 
# trap2sink: A SNMPv2c trap receiver
#   arguments: host [community] [portnum]
 
trap2sink  202.117.129.75  
 
3.编译生成image.rom并下载到目标板上,运行如下:

4.在开发主机上进行验证 

三、扩展ucdsnmp主要步骤
1.主要修改的文件
MIB文件:定义扩展的MIB库
编译的头文件:需要修改头文件,使得编译时包括用户扩展的功能
.c文件:实现SNMP get,set,trap等功能
.h文件:头文件

2.MIB文件
/uClinux-dist/user/ucdsnmp/mibs/UCD-DEMO-MIB.txt
其中定义了用户扩展的agent管理节点
 

 
  1. UCD-DEMO-MIB DEFINITIONS ::= BEGIN    
  2. IMPORTS   
  3.     MODULE-IDENTITY, OBJECT-TYPE, Integer32 FROM SNMPv2-SMI   
  4.     ucdavis                                          FROM UCD-SNMP-MIB;   
  5.     
  6. ucdDemoMIB MODULE-IDENTITY   
  7.     LAST-UPDATED "9912090000Z"  
  8.     ORGANIZATION "University of California, Davis"  
  9.     CONTACT-INFO   
  10.          "The ucd-snmp-coders mailing list is the best place to    
  11.           write for public questions about the ucd-snmp   
  12.           project: ucd-snmp-coders@ucd-snmp.ucdavis.edu   
  13.     
  14.           Primary Author: Wes Hardaker   
  15.     
  16.           postal:     IT-DCAS   
  17.                      UCDavis   
  18.                       Davis CA  95616   
  19.          phone:      +1 530 754-7571   
  20.          email:      wjhardaker@ucdavis.edu"   
  21.     DESCRIPTION   
  22.          "The UCD-SNMP Demonstration MIB."  
  23.     REVISION       "9912090000Z"  
  24.     DESCRIPTION   
  25.          "SMIv2 version converted from older MIB definitions."  
  26. ::= { ucdavis 14 }   
  27. //该节点位于ucdavis下的第14个节点   
  28.     
  29. ucdDemoMIBObjects OBJECT IDENTIFIER ::= { ucdDemoMIB 1 }   
  30. //在UCD-SNMP-MIB中定义,   
  31. // --   ucdDemoMIB       OBJECT IDENTIFIER ::= { ucdavis  14 } - UCD-DEMO-MIB   
  32. //OID: ucdavis.14.1   
  33.     
  34. ucdDemoPublic OBJECT IDENTIFIER ::= { ucdDemoMIBObjects 1 }   
  35. //OID: ucdavis.14.1.1   
  36.     
  37. ucdDemoResetKeys OBJECT-TYPE   
  38.     SYNTAX        Integer32 (0..2147483647)   
  39.     MAX-ACCESS    read-write   
  40.     STATUS        current   
  41.     DESCRIPTION   
  42.          "A set of value 1 to this object resets the   
  43.           demonstration user's auth and priv keys to the   
  44.           keys based on the P->Ku->Kul transformation of the   
  45.           value of the ucdDemoPasspharse object.   
  46.     
  47.           Values other than 1 are ignored."   
  48. ::= { ucdDemoPublic 1 }   
  49. //OID: ucdavis.14.1.1   
  50.     
  51. ucdDemoPublicString OBJECT-TYPE   
  52.     SYNTAX        OCTET STRING (SIZE(0..1024))   
  53.     MAX-ACCESS    read-write   
  54.     STATUS        current   
  55.     DESCRIPTION   
  56.          "A publicly settable string that can be set for testing    
  57.           snmpsets.  This value has no real usage other than   
  58.           testing purposes."   
  59.     ::= { ucdDemoPublic 2 }   
  60.     
  61. ucdDemoUserList OBJECT-TYPE   
  62.     SYNTAX        OCTET STRING   
  63.     MAX-ACCESS    read-only   
  64.     STATUS        current   
  65.     DESCRIPTION   
  66.          "The list of users affected by the ucdDemoResetKeys object."  
  67.     ::= { ucdDemoPublic 3 }   
  68.     
  69. ucdDemoPassphrase  OBJECT-TYPE   
  70.     SYNTAX        OCTET STRING   
  71.     MAX-ACCESS    read-only   
  72.     STATUS        current   
  73.     DESCRIPTION   
  74.          "The demo passphrase that ucdDemoResetKeys changes each    
  75.           users localized key to based on the P->Ku->Kul transformation."   
  76.     ::= { ucdDemoPublic 4 }   
  77.     
  78. //定义了2个trap类型的节点   
  79. TheTrap1 NOTIFICATION-TYPE   
  80.          STATUS current   
  81.          DESCRIPTION   
  82.                  "This is 1st trap."  
  83.          ::= { ucdDemoPublic 5 }   
  84. //OID: ucdavis.14.1.5   
  85.     
  86.     
  87. TheTrap2 NOTIFICATION-TYPE   
  88.          SYNTAX Integer32   
  89.          MAX-ACCESS       read-write   
  90.          STATUS   mandatory   
  91.          DESCRIPTION   
  92.                  "This is 2nd trap."  
  93.          ::= { ucdDemoPublic 6 }   
  94. //OID: ucdavis.14.1.6   
  95.     
  96. END   


2.编译的头文件
/uClinux-dist/user/ucdsnmp/agent/Makefile
在MIBOBJS中增加需要编译的c文件的目标文件名称:
MIBOBJS         =   mibgroup/mibII/system_mib.o  mibgroup/misc/ipfwacc.o mibgroup/mibII/sysORTable.o  mibgroup/mibII/at.o  mibgroup/mibII/interfaces.o  mibgroup/mibII/snmp_mib.o  mibgroup/mibII/tcp.o  mibgroup/mibII/icmp.o  mibgroup/mibII/ip.o  mibgroup/mibII/udp.o  mibgroup/mibII/vacm_vars.o  mibgroup/ucd-snmp/memory.o  mibgroup/ucd-snmp/proc.o  mibgroup/ucd-snmp/versioninfo.o  mibgroup/ucd-snmp/pass.o  mibgroup/ucd-snmp/pass_persist.o  mibgroup/ucd-snmp/disk.o  mibgroup/ucd-snmp/loadave.o  mibgroup/ucd-snmp/extensible.o  mibgroup/ucd-snmp/errormib.o  mibgroup/ucd-snmp/registry.o  mibgroup/ucd-snmp/file.o  mibgroup/snmpv3/snmpEngine.o  mibgroup/snmpv3/snmpMPDStats.o  mibgroup/snmpv3/usmStats.o  mibgroup/snmpv3/usmUser.o  mibgroup/util_funcs.o  mibgroup/mibII/var_route.o  mibgroup/mibII/route_write.o    mib_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中增加自定义的初始化函数名称

 
  1. /* This file is automatically generated by configure.  Do not modify by hand. */  
  2.   init_system_mib();   
  3.   init_sysORTable();   
  4.   init_at();   
  5.   init_interfaces();   
  6.   init_snmp_mib();   
  7.   init_tcp();   
  8.   init_icmp();   
  9.   init_ip();   
  10.   init_udp();   
  11.   init_vacm_vars();   
  12.   init_memory();   
  13.   init_proc();   
  14.   init_versioninfo();   
  15.   init_pass();   
  16.   init_pass_persist();   
  17.   init_disk();   
  18.   init_loadave();   
  19.   init_extensible();   
  20.   init_errormib();   
  21.   init_registry();   
  22.   init_file();   
  23.   init_snmpEngine();   
  24.   init_snmpMPDStats();   
  25.   init_usmStats();   
  26.   init_usmUser();   
  27.   init_var_route();   
  28.   init_ipfwacc();   
  29.   init_ucdDemoPublic();   
  30.   
  31. /uClinux-dist/user/ucdsnmp/agent/mibgroup/mib_module_includes.h中增加自定义的头文件名称   
  32.   
  33. /* This file is automatically generated by configure.  Do not modify by hand. */  
  34. #include "mibgroup/mibII.h"   
  35. #include "mibgroup/ucd_snmp.h"   
  36. #include "mibgroup/snmpv3mibs.h"   
  37. #include "mibgroup/mibII/system_mib.h"   
  38. #include "mibgroup/mibII/sysORTable.h"   
  39. #include "mibgroup/mibII/at.h"   
  40. #include "mibgroup/mibII/interfaces.h"   
  41. #include "mibgroup/mibII/snmp_mib.h"   
  42. #include "mibgroup/mibII/tcp.h"   
  43. #include "mibgroup/mibII/icmp.h"   
  44. #include "mibgroup/mibII/ip.h"   
  45. #include "mibgroup/mibII/udp.h"   
  46. #include "mibgroup/mibII/vacm_vars.h"   
  47. #include "mibgroup/ucd-snmp/memory.h"   
  48. #include "mibgroup/ucd-snmp/proc.h"   
  49. #include "mibgroup/ucd-snmp/versioninfo.h"   
  50. #include "mibgroup/ucd-snmp/pass.h"   
  51. #include "mibgroup/ucd-snmp/pass_persist.h"   
  52. #include "mibgroup/ucd-snmp/disk.h"   
  53. #include "mibgroup/ucd-snmp/loadave.h"   
  54. #include "mibgroup/ucd-snmp/extensible.h"   
  55. #include "mibgroup/ucd-snmp/errormib.h"   
  56. #include "mibgroup/ucd-snmp/registry.h"   
  57. #include "mibgroup/ucd-snmp/file.h"   
  58. #include "mibgroup/snmpv3/snmpEngine.h"   
  59. #include "mibgroup/snmpv3/snmpMPDStats.h"   
  60. #include "mibgroup/snmpv3/usmStats.h"   
  61. #include "mibgroup/snmpv3/usmUser.h"   
  62. #include "mibgroup/util_funcs.h"   
  63. #include "mibgroup/mibII/var_route.h"   
  64. #include "mibgroup/mibII/route_write.h"   
  65. #include "mibgroup/misc/ipfwacc.h"   
  66. #include "mibgroup/examples/ucdDemoPublic.h"   
  67.   
  68. 3..c文件:实现SNMP get,set,trap等功能   
  69. /uClinux-dist/user/ucdsnmp/agent/mibgroup/examples/ucdDemoPublic.c   
  70.   
  71. /* ucdDemoPublic.c */  
  72. #include <stdio.h>   
  73. #include <errno.h>   
  74. #include <stdlib.h>   
  75. #include <unistd.h>   
  76. #include <fcntl.h>   
  77.     
  78. #include <config.h>   
  79.     
  80. #include "mibincl.h"   
  81. #include "snmpv3.h"   
  82. #include "snmpusm.h"   
  83. #include "agent_read_config.h"   
  84. #include "ucdDemoPublic.h"   
  85. #include "util_funcs.h"   
  86.     
  87. #define MYMAX 1024   
  88. #define MAXUSERS 10   
  89.     
  90. int num=0;   
  91. static char demoUsers[MAXUSERS][MYMAX+1];   
  92. static char demopass[MYMAX+1];   
  93.     
  94. char mynode_str[300];   
  95.     
  96. void ucdDemo_parse_user(const char *word, char *line) {   
  97.   if (num == MAXUSERS)   
  98.     return;   
  99.     
  100.   if (strlen(line) > MYMAX)   
  101.     return;   
  102.      
  103.   strcpy(demoUsers[num++], line);   
  104. }   
  105.     
  106. void ucdDemo_parse_userpass(const char *word, char *line) {   
  107.   if (strlen(line) > MYMAX)   
  108.     return;   
  109.      
  110.   strcpy(demopass, line);   
  111. }   
  112.     
  113. /* this variable defines function callbacks and type return information   
  114.    for the ucdDemoPublic mib */  
  115.     
  116. //与MIB中的定义相对应   
  117. struct variable2 ucdDemoPublic_variables[] = {   
  118.   { UCDDEMORESETKEYS    , ASN_INTEGER   , RWRITE, var_ucdDemoPublic, 1, { 1 } },   
  119.   { UCDDEMOPUBLICSTRING , ASN_OCTET_STR , RWRITE, var_ucdDemoPublic, 1, { 2 } },   
  120.   { UCDDEMOUSERLIST     , ASN_OCTET_STR , RWRITE, var_ucdDemoPublic, 1, { 3 } },   
  121.   { UCDDEMOPASSPHRASE   , ASN_OCTET_STR , RWRITE, var_ucdDemoPublic, 1, { 4 } },   
  122.   { 5, ASN_INTEGER, RWRITE, var_ucdDemoPublic, 1, {5}},   
  123.   { 6, ASN_INTEGER, RWRITE, var_ucdDemoPublic, 1, {6}}   
  124. };   
  125.     
  126. /* Define the OID pointer to the top of the mib tree that we're  
  127.    registering underneath */  
  128. oid ucdDemoPublic_variables_oid[] = { 1,3,6,1,4,1,2021,14,1,1 };   
  129.     
  130. void init_ucdDemoPublic(void) {   
  131.   REGISTER_MIB( "examples/ucdDemoPublic", ucdDemoPublic_variables,   
  132.                  variable2, ucdDemoPublic_variables_oid);   
  133.   snmpd_register_config_handler("demoUser", ucdDemo_parse_user, NULL, "USER");   
  134.   snmpd_register_config_handler("demoPass", ucdDemo_parse_userpass, NULL, "PASSPHASE");   
  135.   //定义定时的trap发送   
  136.   snmp_alarm_register(10, SA_REPEAT, snmploop_callback, NULL);   
  137. }   
  138.     
  139. //定义自定义的定时trap动作   
  140. void snmploop_callback(unsigned int reg, void *clientarg){   
  141.          send_easy_trap(SNMP_TRAP_ENTERPRISESPECIFIC, 1);   
  142. }   
  143.     
  144. unsigned char publicString[MYMAX+1];   
  145. long long_ret;   
  146.     
  147. unsigned char *   
  148. var_ucdDemoPublic(   
  149.     struct variable *vp,   
  150.     oid     *name,   
  151.     size_t  *length,   
  152.     int     exact,   
  153.     size_t  *var_len,   
  154.     WriteMethod **write_method)   
  155. {   
  156. //  static long long_ret;   
  157.   static char string[MYMAX+1], *cp;   
  158.   int i;   
  159.      
  160.   *write_method = 0;           /* assume it isnt writable for the time being */  
  161.   *var_len = sizeof(long_ret); /* assume an integer and change later if not */  
  162.     
  163.   if (header_generic(vp,name,length,exact,var_len,write_method))   
  164.       return 0;   
  165.     
  166.   /* this is where we do the value assignments for the mib results. */  
  167.   switch(vp->magic) {   
  168.     
  169.     case UCDDEMORESETKEYS:   
  170.       *write_method = write_ucdDemoResetKeys;   
  171.       //long_ret = 0;   
  172.       return (unsigned char *) &long_ret;   
  173.     
  174.     case UCDDEMOPUBLICSTRING:   
  175.       *write_method = write_ucdDemoPublicString;   
  176.       *var_len = strlen(publicString);   
  177.       return (unsigned char *) publicString;   
  178.     
  179.     case UCDDEMOUSERLIST:   
  180.       cp = string;   
  181.       for(i=0; i < num; i++) {   
  182.         sprintf(cp, " %s", demoUsers[i]);   
  183.         cp = cp + strlen(cp);   
  184.       }   
  185.       *var_len = strlen(string);   
  186.       return (unsigned char *) string;   
  187.          
  188.     case UCDDEMOPASSPHRASE:   
  189.       *var_len = strlen(demopass);   
  190.       return (unsigned char *) demopass;   
  191.   
  192.     case 5:   
  193.           long_ret=0;   
  194.           *write_method = write_mynodetrap;   
  195.           return (u_char *)&long_ret;   
  196.   
  197.    case 6:   
  198.         /*  
  199.          * This object is essentially "write-only".  
  200.          * It only exists to trigger the sending of a v2 trap.  
  201.          * Reading it will always return 0.  
  202.          */  
  203.         long_ret = 0; /*FIX*/  
  204.         *write_method = write_mynodetrap2;   
  205.         return (u_char *)&long_ret;   
  206.         
  207.     default:   
  208.       DEBUGMSGTL(("snmpd""unknown sub-id %d in var_ucdDemoPublic ", vp->magic));   
  209.   }   
  210.   return 0;   
  211. }   
  212.     
  213. int  
  214. write_ucdDemoResetKeys(   
  215.    int      action,   
  216.    u_char   *var_val,   
  217.    u_char   var_val_type,   
  218.    size_t   var_val_len,   
  219.    u_char   *statP,   
  220.    oid      *name,   
  221.    size_t   name_len)   
  222. {   
  223.   /* variables we may use later */  
  224.   //static long long_ret;   
  225.   static unsigned char string[1500];   
  226.   static oid objid[MAX_OID_LEN];   
  227.   static struct counter64 c64;   
  228.   int bigsize=1000;   
  229.   unsigned char *engineID;   
  230.   int engineIDLen;   
  231.   int i;   
  232.   struct usmUser *user;   
  233.     
  234.   if (var_val_type != ASN_INTEGER) {   
  235.          printf("ASN_INTEGER ");   
  236.       DEBUGMSGTL(("ucdDemoPublic","write to ucdDemoResetKeys not ASN_INTEGER "));   
  237.       return SNMP_ERR_WRONGTYPE;   
  238.   }   
  239.   if (var_val_len > sizeof(long_ret)) {   
  240.       DEBUGMSGTL(("ucdDemoPublic","write to ucdDemoResetKeys: bad length "));   
  241.       return SNMP_ERR_WRONGLENGTH;   
  242.   }   
  243.   if (action == COMMIT) {   
  244.          int fd = open("/dev/lamp", O_RDWR, 0644);   
  245.          if(fd<0){   
  246.                  printf("open /dev/lamp error ");    
  247.                  return SNMP_ERR_NOERROR;   
  248.          }   
  249.          printf("new value: %x ", *(long*)var_val);   
  250.     
  251.          if( *(long *)var_val == 0) write(fd,"00 ", 3);   
  252.          if( *(long *)var_val == 1) write(fd,"01 ", 3);   
  253.          if( *(long *)var_val == 2) write(fd,"10 ", 3);   
  254.          if( *(long *)var_val == 3) write(fd,"11 ", 3);   
  255.     
  256.          close(fd);   
  257.                     
  258.       long_ret = *((long *) var_val);   
  259.       /*if (long_ret == 1) {  
  260.         engineID = snmpv3_generate_engineID(&engineIDLen);  
  261.         for(i=0; i < num; i++) {  
  262.           user = usm_get_user(engineID, engineIDLen, demoUsers[i]);  
  263.           if (user) {  
  264.             usm_set_user_password(user, "userSetAuthPass", demopass);  
  265.             usm_set_user_password(user, "userSetPrivPass", demopass);  
  266.           }  
  267.         }  
  268.          reset the keys   
  269.       }*/  
  270.   }   
  271.   return SNMP_ERR_NOERROR;   
  272. }   
  273.     
  274. int  
  275. write_ucdDemoPublicString(   
  276.    int      action,   
  277.    u_char   *var_val,   
  278.    u_char   var_val_type,   
  279.    size_t   var_val_len,   
  280.    u_char   *statP,   
  281.    oid      *name,   
  282.    size_t   name_len)   
  283. {   
  284.   if (var_val_type != ASN_OCTET_STR) {   
  285.       DEBUGMSGTL(("ucdDemoPublic","write to ucdDemoPublicString not ASN_OCTET_STR "));   
  286.       return SNMP_ERR_WRONGTYPE;   
  287.   }   
  288.   if (var_val_len > MYMAX) {   
  289.       DEBUGMSGTL(("ucdDemoPublic","write to ucdDemoPublicString: bad length "));   
  290.       return SNMP_ERR_WRONGLENGTH;   
  291.   }   
  292.   if (action == COMMIT) {   
  293.       strcpy(publicString, var_val);   
  294.   }   
  295.   return SNMP_ERR_NOERROR;   
  296. }   
  297.     
  298. int write_mynodetrap(int action,   
  299.                   u_char * var_val,   
  300.                   u_char var_val_type,   
  301.                   size_t var_val_len,   
  302.                   u_char * statP, oid * name, size_t name_len)   
  303. {   
  304.     long            intval;   
  305.     DEBUGMSGTL(("mynode""write_mynodetrap entered: action=%d ",   
  306.                 action));   
  307.     switch (action) {   
  308.     case RESERVE1:      
  309.         /*  
  310.          *  The only acceptable value is the integer 1  
  311.          */  
  312.         if (var_val_type != ASN_INTEGER) {   
  313.             DEBUGMSGTL(("mynode""%x not integer type", var_val_type));   
  314.             return SNMP_ERR_WRONGTYPE;   
  315.         }   
  316.         if (var_val_len > sizeof(long)) {   
  317.             DEBUGMSGTL(("mynode""wrong length %x", var_val_len));   
  318.             return SNMP_ERR_WRONGLENGTH;   
  319.         }   
  320.     
  321.         intval = *((long *) var_val);   
  322.         if (intval != 1) {   
  323.             DEBUGMSGTL(("mynode""wrong value %x", intval));   
  324.             return SNMP_ERR_WRONGVALUE;   
  325.         }   
  326.         break;   
  327.     
  328.     case RESERVE2:   
  329.         /*  
  330.          * No resources are required....   
  331.          */  
  332.         break;   
  333.     
  334.     case FREE:   
  335.         /*  
  336.          * ... so no resources need be freed   
  337.          */  
  338.         break;   
  339.     
  340.     case ACTION:   
  341.         /*  
  342.          *  Having triggered the sending of a trap,  
  343.          *   it would be impossible to revoke this,  
  344.          *   so we can't actually invoke the action here.  
  345.          */  
  346.         break;   
  347.     
  348.     case UNDO:   
  349.         /*  
  350.          * We haven't done anything yet,  
  351.          * so there's nothing to undo   
  352.          */  
  353.         break;   
  354.     
  355.     case COMMIT:   
  356.         /*  
  357.          *  Everything else worked, so it's now safe  
  358.          *   to trigger the trap.  
  359.          *  Note that this is *only* acceptable since  
  360.          *   the trap sending routines are "failsafe".  
  361.          *  (In fact, they can fail, but they return no  
  362.          *   indication of this, which is the next best thing!)  
  363.          */  
  364.         DEBUGMSGTL(("mynode""write_mynodetrap sending the trap ",   
  365.                     action));   
  366.         send_easy_trap(SNMP_TRAP_ENTERPRISESPECIFIC, 99);   
  367.         DEBUGMSGTL(("mynode""write_mynodetrap trap sent ", action));   
  368.         break;   
  369.     
  370.     }   
  371.     return SNMP_ERR_NOERROR;   
  372. }   
  373.     
  374. /*  
  375.  * this documents how to send a SNMPv2 (and higher) trap via the  
  376.  * send_v2trap() API.  
  377.  *   
  378.  * Coding SNMP-v2 Trap:  
  379.  *   
  380.  * The SNMPv2-Trap PDU contains at least a pair of object names and  
  381.  * values: - sysUpTime.0 whose value is the time in hundredths of a  
  382.  * second since the netwok management portion of system was last  
  383.  * reinitialized.  - snmpTrapOID.0 which is part of the trap group SNMPv2  
  384.  * MIB whose value is the object-id of the specific trap you have defined  
  385.  * in your own MIB.  Other variables can be added to caracterize the  
  386.  * trap.  
  387.  *   
  388.  * The function send_v2trap adds automaticallys the two objects but the  
  389.  * value of snmpTrapOID.0 is 0.0 by default. If you want to add your trap  
  390.  * name, you have to reconstruct this object and to add your own  
  391.  * variable.  
  392.  *   
  393.  */  
  394.      
  395. int write_mynodetrap2(int action,   
  396.                    u_char * var_val,   
  397.                    u_char var_val_type,   
  398.                    size_t var_val_len,   
  399.                    u_char * statP, oid * name, size_t name_len)   
  400. {   
  401.     long            intval;   
  402.     /*  
  403.      * these variales will be used when we send the trap   
  404.      */  
  405.     oid             objid_snmptrap[] = { 1, 3, 6, 1, 6, 3, 1, 1, 4, 1, 0 };/* snmpTrapOID.0 */  
  406.     oid             demo_trap[] = { 1, 3, 6, 1, 4, 1, 2021, 13, 990 };  /*demo-trap */  
  407.     oid             mynode_string_oid[] =   
  408.         { 1, 3, 6, 1, 4, 1, 2021, 254, 1, 0 };   
  409.     
  410.     static struct variable_list var_trap;   
  411.     static struct variable_list var_obj;   
  412.     
  413.     DEBUGMSGTL(("mynode""write_mynodetrap2 entered: action=%d ",   
  414.                 action));   
  415.     switch (action) {   
  416.     case RESERVE1:   
  417.         /*  
  418.          *  The only acceptable value is the integer 1  
  419.          */  
  420.         if (var_val_type != ASN_INTEGER) {   
  421.             DEBUGMSGTL(("mynode""%x not integer type", var_val_type));   
  422.             return SNMP_ERR_WRONGTYPE;   
  423.         }   
  424.         if (var_val_len > sizeof(long)) {   
  425.             DEBUGMSGTL(("mynode""wrong length %x", var_val_len));   
  426.             return SNMP_ERR_WRONGLENGTH;   
  427.         }   
  428.     
  429.         intval = *((long *) var_val);   
  430.         if (intval != 1) {   
  431.             DEBUGMSGTL(("mynode""wrong value %x", intval));   
  432.             return SNMP_ERR_WRONGVALUE;   
  433.         }   
  434.         break;   
  435.     
  436.     case RESERVE2:   
  437.         /*  
  438.          * No resources are required....   
  439.          */  
  440.         break;   
  441.     
  442.     case FREE:   
  443.         /*  
  444.          * ... so no resources need be freed   
  445.          */  
  446.         break;   
  447.     
  448.     case ACTION:   
  449.         /*  
  450.          *  Having triggered the sending of a trap,  
  451.          *   it would be impossible to revoke this,  
  452.          *   so we can't actually invoke the action here.  
  453.          */  
  454.           
  455.         //mynode_int = intval;   
  456.         //Temp_ret=intval;   
  457.         break;   
  458.     
  459.     case UNDO:   
  460.         /*  
  461.          * We haven't done anything yet,  
  462.          * so there's nothing to undo   
  463.          */  
  464.            
  465.         break;   
  466.     
  467.     case COMMIT:   
  468.         /*  
  469.          *  Everything else worked, so it's now safe  
  470.          *   to trigger the trap.  
  471.          *  Note that this is *only* acceptable since  
  472.          *   the trap sending routines are "failsafe".  
  473.          *  (In fact, they can fail, but they return no  
  474.          *   indication of this, which is the next best thing!)  
  475.          */  
  476.     
  477.         /*  
  478.          * trap definition objects   
  479.          */  
  480.     
  481.         //Temp_ret=intval;   
  482.     
  483.         var_trap.next_variable = &var_obj;      /* next variable */  
  484.         var_trap.name = objid_snmptrap;        /* snmpTrapOID.0 */  
  485.         var_trap.name_length = sizeof(objid_snmptrap) / sizeof(oid);    /* number of sub-ids */  
  486.         var_trap.type = ASN_OBJECT_ID;     
  487.         var_trap.val.objid = demo_trap; /* demo-trap objid   */  
  488.         var_trap.val_len = sizeof(demo_trap);    /* length in bytes (not number of subids!) */  
  489.      
  490.         /*  
  491.          * additional objects   
  492.          */  
  493.             
  494.         strcpy(mynode_str, "HHHHHHHHHHH");   
  495.         var_obj.next_variable = NULL;   /* No more variables after this one */  
  496.         var_obj.name = mynode_string_oid;     
  497.       ;   var_obj.name_length = sizeof(mynode_string_oid) / sizeof(oid); /* number of sub-ids */  
  498.         var_obj.type = ASN_OCTET_STR;   /* type of variable */  
  499.         var_obj.val.string = mynode_str; /* value */  
  500.         var_obj.val_len = strlen(mynode_str);   
  501.         DEBUGMSGTL(("mynode""write_mynodetrap2 sending the v2 trap ",   
  502.                     action));   
  503.         send_v2trap(&var_trap);   
  504.         DEBUGMSGTL(("mynode""write_mynodetrap2 v2 trap sent ",   
  505.                     action));      
  506.     
  507.         break;   
  508.     
  509.     }   
  510.     return SNMP_ERR_NOERROR;   
  511. }   
  512.      
  513.  4..h文件:头文件   
  514. /uClinux-dist/user/ucdsnmp/agent/mibgroup/examples/ ucdDemoPublic.h   
  515. /* ucdDemoPublic.h */  
  516.     
  517. #ifndef _MIBGROUP_UCDDEMOPUBLIC_H   
  518. #define _MIBGROUP_UCDDEMOPUBLIC_H   
  519.     
  520. #include <snmp_api.h>   
  521. #include <snmp_alarm.h>   
  522.     
  523. /* we use header_generic and checkmib from the util_funcs module */  
  524.     
  525. config_require(util_funcs)   
  526.     
  527. /* Magic number definitions: */  
  528.     
  529. #define   UCDDEMORESETKEYS      1   
  530. #define   UCDDEMOPUBLICSTRING   2   
  531. #define   UCDDEMOUSERLIST       3   
  532. #define   UCDDEMOPASSPHRASE     4   
  533.     
  534. /* function definitions */  
  535.     
  536. extern void   init_ucdDemoPublic(void);   
  537. extern FindVarMethod var_ucdDemoPublic;   
  538.     
  539. //自定义的定时trap函数   
  540. SNMPAlarmCallback  snmploop_callback;   
  541. WriteMethod write_ucdDemoResetKeys;   
  542. WriteMethod write_ucdDemoPublicString;   
  543.     
  544. //自定义的函数声明   
  545. WriteMethod write_mynodetrap;   
  546. WriteMethod write_mynodetrap2;   
  547.     
  548. #endif /* _MIBGROUP_UCDDEMOPUBLIC_H */   
  549.   

 
四、调试输出
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报文的接收情况。

 
相关文章:

 
最新开源项目
 
 
  查看更多...  
 
本站相关产品   淘宝网店
 




 
  查看更多...  

 

本站程序由百合电子工作室开发和维护
Copyright @ baihe electric studio
渝ICP备09006681号-4