3

我一直在使用此处找到的示例开发自己的 SNMP 代理:http: //www.net-snmp.org/dev/agent/example_8c_source.html

我想更好地组织我的树结构以使其更有意义,这反过来又使使用客户端命令更容易。

我正在使用传统的旧 C API 来实现这一点,这就是示例链接中使用的内容。

我有一棵要实现的树

示例 OID 树

我的 MIB:

    MIB-NAME-HERE DEFINITIONS ::= BEGIN

    IMPORTS
        MODULE-IDENTITY, OBJECT-TYPE, Integer32, enterprises,
        NOTIFICATION-TYPE                       FROM SNMPv2-SMI
        OBJECT-GROUP, NOTIFICATION-GROUP        FROM SNMPv2-CONF
    ;

    myProduct MODULE-IDENTITY
        LAST-UPDATED "201505200000Z"
        ORGANIZATION "www.example.com"
        CONTACT-INFO
             "email: support@example.com"
        DESCRIPTION
            "MIB Example."
        REVISION     "201505200000Z"
        DESCRIPTION
            "version 1.0"
        ::= { enterprises 54321 }

    --
    -- top level structure
    --
       IPConfig OBJECT IDENTIFIER ::= { myProduct 1 }
       Services OBJECT IDENTIFIER ::= { myProduct 3 }

    IPConfigValuesGroup OBJECT-GROUP
        OBJECTS { ObjectA,
                  ObjectB,
                  ObjectC
                }

        STATUS current
        DESCRIPTION
               "Group of all blahblah variables."

        ::= { myProduct 4 } <----**How would this affect a client request?**

    --
    -- Values
    --

    ObjectA OBJECT-TYPE
        SYNTAX      OCTET STRING (SIZE(1..4096))
        MAX-ACCESS  read-write
        STATUS      current
        DESCRIPTION
            "Test Example"
        ::= { IPConfig 1 }

    ObjectB OBJECT-TYPE
        SYNTAX      OCTET STRING (SIZE(1..4096))
        MAX-ACCESS  read-write
        STATUS      current
        DESCRIPTION
            "Test Example"
        ::= { IPConfig 2 } 

--MORE STUFF...
    .... END 

我希望能够将相关对象组合在一起,以便用户可以执行

snmpset -v 2c -c communityNameHere -m MIB-NAME-HERE.txt 10.20.30.40 1.3.6.1.4.1.54321.x.1.3 s "I am a string"

访问 IPConfig 组下的 ObjectC。

问题:如何在我的“子代理”中实现子树?

This is an excerpt from the link shown above.
    /*
     * This array defines the OID of the top of the mib tree that we're
     *  registering underneath.
     * Note that this needs to be the correct size for the OID being 
     *  registered, so that the length of the OID can be calculated.
     *  The format given here is the simplest way to achieve this.
     */
oid             example_variables_oid[] = { 1, 3, 6, 1, 4, 1, 54321, x};

我是否必须声明另一个数组以包含服务 OID?

oid             example_variables_oid[] = { 1, 3, 6, 1, 4, 1, 54321, x, 3};

或者对于每个子树,他们是否需要一个 example.c*-type* 文件?

问题:这个 MIB 能实现我想要的吗?需要做哪些不同的事情?我已经阅读了 OBJECT-GROUPS、SEQUENCE、O'Reily 的书以及 RFC。我仍在努力掌握一切。

4

1 回答 1

2

这里有很多问题,老实说,要回答所有问题需要很长的帖子。因此,我将在高层次上回答它们,然后为您提供一堆链接,以供您阅读更长、更深入的文章。

首先,编写 mibs 并不完全是直截了当的。关于这个主题的参考最多的书可能是理解 SNMP MIB并且非常好(我有一本)。你所有的 mib 写作问题都在那里得到了很好的回答,但是关于你上面的内容有几点要点:

1) 几乎所有 MIB 对象都应该以小写字母开头(除了您还没有使用的表序列)。

2) 上面的 oid 中没有“x”。例如,您已经在直接派生到 1.3.6.1.4.1.54321.1.3 的定义中创建了一个树结构。

3) 现在就扔掉对象组子句。一开始它只会让你感到困惑,并且不需要。它只是真正为列出您必须实现的对象编写标准定义以符合 mib(使用一致性声明)。对你现在来说,这根本不需要。干脆杀了整个人。

至于编写代码来支持您尝试定义的对象,您需要在您正在编写的代理或子代理中的 C 代码中执行此操作。Net-SNMP 项目站点上已经有很多关于此的文档,所以你真的应该去那里看看。可以帮助您入门的链接是:

通常如何为基于 net-smnp 的代理编写 mib 代码:

http://www.net-snmp.org/wiki/index.php/TUT:Writing_a_MIB_Module

如何使用 mib2c 翻译器生成一些模板代码开始:

http://www.net-snmp.org/wiki/index.php/TUT:mib2c_General_Overview

更一般地说,Net-SNMP 的所有编码教程都可以在这里找到:

http://www.net-snmp.org/wiki/index.php/Tutorials#Coding_Tutorials

最后一条评论:您在上面定义的对象称为“标量”。IE,树中只有一个实例。因此,当您阅读教程或它问您的 mib2c 问题时,以上是“标量”。表格可能会出现在您的项目中,因为每个人似乎最终都会使用表格!祝你好运!

于 2015-06-02T20:33:06.017 回答