2015-02-05 41 views
3

我正在使用此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,它們是ifInMulticastPkts,然後有時是1.3.6.1.2.1.31.1.1.1.3,它們是ifInBroadcastPkts。我只對ifName感興趣。如何讓SNMP4J GETBULK在OID之前遞增最右邊的數字?

如何防止GETBULK在遍歷MIB之前增加最後一位數字?

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; 
} 

回答

4

您應該使用the getTable method of the TableUtils class來獲取所需的列。這樣,您不必擔心行走表格時協議行爲的細節。

這就是說,如果你想自己做...你發現的是GetBulk的正常行爲。代理只負責返回您指定的行數(200),如果有的話。如果您需要更多行,響應還會指示您應該請求哪些OID。

只有您作爲經理人員才能知道您何時獲得了所有需要的數據,並停止發送新的GetBulk請求。您應該簡單地丟棄最後一個響應中的不需要的數據。在你的情況下,檢測一個OID是否不再是你請求的列的一個孩子。

您可以在RFC 1905,特別是4.2.3節和4.2.3.1節中詳細瞭解SNMP步行和GetBulk的工作方式。

但是使用API​​提供的方法,它會爲您節省一些灰色頭髮,並保證是正確的。