【问题标题】:How to implement binary (b) variables in snmp4j如何在 snmp4j 中实现二进制 (b) 变量
【发布时间】: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。

【问题讨论】:

    标签: java snmp snmp4j


    【解决方案1】:

    使用 xC0 (11000000) 和 x80 (10000000) 的值而不是 1 和 0 重复设置有效。在 MIB .txt 文件中,它表明它是设置的 MSB。那不完全是 MSB,它总是 1。snmpset 以某种方式理解区别并且知道将 0 和 1 解释为 x80 和 xC0,我猜 .cds 或 .cmi 文件中有一些东西 snmpset 必须理解。假设我可以从 snmpRequest.java 剪切和粘贴是一个错误。还在学习snmp。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-21
      • 2015-08-16
      • 1970-01-01
      • 2012-02-28
      • 2012-06-25
      相关资源
      最近更新 更多