我试图使用下面的Java代码使用SNMP-walk命令检索MIB树的叶子,但没有成功。我正在使用SNMP4J框架与应用程序的其他SNMP端进行交互。我的测试用例是从MIB检索maxPhases标量,这是NTCIP协议(来自美国政府的传输系统协议)中的一个参数。应用程序的另一端是使用net框架(C/C++)构建的,其中RESULTDS中显示了一个用例。示例映像可以检索maxPhases和maxPhaseGroups值(都是整数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
发布于 2018-04-15 15:55:40
这个问题措辞错误,因为SNMP4J实际上返回叶对象的值。根据上面的评论,这个问题的作者正在寻找与他返回的对象ID相关的MIB信息。
该信息不是通过有线传输的,而是来自相应MIB规范的静态信息。SNMP4J-SMI-PRO或其他MIB解析器也可以用来获取这些信息。当变量或VariableBinding的内容转换为字符串时,SNMP4J-SMI-PRO将无缝地完成这一任务。为此,它使用MIB规范中的显示提示信息和对象类型语法。
https://stackoverflow.com/questions/49406718
复制相似问题