背景
目前现有场景都是通过一个已知的 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())) { break; } OID currentOid = SnmpUtil.getNextOID(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; }
|