如何防止 SNMP4J GETBULK 在 OID 之前递增最右边的数字?
How do I keep SNMP4J GETBULK from incrementing rightmost digit before 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.[=15 表示的接口=],但随后它还会获取 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 感兴趣。
如何防止 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;
}
您可能应该使用 the getTable
method of the TableUtils
class 来获取您需要的列。这样,您就不必担心协议在走 table.
时的行为细节。
就是说,如果您想自己做...您发现的是 GetBulk 的正常行为。代理只负责返回您指定的行数 (200),如果有的话。如果您需要更多行,响应还将指示您应该请求的 OID。
只有作为经理的您才能知道何时获得所需的所有数据并停止发送新的 GetBulk 请求。您应该简单地丢弃最后一个响应中不需要的数据。在您的情况下,检测 OID 是否不再是您请求的列的子项。
您可以在 RFC 1905 中阅读更多关于 SNMP 遍历和 GetBulk 工作原理的信息,特别是第 4.2.3 和 4.2.3.1 节。
但是一定要用API提供的方法,省去一些白发,而且保证正确。
我正在使用此 SNMP4J 代码进行一些 SNMP 遍历。但是,当我 运行 它说 1.3.6.1.2.1.31.1.1.1.1 是 ifName 时,它会得到所有由 1.3.6.1.2.1.31.1.1.1.[=15 表示的接口=],但随后它还会获取 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 感兴趣。
如何防止 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;
}
您可能应该使用 the getTable
method of the TableUtils
class 来获取您需要的列。这样,您就不必担心协议在走 table.
就是说,如果您想自己做...您发现的是 GetBulk 的正常行为。代理只负责返回您指定的行数 (200),如果有的话。如果您需要更多行,响应还将指示您应该请求的 OID。
只有作为经理的您才能知道何时获得所需的所有数据并停止发送新的 GetBulk 请求。您应该简单地丢弃最后一个响应中不需要的数据。在您的情况下,检测 OID 是否不再是您请求的列的子项。
您可以在 RFC 1905 中阅读更多关于 SNMP 遍历和 GetBulk 工作原理的信息,特别是第 4.2.3 和 4.2.3.1 节。
但是一定要用API提供的方法,省去一些白发,而且保证正确。