我正在尝试将snmpset命令移植到snmp4j但是我收到错误代码5一般错误,这并没有告诉我多少。变量类型是b(二进制)。我查看了SnmpRequest.java源代码的所有示例,发现b参数转换为OctetString,如下所示:
case 'b':
variable = OctetString.fromString(value, ' ', 2);
当我toString变量时,我得到的值分别为“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”时,我得到了通用错误。
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。
使用xC0(11000000)和x80(10000000)而不是1和0的值重复该设置。在MIB .txt文件中,它表明它是已设置的MSB。这不是MSB,总是1.不知何故snmpset理解区别并知道将0和1解释为x80和xC0,我猜测.mpds或.cmi文件中有一些东西,snmpset必须理解。假设我可以从snmpRequest.java剪切和粘贴是一个错误。还在学习snmp。