SNMP 侦听器无法从 table 中的条目 OID 中读取陷阱

SNMP Listener can not read trap from OIDs that are entries in a table

我在 Java 中使用 TNM4J 库编写了一个 SNMP 侦听器,该库使用 SNMP4J 库。

侦听器能够读取接收到的陷阱,但似乎在 table 中索引的陷阱除外。

侦听器正在侦听来自 Ericsson 对象的陷阱,这意味着我正在使用 ERICSSON-ALARM-MIB 和它需要的 MIB 导入。我收到的陷阱是 OID 为 .1.3.6.1.4.1.193.183.4.1.3.5.1.5 的 eriAlarmActiveManagedObject,但我也在本地用 table 中的其他陷阱对其进行了测试,同样的错误发生了

如果有人看 https://mibs.observium.org/mib/ERICSSON-ALARM-MIB/ :

像这样来自table的所有陷阱都无法被侦听器读取。 它给出了 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 相同,这当然会在创建 suboid String 时导致异常。

然而,在所有其他陷阱上,它从不调用此 extractIndexes 方法,但工作正常并正确打印出陷阱和 oid 名称。

关于如何解决这个问题有什么建议吗?

在与 TNM4J 的开发人员联系后,他对他的库进行了一些修复。

之后,Ericsson oids 被正确翻译。 oid 中缺少一些翻译,这是因为 MIB 的加载顺序。

重新调整这些使其工作。

任何对开发人员的故障排除过程感兴趣的人都可以在此处查看: https://github.com/soulwing/tnm4j/issues/9