我正在尝试使用下面的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
答案 0 :(得分:0)
问题是错误的措辞,因为SNMP4J实际上返回了叶子对象&#39;值。根据上面的上一条评论,该问题的作者正在寻找与他所获得的对象ID相关联的MIB信息。
该信息不通过线路传输,而是来自相应MIB规范的静态信息。 SNMP4J-SMI-PRO或其他MIB解析器也可用于获取该信息。当Variable或VariableBinding的内容转换为字符串时,SNMP4J-SMI-PRO将无缝地执行此操作。它使用了DISPLAY-HINT信息和MIB规范中的OBJECT-TYPE SYNTAX。