发言者: 乔尔·帕特里克·洛萨(Joel Patrick Llosa) 在 SNMP4J中 2017年7月26日 13条留言 4567浏览
这篇文章非常简单。这是使用SNMP4J的SNMP walk示例。SNMP用于管理和监视网络设备。它是用于管理IP网络上设备的Internet标准协议。
您可以跳过此过程,因为这是一个非常简单的示例,可以使用文本编辑器进行制作。我们将通过Eclipse快速创建Java项目。单击文件->新建-> Java项目以创建项目。然后创建com.javacodegeeks.example
包。接下来,创建一个空SnmpWalk
类。我们还没有完成。我们必须添加SNMP4J库。右键单击该项目,然后转到Build Path- > Configure Build Path,然后去Libraries Tab- > Add External Jars …并添加snmp4j-2.5.6.jar(是撰写本文时的最新版本)。
下面的Java代码显示了在ifTable
特定设备的接口上的SNMP遍历。首先创建CommunityTarget
对象。它包含社区字符串,目标IP和端口,重试次数,超时值以及所使用的SNMP版本。
该doWalk
方法接受ifTable
OID和CommunityTarget
对象作为参数。下面将对此方法进行更详细的说明。最后,然后将结果打印到控制台。
SnmpWalk.java
import java.io.IOException;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import org.snmp4j.CommunityTarget;
import org.snmp4j.Snmp;
import org.snmp4j.Target;
import org.snmp4j.TransportMapping;
import org.snmp4j.mp.SnmpConstants;
import org.snmp4j.smi.Address;
import org.snmp4j.smi.GenericAddress;
import org.snmp4j.smi.OID;
import org.snmp4j.smi.OctetString;
import org.snmp4j.smi.VariableBinding;
import org.snmp4j.transport.DefaultUdpTransportMapping;
import org.snmp4j.util.DefaultPDUFactory;
import org.snmp4j.util.TreeEvent;
import org.snmp4j.util.TreeUtils;
public class SnmpWalk {
public static void main(String[] args) throws Exception {
CommunityTarget target = new CommunityTarget();
target.setCommunity(new OctetString("public"));
target.setAddress(GenericAddress.parse("udp:192.168.1.1/161")); // supply your own IP and port
target.setRetries(2);
target.setTimeout(1500);
target.setVersion(SnmpConstants.version2c);
Map<String, String> result = doWalk(".1.3.6.1.2.1.2.2", target); // ifTable, mib-2 interfaces
for (Map.Entry<String, String> entry : result.entrySet()) {
if (entry.getKey().startsWith(".1.3.6.1.2.1.2.2.1.2.")) {
System.out.println(
"ifDescr" + entry.getKey().replace(".1.3.6.1.2.1.2.2.1.2", "") + ": " + entry.getValue());
}
if (entry.getKey().startsWith(".1.3.6.1.2.1.2.2.1.3.")) {
System.out.println(
"ifType" + entry.getKey().replace(".1.3.6.1.2.1.2.2.1.3", "") + ": " + entry.getValue());
}
}
}
public static Map<String, String> doWalk(String tableOid, Target target) throws IOException {
Map<String, String> result = new TreeMap<>();
TransportMapping<? extends Address> transport = new DefaultUdpTransportMapping();
Snmp snmp = new Snmp(transport);
transport.listen();
TreeUtils treeUtils = new TreeUtils(snmp, new DefaultPDUFactory());
List<TreeEvent> events = treeUtils.getSubtree(target, new OID(tableOid));
if (events == null || events.size() == 0) {
System.out.println("Error: Unable to read table...");
return result;
}
for (TreeEvent event : events) {
if (event == null) {
continue;
}
if (event.isError()) {
System.out.println("Error: table OID [" + tableOid + "] " + event.getErrorMessage());
continue;
}
VariableBinding[] varBindings = event.getVariableBindings();
if (varBindings == null || varBindings.length == 0) {
continue;
}
for (VariableBinding varBinding : varBindings) {
if (varBinding == null) {
continue;
}
result.put("." + varBinding.getOid().toString(), varBinding.getVariable().toString());
}
}
snmp.close();
return result;
}
}
您需要提供自己的SNMP代理IP地址和端口(突出显示)。我们正在使用SNMP版本2c。本示例将遍历mib2.interfaces.ifTable。完成ifTable树的遍历后,它将停止行走(VariableBinding
OID没有相同的前缀)。步行结束后,便会打印出界面说明和类型。
该TreeUtils
(高亮)API做繁重的我们。TreeUtils
使用SNMP GetNext请求检索管理值的子树。GetNext是发现可用变量及其值的请求。此过程已通过此API进行了抽象。我们真幸运。
然后以a的形式返回结果Map
,其中OID为键,值为type String
。
您的输出应类似于以下内容。您可以使用MIB浏览器进行验证。
控制台输出
ifDescr.1: InLoopBack0
ifDescr.10: GigabitEthernet0/0/5
ifDescr.11: GigabitEthernet0/0/6
ifDescr.12: GigabitEthernet0/0/7
ifDescr.13: GigabitEthernet0/0/8
ifDescr.14: GigabitEthernet0/0/9
ifDescr.15: GigabitEthernet0/0/10
ifDescr.16: GigabitEthernet0/0/11
ifDescr.17: GigabitEthernet0/0/12
ifDescr.18: GigabitEthernet0/0/13
ifDescr.19: GigabitEthernet0/0/14
ifDescr.2: NULL0
ifDescr.20: GigabitEthernet0/0/15
ifDescr.21: GigabitEthernet0/0/16
ifDescr.22: GigabitEthernet0/0/17
ifDescr.23: GigabitEthernet0/0/18
ifDescr.24: GigabitEthernet0/0/19
ifDescr.25: GigabitEthernet0/0/20
ifDescr.26: GigabitEthernet0/0/21
ifDescr.27: GigabitEthernet0/0/22
ifDescr.28: GigabitEthernet0/0/23
ifDescr.29: GigabitEthernet0/0/24
ifDescr.3: Console9/0/0
ifDescr.30: GigabitEthernet0/0/25
ifDescr.31: GigabitEthernet0/0/26
ifDescr.32: GigabitEthernet0/0/27
ifDescr.33: GigabitEthernet0/0/28
ifDescr.34: GigabitEthernet0/0/29
ifDescr.35: GigabitEthernet0/0/30
ifDescr.36: GigabitEthernet0/0/31
ifDescr.37: GigabitEthernet0/0/32
ifDescr.38: GigabitEthernet0/0/33
ifDescr.39: GigabitEthernet0/0/34
ifDescr.4: MEth0/0/1
ifDescr.40: GigabitEthernet0/0/35
ifDescr.41: GigabitEthernet0/0/36
ifDescr.42: GigabitEthernet0/0/37
ifDescr.43: GigabitEthernet0/0/38
ifDescr.44: GigabitEthernet0/0/39
ifDescr.45: GigabitEthernet0/0/40
ifDescr.46: GigabitEthernet0/0/41
ifDescr.47: GigabitEthernet0/0/42
ifDescr.48: GigabitEthernet0/0/43
ifDescr.49: GigabitEthernet0/0/44
ifDescr.5: Vlanif1
ifDescr.50: GigabitEthernet0/0/45
ifDescr.51: GigabitEthernet0/0/46
ifDescr.52: GigabitEthernet0/0/47
ifDescr.53: GigabitEthernet0/0/48
ifDescr.6: GigabitEthernet0/0/1
ifDescr.7: GigabitEthernet0/0/2
ifDescr.8: GigabitEthernet0/0/3
ifDescr.9: GigabitEthernet0/0/4
ifType.1: 24
ifType.10: 6
ifType.11: 6
ifType.12: 6
ifType.13: 6
ifType.14: 6
ifType.15: 6
ifType.16: 6
ifType.17: 6
ifType.18: 6
ifType.19: 6
ifType.2: 1
ifType.20: 6
ifType.21: 6
ifType.22: 6
ifType.23: 6
ifType.24: 6
ifType.25: 6
ifType.26: 6
ifType.27: 6
ifType.28: 6
ifType.29: 6
ifType.3: 1
ifType.30: 6
ifType.31: 6
ifType.32: 6
ifType.33: 6
ifType.34: 6
ifType.35: 6
ifType.36: 6
ifType.37: 6
ifType.38: 6
ifType.39: 6
ifType.4: 6
ifType.40: 6
ifType.41: 6
ifType.42: 6
ifType.43: 6
ifType.44: 6
ifType.45: 6
ifType.46: 6
ifType.47: 6
ifType.48: 6
ifType.49: 6
ifType.5: 53
ifType.50: 6
ifType.51: 6
ifType.52: 6
ifType.53: 6
ifType.6: 6
ifType.7: 6
ifType.8: 6
ifType.9: 6
在此示例中,我们学习了使用SNMP4J的TreeUtils
API执行SNMP遍历。TreeUtils
为我们检索了管理价值的子树。该API已抽象出多个SNMP GetNext请求。我们的编程变得更加容易。遍历MIB树的一种更优化的方法是使用SNMP版本2中引入的SNMP GetBulk请求。使用该GetBulk
请求,管理器针对该请求的多次迭代发送单个请求,该GetNext
请求在代理方执行。SNMP漫游对代理执行多个请求,从而增加了网络流量的负载。