使用snmp代理注册OID

时间:2014-05-19 09:18:42

标签: snmp snmp4j

我正在尝试使用snmp4j模拟SNMP代理。 我正在尝试将MO注册到代理商。 以下是代码段:

static final OID mo1= new OID("1.3.6.1.4.1.1234.1.104");
static final OID mo2= new OID("1.3.6.1.4.1.1234.1.104.1");
static final OID mo3= new OID("1.3.6.1.4.1.1234.1.104.1.1");

agent.registerManagedObject(MOCreator.createReadOnly(mo1,"m1"));
agent.registerManagedObject(MOCreator.createReadOnly(mo2,"m2"));                
agent.registerManagedObject(MOCreator.createReadOnly(mo3,"m3"));


public class MOCreator {

    public static MOScalar createReadOnly(OID oid,Object value ){
        return new MOScalar(oid,
                MOAccessImpl.ACCESS_READ_ONLY,
                getVariable(value));
    }

    private static Variable getVariable(Object value) {
        System.out.println("Value : "+value.toString());

        OctetString octetString = new OctetString((String)value);

        if(value instanceof String) {
            return octetString;
        }
        throw new IllegalArgumentException("Unmanaged Type: " + value.getClass());
    }

}

启动代理时,我收到DuplicateRegistrationException。 请指导我如何注册oids。 请提供方向。

2 个答案:

答案 0 :(得分:1)

实际上,正如塞思所说,选择OID似乎是无效的。

假设您有一个OID为1.3.6.1.4.1.1234.1.104的对象。

要么:

  • 这是一个标量,在这种情况下,其值为1.3.6.1.4.1.1234.1.104.0,或者
  • 这是一个表,在这种情况下,它具有值1.3.6.1.4.1.1234.1.104.<N>(但您无需注册这些单独的行)。

它可能是一个对象组而不是一个对象(例如文件夹),但是您也不注册其中任何一个。

在标量下不能有标量(或表),因此不能在代理中注册它们。

我不知道您的MIB是什么样子,想要保存什么样的数据以及如何组织它,就无法提出具体建议,但是似乎您在这里遇到了MIB设计问题。请确保在您的MIB上运行smilint,以验证其正确性。

答案 1 :(得分:0)

发件人:http://oosnmp.net/pipermail/snmp4j/2014-September/005416.html

  

SMI禁止在另一个OID下注册一个OID(实例   在实例内)。否则,对象的字典顺序   没有歧义就无法实现代理。

因此,我相信这种OID注册方法是不可能的。您应该尝试使用OID,而不使用像这样的严格子字符串。或尝试颠倒注册顺序。

相关问题