Java snmp没有得到树叶

时间:2018-03-21 12:47:19

标签: java snmp4j

我正在尝试使用下面的Java代码使用SNMP-walk命令检索MIB树的叶子,但没有成功。我正在使用SNMP4J框架与应用程序的其他SNMP端进行交互。 我的测试用例是从MIB中检索maxPhases标量,这是NTCIP协议中的一个参数(来自美国政府的运输系统协议)。 应用程序的另一端使用net-snmp框架(C / C ++)构建,其中一个用例显示在 RESULTDS 中。 示例图像可以检索maxPhases和maxPhaseGroups值(均为INTEGER 24)。 我使用SHA进行身份验证,使用AES128加密数据(系统将使用互联网进行部署,因此我们需要安全层)。

public static String doSnmpwalk() throws IOException { 
        Snmp snmp = null; 
        TransportMapping transport = null; 

        try { 

            Address targetAddress = GenericAddress.parse("udp:" + targetAddr + "/" + portNum); 
            transport = new DefaultUdpTransportMapping(); 
            snmp = new Snmp(transport);

            USM usm = new USM(SecurityProtocols.getInstance(), new OctetString(MPv3.createLocalEngineID()), 0);
            SecurityModels.getInstance().addSecurityModel(usm);

            snmp.getUSM().addUser(new OctetString("user"),
                    new UsmUser(new OctetString("SHAAES"), AuthSHA.ID, new OctetString("12345678"), PrivAES128.ID, new OctetString("91234567")));

            transport.listen(); 

            UserTarget target = new UserTarget();
            target.setAddress(targetAddress);
            target.setRetries(1);
            target.setTimeout(5000);
            target.setVersion(SnmpConstants.version3);
            target.setSecurityLevel(SecurityLevel.AUTH_PRIV);
            target.setSecurityName(new OctetString("SHAAES"));

            OID oid = new OID(oidStr); 
            OID [] oidArray  = new OID[1];
            oidArray[0] = oid;

            DefaultPDUFactory defaultPDUFactory = new DefaultPDUFactory(PDU.GETBULK); 
            TreeUtils treeUtils = new TreeUtils(snmp, defaultPDUFactory); 

            //List<TreeEvent> events = treeUtils.getSubtree(target, oid);

            List<TreeEvent> events = treeUtils.walk(target, oidArray);

            if (events == null || events.size() == 0) { 
                return null; 
            } 

            // Get snmpwalk result. 
            for (TreeEvent event : events) { 
                if (event.isError()) { 
                   // LOGGER.error("OID has an error: {}", event.getErrorMessage()); 
                } else { 
                    VariableBinding[] varBindings = event.getVariableBindings(); 
                    if (varBindings == null || varBindings.length == 0) { 
                        //System.out.println("VarBinding: No result returned."); 
                    } 
                    for (VariableBinding varBinding : varBindings) { 
                        varBinding.toValueString(); 
                        results += (varBinding.getOid().toString() + "=" + varBinding.getVariable().toString()) + "\n"; 
                    } 
                } 
            } 
        } finally { 
            if (snmp!=null) snmp.close(); 
            if (transport!=null) transport.close(); 
        } 

        return results; 
    } 

结果:

SNMPv2-SMI::enterprises.1206.4.2.1.1.1.0 = INTEGER: 24
SNMPv2-SMI::enterprises.1206.4.2.1.1.3.0 = INTEGER: 24

1 个答案:

答案 0 :(得分:0)

问题是错误的措辞,因为SNMP4J实际上返回了叶子对象&#39;值。根据上面的上一条评论,该问题的作者正在寻找与他所获得的对象ID相关联的MIB信息。

该信息不通过线路传输,而是来自相应MIB规范的静态信息。 SNMP4J-SMI-PRO或其他MIB解析器也可用于获取该信息。当Variable或VariableBinding的内容转换为字符串时,SNMP4J-SMI-PRO将无缝地执行此操作。它使用了DISPLAY-HINT信息和MIB规范中的OBJECT-TYPE SYNTAX。