利用SNMP4J实现Snmp Trap完整例子

来源:互联网 发布:Archlinux util-linux 编辑:程序博客网 时间:2024/06/05 08:39

利用SNMP4J实现Snmp Trap完整例子

下面是两个用于发送和接收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 MultiThreadedTrapReceiver implements 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 static void main(String[] args) {  
  98.         MultiThreadedTrapReceiver multithreadedtrapreceiver = new MultiThreadedTrapReceiver();  
  99.         multithreadedtrapreceiver.run();  
  100.     }  
  101.   
  102. }  

 

 

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 static void 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.   
  89. }  

 

 

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输出面板中显示以上两行即表示测试成功!

原创粉丝点击