使用SNMP4J可以很方便的实现一个SNMP NMS的功能。
对于SNMPv1/SNMPv2,简单的说,只需要以下几个步骤
1) 创建Snmp对象snmp
2) 创建CommunityTarget对象target,并指定community, version, address, timeout, retry等参数。
3) 创建PDU对象pdu,并指定操作类型(GET/GETNEXT/GETBULK/SET), 添加VariableBinding(也就是待操作的OID),
如果是GETBULK操作,还可以指定MaxRepetitions和NonRepeaters。
注意一定要指定MaxRepetitions,默认值是0,那样不会返回任何结果。
4) 调用snmp.send(pdu, target)方法,发送请求请返回结果。
此外,SNMP4J提供了TableUtils类,可以很轻松的实现一个SNMP Walk的功能,比如一次
对于SNMPv1/SNMPv2,简单的说,只需要以下几个步骤
1) 创建Snmp对象snmp
2) 创建CommunityTarget对象target,并指定community, version, address, timeout, retry等参数。
3) 创建PDU对象pdu,并指定操作类型(GET/GETNEXT/GETBULK/SET), 添加VariableBinding(也就是待操作的OID),
如果是GETBULK操作,还可以指定MaxRepetitions和NonRepeaters。
注意一定要指定MaxRepetitions,默认值是0,那样不会返回任何结果。
4) 调用snmp.send(pdu, target)方法,发送请求请返回结果。
此外,SNMP4J提供了TableUtils类,可以很轻松的实现一个SNMP Walk的功能,比如一次
返回一个表格下面的所有MIB值。
TableUtils类还支持指定ower bound index 和 upper bound index, 得到更小范围的结果以提高性能。这一点对于从一个很多行的表中取一部分行的数据来说很重要。
Snmp还支持异步的send方法。
下面的代码实例实现了GET, GETNEXT, GETBULK, Walk, SET操作,
以及一个利用异步send方法实现的agent discovery: 对一个广播地址发送请求,等待agent返回的应答。
如果需要对一个范围内的IP进行扫描,可以稍加改进,反复调用异步send多次发送给不同IP。
TableUtils类还支持指定ower bound index 和 upper bound index, 得到更小范围的结果以提高性能。这一点对于从一个很多行的表中取一部分行的数据来说很重要。
Snmp还支持异步的send方法。
下面的代码实例实现了GET, GETNEXT, GETBULK, Walk, SET操作,
以及一个利用异步send方法实现的agent discovery: 对一个广播地址发送请求,等待agent返回的应答。
如果需要对一个范围内的IP进行扫描,可以稍加改进,反复调用异步send多次发送给不同IP。
[java] view plaincopyprint?
1. import java.io.IOException;
2. import java.util.List;
3. import java.util.Vector;
4.
5. import org.snmp4j.CommunityTarget;
6. import org.snmp4j.PDU;
7. import org.snmp4j.Snmp;
8. import org.snmp4j.event.ResponseEvent;
9. java爱心代码编程简单import org.snmp4j.event.ResponseListener;
10. import org.snmp4j.mp.SnmpConstants;
11. import org.snmp4j.smi.OID;
12. import org.snmp4j.smi.OctetString;
13. import org.snmp4j.smi.UdpAddress;
14. import org.snmp4j.smi.VariableBinding;
15. import ansport.DefaultUdpTransportMapping;
16. import org.snmp4j.util.DefaultPDUFactory;
17. import org.snmp4j.util.TableEvent;
18. import org.snmp4j.util.TableUtils;
19.
20. public class SNMPv2Test {
21. public static void main(String[] args) throws IOException, InterruptedException {
22. Snmp snmp = new Snmp(new DefaultUdpTransportMapping());
23. snmp.listen();
24.
25. CommunityTarget target = new CommunityTarget();
26. target.setCommunity(new OctetString("public"));
27. target.setVersion(SnmpConstants.version2c);
28. target.setAddress(new UdpAddress("192.168.0.100/161"));
29. target.setTimeout(3000); //3s
30. target.setRetries(1);
31.
32. sendRequest(snmp, createGetPdu(), target);
33. sendRequest(snmp, createGetNextPdu(), target);
34. sendRequest(snmp, createGetBulkPdu(), target);
35. snmpWalk(snmp, target);
36.
37. target.setCommunity(new OctetString("private"));
38. sendRequest(snmp, createSetPdu(), target);
39.
40. CommunityTarget broadcastTarget = new CommunityTarget();
41. broadcastTarget.setCommunity(new OctetString("public"));
42. broadcastTarget.setVersion(SnmpConstants.version2c);
43. broadcastTarget.setAddress(new UdpAddress("192.168.0.255/161"));
44. broadcastTarget.setTimeout(5000); //5s
45. sendAsyncRequest(snmp, createGetNextPdu(), broadcastTarget);
46. Thread.sleep(6000); //main thread wait 6s for the completion of asynchronous request
47. }
48.
49. private static PDU createGetPdu() {
50. PDU pdu = new PDU();
51. pdu.setType(PDU.GET);
52. pdu.add(new VariableBinding(new OID("1.3.6.1.2.1.1.3.0"))); //sysUpTime
53. pdu.add(new VariableBinding(new OID("1.3.6.1.2.1.1.5.0"))); //sysName
54. pdu.add(new VariableBinding(new OID("1.3.6.1.2.1.1.5"))); //expect an no_such_instance error
55. return pdu;
56. }
57.
58. private static PDU createGetNextPdu() {
59. PDU pdu = new PDU();
60. pdu.setType(PDU.GETNEXT);
61. pdu.add(new VariableBinding(new OID("1.3.6.1.2.1.1.3"))); //sysUpTime
62. pdu.add(new VariableBinding(new OID("1.3.6.1.2.1.1.5"))); //sysName
63.
64. return pdu;
65. }
66.
67. private static PDU createGetBulkPdu() {
68. PDU pdu = new PDU();
69. pdu.setType(PDU.GETBULK);
70. pdu.setMaxRepetitions(10); //must set it, default is 0
71. pdu.setNonRepeaters(0);
72. pdu.add(new VariableBinding(new OID("1.3.6.1.2.1.1"))); //system
73. return pdu;
74. }
75.
76. private static PDU createSetPdu() {
77. PDU pdu = new PDU();
78. pdu.setType(PDU.SET);
79. pdu.add(new VariableBinding(new OID("1.3.6.1.2.1.1.5.0"), new OctetString("sysname"))); //sysName
80. return pdu;
81. }
82.
83. private static void sendRequest(Snmp snmp, PDU pdu, CommunityTarget target)
84. throws IOException {
85. ResponseEvent responseEvent = snmp.send(pdu, target);
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论