java-如何防止SNMP4J GETBULK在OID之前不增加最右边的数字?

我正在使用此SNMP4J代码进行一些SNMP遍历.但是,当我在运行1.3.6.1.2.1.31.1.1.1.1时,如果它是ifName,它将获取由1.3.6.1.2.1.31.1.1.1.1.x表示的所有接口,但是还可以获取1.3.6.1.2.1.31.1.1.1.2,它们是ifInMulticastPkt,然后有时是1.3.6.1.2.1.31.11.1.1.1.3,它们是ifInBroadcastPkt.我只对ifName感兴趣.

在遍历MIB之前如何防止GETBULK递增最后一位数字?

public ArrayList<String> walk(String oid) throws IOException, InterruptedException {
    Snmp snmp = new Snmp(new DefaultUdpTransportMapping());
    snmp.listen();

    Address targetAddress = GenericAddress.parse(address);
    CommunityTarget target = new CommunityTarget();
    target.setCommunity(new OctetString(community));
    target.setVersion(SnmpConstants.version2c);
    target.setAddress(targetAddress);
    target.setTimeout(3000);    //3s
    target.setRetries(1);

    PDU pdu = new PDU();
    pdu.setType(PDU.GETBULK);
    pdu.setMaxRepetitions(200);
    pdu.setNonRepeaters(0);
    pdu.add(new VariableBinding(new OID(oid)));

    ResponseEvent responseEvent = snmp.send(pdu, target);
    PDU response = responseEvent.getResponse();

    ArrayList<String> responsePieces = new ArrayList<String>();
    if (response == null) {
        System.out.println("TimeOut...");
    }
    else
    {
        if (response.getErrorStatus() == PDU.noError)
        {
            Vector<? extends VariableBinding> vbs = response.getVariableBindings();
            for (VariableBinding vb : vbs) {
                responsePieces.add(vb.toString());
            }
        }
        else
        {
            System.out.println("Error:" + response.getErrorStatusText());
        }
    }
    return responsePieces;
}

解决方法:

您可能应该使用the getTable method of the TableUtils class来获取所需的列.这样,您就不必担心协议在走路时的行为细节.

就是说,如果您想自己做……发现的就是GetBulk的正常行为.如果有行,则代理仅负责返回指定的行数(200).如果需要更多行,响应还将指示您应请求的OID.

只有作为管理员的您才能知道何时拥有所需的所有数据,并停止发送新的GetBulk请求.您应该只在上次响应中丢弃不需要的数据.对于您的情况,请检测OID是否不再是您请求的列的子代.

您可以在RFC 1905中阅读有关SNMP walk和GetBulk如何工作的更多信息,尤其是第4.2.3和4.2.3.1节.

但是请务必使用API​​提供的方法,它将为您节省一些白发,并且保证是正确的.

上一篇:在哪里可以找到Linux中SNMPv2的OID描述?


下一篇:java – SNMP4J获取和设置值