SNMP代理:mib2c可以为InetAddress或String类型生成代码(即不是整数类型的代码)

时间:2017-10-26 10:24:12

标签: c snmp net-snmp mib snmpd

我能够将95%的专用MIB转换为C代码并使其在子代理中运行,如本Net-SNMP tutorial

的最后部分所述

为此,我自然而然地使用了 mib2c.mfd.conf (我刚刚读到 mfd 代表Mib For Dummies ......所有人都说...)< / p>

mib2c -I -c mib2c.mfd.conf my_mib_node

它生成了一个很长的.c文件,其中几乎所有的oid都是如下所示。

几乎没有为VideoInetAddr OID生成任何行

//ABSTRACT OF SOURCE FILE GENERATED BY MIB2C
//...

long    VideoFormat = 0;  /* XXX: set default value */
// <<<=== NOTHING GENERATED HERE FOR VideoInetAddr OF TYPE INETADDRESS
// WHEREAS OTHER INTEGERS ARE NORMALLY PRESENT
long    VideoInetPort = 0;  /* XXX: set default value */
//...

void init_my_mib_node(void)
{
 //...

    const oid VideoFormat_oid[] = { 1,3,6,1,4,1,a,b,c,d,e };
    static netsnmp_watcher_info VideoFormat_winfo;
    // <<<=== NO OID GENERATED for VideoInetAddr OF TYPE INETADDRESS
    // WHEREAS OTHER OIDs ARE NORMALLY GENERATED
    static netsnmp_watcher_info VideoInetAddr_winfo; //We have the winfo after all
    const oid VideoInetPort_oid[] = { 1,3,6,1,4,1,a,b,c,d,g };
    static netsnmp_watcher_info VideoInetPort_winfo;

    DEBUGMSGTL(("my_mib_node",
    "Initializing VideoFormat scalar integer.  Default value = %d\n",
                VideoFormat));

    reg = netsnmp_create_handler_registration(
         "VideoFormat", NULL,
          VideoFormat_oid, OID_LENGTH(VideoFormat_oid),
          HANDLER_CAN_RWRITE);

    netsnmp_init_watcher_info(&VideoFormat_winfo, &VideoFormat, 
    sizeof(long),ASN_INTEGER, WATCHER_FIXED_SIZE);

   if (netsnmp_register_watched_scalar( reg, &VideoFormat_winfo ) < 0 ) {
    snmp_log( LOG_ERR, "Failed to register watched VideoFormat" );
   //...
}

这很好用,需要5分钟(没有代码可以编写,只需调用init()函数),我能够获取并设置所有...整数...

未生成某些类型为InetAddress的oid,也未生成字符串

问题

  • 是否有能够为每种类型生成代码的mib conf文件

我尝试了 mib2c.old-api.conf ,它也为非整数oid生成代码,但我发现它不方便。有更多样板代码可供编写。

2 个答案:

答案 0 :(得分:1)

是的,mib2c 可以生成IP地址代码。 我不能说mfd这样做,但是,肯定有些mib2c.iterate.conf(对于表格)这样做。

SNMP中的IP类型是 ASN_IPADDRESS ,在C中由 unint32_t 表示。 此外,您需要确保在代表IP的对象的MIB文件中,您有&#34; SYNTAX IpAddress &#34;。

看看: at the MIB file with IP objectimplementation in C

答案 1 :(得分:0)

答案但是我离理解还很远,所以副问题仍然存在

非常务实,我设法手动添加

//I put here ONLY what I added, see question above to complete code
#define STR_LENGTH_IPV4 sizeof("xxx.yyy.zzz.www")
char   VideoInetAddr[STR_LENGTH_IPV4] = "192.168.2.3";
//...
const oid VideoInetAddr_oid[] = { 1,3,6,1,4,1,a,b,c,d,f };

reg = netsnmp_create_handler_registration(
         "VideoInetAddr", NULL,
          VideoInetAddr_oid, OID_LENGTH(VideoInetAddr_oid),
          HANDLER_CAN_RWRITE);

netsnmp_init_watcher_info(&VideoInetAddr_winfo, &VideoInetAddr, sizeof(VideoInetAddr),
              ASN_OCTET_STR,  WATCHER_MAX_SIZE );

if (netsnmp_register_watched_scalar( reg, &VideoInetAddr_winfo ) < 0 ) {
    snmp_log( LOG_ERR, "Failed to register watched VideoInetAddr" );
}

它仍然需要完全理解像WATCHER_MAX_SIZE这样的选项(它是好的吗?)