抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

背景

目前现有场景都是通过一个已知的 oid 去获取对应设备的 oid 信息,最近遇到一个新的需求,要求把设备的 oid 全部拉出来,做成列表,让用户自行选择。因为用户可能并不知道有哪些 oid,由于有的设备 oid 有几百几千,用 getnext 依次去遍历耗时很长,需要实现分页查询

查了一下,目前网络上相关的资料不多,分页的更是没有,在此记录一下

代码

snmpWalk 分页查询 oid

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
private List<Object> getPageOids(SNMPDto dto, PDU pdu, Snmp snmp, Target target) throws IOException {
List<Object> resultVal = new ArrayList<>();
int count = 0;
while (count < dto.getPageSize()) {
ResponseEvent responseEvent = snmp.send(pdu, target);
Map<Object, Object> oidRes = new HashMap<>();
if (responseEvent != null && responseEvent.getResponse() != null) {
PDU responsePDU = responseEvent.getResponse();
if (responsePDU.getErrorStatus() == PDU.noError) {
VariableBinding vb = responsePDU.get(0);
OID oid = vb.getOid();
if (!oid.toDottedString().startsWith(dto.getOid())) {
// 限定只遍历后面的子节点,如1.3.6.1.2.1.1.9.x.x
break;
}
OID currentOid = SnmpUtil.getNextOID(oid); // 获取下一个OID
oidRes.put("OID", oid.toDottedString());
oidRes.put("value", vb.getVariable().toString());
resultVal.add(oidRes);
count++;
pdu.clear();
pdu.add(new VariableBinding(currentOid));
} else {
logger.error("snmpwalk-错误:" + responsePDU.getErrorStatusText());
break;
}
} else {
logger.error("snmpwalk-未收到响应。");
break;
}
}
return resultVal;
}

获取下一个 oid

1
2
3
4
5
public static OID getNextOID(OID oid) {
int lastIndex = oid.size() - 1;
oid.set(lastIndex, oid.get(lastIndex) + 1);
return oid;
}

评论

留下的你见解