我使用TNM4J库在Java中编写了一个SNMP监听器,该库使用SNMP4J库。
侦听器能够读取已接收的陷阱,但似乎在表中编入索引的陷阱除外。
侦听器正在侦听来自Ericsson对象的陷阱,这意味着我正在使用ERICSSON-ALARM-MIB并且需要MIB导入。我收到的陷阱是带有OID .1.3.6.1.4.1.193.183.4.1.3.5.1.5的eriAlarmActiveManagedObject,但我也在本地使用表中的其他陷阱进行了测试,发生了同样的错误
如果看一下https://mibs.observium.org/mib/ERICSSON-ALARM-MIB/:
所有来自这样的表的陷阱都不能被侦听器读取。它从TNM4J库中的MibbleIndexExtractor.java中的extractIndexes方法中提供了一个索引超出范围的异常。
@Override
public IndexDescriptor[] extractIndexes(String instanceOid) {
String oid = symbol.getValue().toString();
String suboid = instanceOid.substring(oid.length() + 1);
int[] components = oidToArray(suboid);
int offset = 0;
IndexDescriptor[] descriptors = new IndexDescriptor[indexes.length];
for (int i = 0; i < indexes.length; i++) {
SnmpIndex index = indexes[i];
MibValueSymbol indexSymbol = symbol.getMib().getSymbolByOid(index.getValue().toString());
MibType indexType = ((SnmpObjectType) indexSymbol.getType()).getSyntax();
int length = fixedLength(indexType);
boolean implied = length != -1 || index.isImplied();
if (length == -1) {
length = variableLength(indexType, components, offset, index.isImplied());
}
int[] encoded = new int[length];
System.arraycopy(components, offset, encoded, 0, length);
descriptors[i] = new MibbleIndexDescriptor(indexSymbol, encoded, implied);
offset += length;
}
return descriptors;
}
我调试了它,这是因为oid String和instanceOid String是相同的,当然会导致创建子类String的异常。
但是在所有其他陷阱上它从不调用此extractIndexes方法,但只是正常工作并正确打印出陷阱和oid名称。
有关如何解决此问题的任何建议?
在与TNM4J的开发人员联系后,他对他的图书馆进行了一些修复。
之后,爱立信的oids被正确翻译。 oid有一些缺失的翻译,这是因为MIB的加载顺序。
重新调整这些使它工作。
对于任何感兴趣的人,与开发人员的故障排除过程可以在这里查看:https://github.com/soulwing/tnm4j/issues/9