【发布时间】:2019-04-05 21:37:46
【问题描述】:
我正在尝试将 snmpset 命令移植到 snmp4j,但收到错误代码 5 通用错误,这并不能告诉我太多信息。变量类型是 b(二进制)。我查看了所有示例的 SnmpRequest.java 源代码,发现 b 参数转换为 OctetString,如下所示:
case 'b':
variable = OctetString.fromString(value, ' ', 2);
当我对变量进行字符串化时,我分别得到以下值“0”和“1”:00、01
当我从命令行设置 OID 时,它会回显 80 和 40。
jgaer@ljgaer2_~: snmpset -t 60 192.168.60.105 cwNetStgSvrWriteEnable.0 b 0
CW-NET-STG-SVR-MIB::cwNetStgSvrWriteEnable.0 = BITS: 80 hwWriteEn(0)
jgaer@ljgaer2_~: snmpset -t 60 192.168.60.105 cwNetStgSvrWriteEnable.0 b 1
CW-NET-STG-SVR-MIB::cwNetStgSvrWriteEnable.0 = BITS: 40 fsWriteEn(1)
如果我在 snmp4j 中获取 OID 并在响应事件中为 variableBindings 设置字符串,当 OID 分别设置为 0 和 1 时,我会看到以下内容:
[1.3.6.1.4.1.27675.20.1.6.0 = 80]
[1.3.6.1.4.1.27675.20.1.6.0 = c0]
当我运行以下值为“1”的代码 sn-p 时,我得到了一般错误。
Object result = null;
PDU pdu = new ScopedPDU();
pdu.add(new VariableBinding(new OID("1.3.6.1.4.1.27675.20.1.6.0"), OctetString.fromString("1", ' ', 2)));
pdu.setType(PDU.SET);
ResponseEvent event = snmp.send(pdu, userTarget);
if (event != null) {
pdu = event.getResponse();
if (pdu.getErrorStatus() == PDU.noError) {
LOG.debug("SNMPv3 SET Successful for " + oid + " ObjectType " + pdu.get(0).getVariable().getClass() + " value " +
pdu.get(0).getVariable() + ":" + pdu.getVariableBindings());
result = pdu.get(0).getVariable();
} else {
LOG.debug("SNMPv3 SET Unsuccessful. Error Code " + pdu.getErrorStatus() + " " + pdu.getErrorStatusText());
}
} else {
LOG.debug("SNMP send unsuccessful.");
}
return result;
output
SNMPv3 SET Unsuccessful. Error Code 5 General variable binding error
如果我以“0”的值运行它,它会正常运行,并且对象在远程代理上得到更新,但返回的变量值是 00 而不是 80。
[1.3.6.1.4.1.27675.20.1.6.0 = 00]
我对返回值 80 和 C0 感到非常困惑。我还没弄清楚如何为二进制 1 创建 OctestString。
【问题讨论】: