SNMP4J实现SNMP TRAP

近期项目和华为的接口有要求用SNMP做实时告警的上送,在网上查找了些资料,整理了下

SNMP分为:SNMP TRAP\SNMP GET\SNMP SET

     1.SNMP TRAP简单说一般就是Manager和agent之间拿来传输数据,Manager会一直监听着代理进程发送           TRAP消息 

     2.SNMP GET看到GET就知道就是从SNMP服务端获取某个节点的数据

     3.SNMP SET就是设置SNMP服务端的某个节点的数据

实现SNMPTRAP需SNMP4J JAR包    http://www.snmp4j.org/html/download.html官网下载

1.首先实现SNMP TRAP接收消息服务端,监听Agent发来的TRAP消息

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

 

 

2.再写个Agent向服务端发送TRAP消息

 

Java代码   收藏代码
  1. package com.eshore.snmptrap;  
  2.    
  3. import java.io.IOException;  
  4. import java.util.Date;  
  5. import java.util.Vector;  
  6.    
  7. import org.snmp4j.CommunityTarget;  
  8. import org.snmp4j.PDU;  
  9. import org.snmp4j.Snmp;  
  10. import org.snmp4j.TransportMapping;  
  11. import org.snmp4j.event.ResponseEvent;  
  12. import org.snmp4j.mp.SnmpConstants;  
  13. import org.snmp4j.smi.Address;  
  14. import org.snmp4j.smi.GenericAddress;  
  15. import org.snmp4j.smi.Integer32;  
  16. import org.snmp4j.smi.OID;  
  17. import org.snmp4j.smi.OctetString;  
  18. import org.snmp4j.smi.VariableBinding;  
  19. import org.snmp4j.transport.DefaultUdpTransportMapping;  
  20.     
  21. /**  
  22.  * 本类用于向管理进程发送Trap信息  
  23.  *   
  24.  * @author zhanjia  
  25.  *  
  26.  */    
  27. public class SnmpUtilSendTrap {    
  28.     
  29.     private Snmp snmp = null;    
  30.     
  31.     private Address targetAddress = null;    
  32.     
  33.     public void initComm() throws IOException {    
  34.     
  35.         // 设置管理进程的IP和端口    
  36.         targetAddress = GenericAddress.parse("udp:127.0.0.1/162");    
  37.         TransportMapping transport = new DefaultUdpTransportMapping();    
  38.         snmp = new Snmp(transport);    
  39.         transport.listen();    
  40.     
  41.     }    
  42.     
  43.     /**  
  44.      * 向管理进程发送Trap报文  
  45.      *   
  46.      * @throws IOException  
  47.      */    
  48.     public void sendPDU() throws IOException {    
  49.     
  50.         // 设置 target    
  51.         CommunityTarget target = new CommunityTarget();    
  52.         target.setAddress(targetAddress);    
  53.     
  54.         // 通信不成功时的重试次数    
  55.         target.setRetries(2);    
  56.         // 超时时间    
  57.         target.setTimeout(1500);    
  58.         // snmp版本    
  59.         target.setVersion(SnmpConstants.version2c);    
  60.         // 创建 PDU    
  61.         PDU pdu = new PDU();    
  62.           
  63.         pdu.add(new VariableBinding(new OID(".1.3.6.1.4.1.2011.2.15.2.1.2.1.1.1.1"), new OctetString("SNMPTEST")));    
  64.           
  65.         pdu.add(new VariableBinding(new OID(".1.3.6.1.4.1.2011.2.15.2.1.2.1.1.1.2"), new Integer32(10)));    
  66.           
  67.         pdu.add(new VariableBinding(new OID(".1.3.6.1.4.1.2011.2.15.2.1.2.1.1.1.3"), new OctetString(new Date().toString())));   
  68.           
  69.         pdu.setType(PDU.TRAP);    
  70.     
  71.         // 向Agent发送PDU,并接收Response    
  72.         ResponseEvent respEvnt = snmp.send(pdu, target);    
  73.           
  74.         // 解析Response    
  75.         if (respEvnt != null && respEvnt.getResponse() != null) {    
  76.             Vector<VariableBinding> recVBs = (Vector<VariableBinding>) respEvnt.getResponse()    
  77.             .getVariableBindings();    
  78.             for (int i = 0; i < recVBs.size(); i++) {    
  79.                 VariableBinding recVB = recVBs.elementAt(i);    
  80.                 System.out.println(recVB.getOid() + " : " + recVB.getVariable());    
  81.             }    
  82.         }    
  83.     }    
  84.     
  85.     public static void main(String[] args) {    
  86.         try {    
  87.             SnmpUtilSendTrap util = new SnmpUtilSendTrap();    
  88.             util.initComm();    
  89.             util.sendPDU();    
  90.         } catch (IOException e) {    
  91.             e.printStackTrace();    
  92.         }    
  93.     }    
  94.     
  95. }  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值