利用SNMP4J实现Snmp Trap完整例子

来源:互联网 发布:我的淘宝登陆 编辑:程序博客网 时间:2024/05/24 20:06

利用SNMP4J实现SnmpTrap完整例子

所需Jar包:snmp4j.jar,snmp4j-1.11.1.jar

下面是两个用于发送和接收Trap报文信息的类:

Java代码
  1. import java.io.IOException; 
  2. import java.net.UnknownHostException; 
  3. import java.util.Vector; 
  4.  
  5. import org.snmp4j.CommandResponder; 
  6. import org.snmp4j.CommandResponderEvent; 
  7. import org.snmp4j.MessageDispatcherImpl; 
  8. import org.snmp4j.Snmp; 
  9. import org.snmp4j.TransportMapping; 
  10. import org.snmp4j.mp.MPv1; 
  11. import org.snmp4j.mp.MPv2c; 
  12. import org.snmp4j.mp.MPv3; 
  13. import org.snmp4j.security.SecurityModels; 
  14. import org.snmp4j.security.SecurityProtocols; 
  15. import org.snmp4j.security.USM; 
  16. import org.snmp4j.smi.Address; 
  17. import org.snmp4j.smi.GenericAddress; 
  18. import org.snmp4j.smi.OctetString; 
  19. import org.snmp4j.smi.TcpAddress; 
  20. import org.snmp4j.smi.UdpAddress; 
  21. import org.snmp4j.smi.VariableBinding; 
  22. import org.snmp4j.transport.DefaultTcpTransportMapping; 
  23. import org.snmp4j.transport.DefaultUdpTransportMapping; 
  24. import org.snmp4j.util.MultiThreadedMessageDispatcher; 
  25. import org.snmp4j.util.ThreadPool; 
  26.  
  27. /**
  28. * 本类用于监听代理进程的Trap信息
  29. *
  30. * @author zhanjia
  31. *
  32. */ 
  33. public class MultiThreadedTrapReceiverimplements CommandResponder { 
  34.  
  35.     private MultiThreadedMessageDispatcher dispatcher; 
  36.     private Snmp snmp = null
  37.     private Address listenAddress; 
  38.     private ThreadPool threadPool; 
  39.  
  40.     public MultiThreadedTrapReceiver() { 
  41.         // BasicConfigurator.configure(); 
  42.     } 
  43.  
  44.     private void init()throws UnknownHostException, IOException { 
  45.         threadPool = ThreadPool.create("Trap",2); 
  46.         dispatcher = new MultiThreadedMessageDispatcher(threadPool, 
  47.                 new MessageDispatcherImpl()); 
  48.         listenAddress = GenericAddress.parse(System.getProperty( 
  49.                 "snmp4j.listenAddress","udp:192.168.1.23/162"));// 本地IP与监听端口 
  50.         TransportMapping transport; 
  51.         // 对TCP与UDP协议进行处理 
  52.         if (listenAddress instanceof UdpAddress) { 
  53.             transport = new DefaultUdpTransportMapping( 
  54.                     (UdpAddress) listenAddress); 
  55.         } else
  56.             transport = new DefaultTcpTransportMapping( 
  57.                     (TcpAddress) listenAddress); 
  58.         } 
  59.         snmp = new Snmp(dispatcher, transport); 
  60.         snmp.getMessageDispatcher().addMessageProcessingModel(new MPv1()); 
  61.         snmp.getMessageDispatcher().addMessageProcessingModel(new MPv2c()); 
  62.         snmp.getMessageDispatcher().addMessageProcessingModel(new MPv3()); 
  63.         USM usm = new USM(SecurityProtocols.getInstance(),new OctetString(MPv3 
  64.                 .createLocalEngineID()), 0); 
  65.         SecurityModels.getInstance().addSecurityModel(usm); 
  66.         snmp.listen(); 
  67.     } 
  68.  
  69.      
  70.     public void run() { 
  71.         try
  72.             init(); 
  73.             snmp.addCommandResponder(this); 
  74.             System.out.println("开始监听Trap信息!"); 
  75.         } catch (Exception ex) { 
  76.             ex.printStackTrace(); 
  77.         } 
  78.     } 
  79.  
  80.     /**
  81.      * 实现CommandResponder的processPdu方法, 用于处理传入的请求、PDU等信息
  82.      * 当接收到trap时,会自动进入这个方法
  83.      *
  84.      * @param respEvnt
  85.      */ 
  86.     public void processPdu(CommandResponderEvent respEvnt) { 
  87.         // 解析Response 
  88.         if (respEvnt != null && respEvnt.getPDU() !=null) { 
  89.             Vector<VariableBinding> recVBs = respEvnt.getPDU().getVariableBindings(); 
  90.             for (int i =0; i < recVBs.size(); i++) { 
  91.                 VariableBinding recVB = recVBs.elementAt(i); 
  92.                 System.out.println(recVB.getOid() + " : " + recVB.getVariable()); 
  93.             } 
  94.         } 
  95.     } 
  96.  
  97.     public staticvoid main(String[] args) { 
  98.         MultiThreadedTrapReceiver multithreadedtrapreceiver = new MultiThreadedTrapReceiver(); 
  99.         multithreadedtrapreceiver.run(); 
  100.     } 
  101.  
 
Java代码
  1. import java.io.IOException; 
  2. import java.util.Vector; 
  3.  
  4. import org.snmp4j.CommunityTarget; 
  5. import org.snmp4j.PDU; 
  6. import org.snmp4j.Snmp; 
  7. import org.snmp4j.TransportMapping; 
  8. import org.snmp4j.event.ResponseEvent; 
  9. import org.snmp4j.mp.SnmpConstants; 
  10. import org.snmp4j.smi.Address; 
  11. import org.snmp4j.smi.GenericAddress; 
  12. import org.snmp4j.smi.OID; 
  13. import org.snmp4j.smi.OctetString; 
  14. import org.snmp4j.smi.VariableBinding; 
  15. import org.snmp4j.transport.DefaultUdpTransportMapping; 
  16.  
  17. /**
  18. * 本类用于向管理进程发送Trap信息
  19. *
  20. * @author zhanjia
  21. *
  22. */ 
  23. public class SnmpUtilSendTrap { 
  24.  
  25.     private Snmp snmp = null
  26.  
  27.     private Address targetAddress = null
  28.  
  29.     public void initComm()throws IOException { 
  30.  
  31.         // 设置管理进程的IP和端口 
  32.         targetAddress = GenericAddress.parse("udp:192.168.1.23/162"); 
  33.         TransportMapping transport = new DefaultUdpTransportMapping(); 
  34.         snmp = new Snmp(transport); 
  35.         transport.listen(); 
  36.  
  37.     } 
  38.  
  39.     /**
  40.      * 向管理进程发送Trap报文
  41.      *
  42.      * @throws IOException
  43.      */ 
  44.     public void sendPDU()throws IOException { 
  45.  
  46.         // 设置 target 
  47.         CommunityTarget target = new CommunityTarget(); 
  48.         target.setAddress(targetAddress); 
  49.  
  50.         // 通信不成功时的重试次数 
  51.         target.setRetries(2); 
  52.         // 超时时间 
  53.         target.setTimeout(1500); 
  54.         // snmp版本 
  55.         target.setVersion(SnmpConstants.version2c); 
  56.  
  57.         // 创建 PDU 
  58.         PDU pdu = new PDU(); 
  59.         pdu.add(new VariableBinding(new OID(".1.3.6.1.2.3377.10.1.1.1.1"), 
  60.                 new OctetString("SnmpTrap"))); 
  61.         pdu.add(new VariableBinding(new OID(".1.3.6.1.2.3377.10.1.1.1.2"), 
  62.                 new OctetString("JavaEE"))); 
  63.         pdu.setType(PDU.TRAP); 
  64.  
  65.         // 向Agent发送PDU,并接收Response 
  66.         ResponseEvent respEvnt = snmp.send(pdu, target); 
  67.  
  68.         // 解析Response 
  69.         if (respEvnt != null && respEvnt.getResponse() !=null) { 
  70.             Vector<VariableBinding> recVBs = respEvnt.getResponse() 
  71.             .getVariableBindings(); 
  72.             for (int i =0; i < recVBs.size(); i++) { 
  73.                 VariableBinding recVB = recVBs.elementAt(i); 
  74.                 System.out.println(recVB.getOid() + " : " + recVB.getVariable()); 
  75.             } 
  76.         } 
  77.     } 
  78.  
  79.     public staticvoid main(String[] args) { 
  80.         try
  81.             SnmpUtilSendTrap util = new SnmpUtilSendTrap(); 
  82.             util.initComm(); 
  83.             util.sendPDU(); 
  84.         } catch (IOException e) { 
  85.             e.printStackTrace(); 
  86.         } 
  87.     } 
  88.  

 

1、运行MultiThreadedTrapReceiver类,提示“开始监听Trap信息!”并处理监听状态

2、运行SnmpUtilSendTrap类,运行完毕后,将会在“开始监听Trap信息!”后面显示:

1.3.6.1.2.3377.10.1.1.1.1 : SnmpTrap
1.3.6.1.2.3377.10.1.1.1.2 : JavaEE

MultiThreadedTrapReceiver输出面板中显示以上两行即表示测试成功!

原创粉丝点击