使用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操作,还可以指定MaxRepetitionsNonRepeaters
 注意一定要指定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
[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小时内删除。