我正在尝试使用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。 请提供方向。
答案 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,而不使用像这样的严格子字符串。或尝试颠倒注册顺序。