利用SNMP4J实现Snmp 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. }  
import java.io.IOException;
import java.net.UnknownHostException;
import java.util.Vector;

import org.snmp4j.CommandResponder;
import org.snmp4j.CommandResponderEvent;
import org.snmp4j.MessageDispatcherImpl;
import org.snmp4j.Snmp;
import org.snmp4j.TransportMapping;
import org.snmp4j.mp.MPv1;
import org.snmp4j.mp.MPv2c;
import org.snmp4j.mp.MPv3;
import org.snmp4j.security.SecurityModels;
import org.snmp4j.security.SecurityProtocols;
import org.snmp4j.security.USM;
import org.snmp4j.smi.Address;
import org.snmp4j.smi.GenericAddress;
import org.snmp4j.smi.OctetString;
import org.snmp4j.smi.TcpAddress;
import org.snmp4j.smi.UdpAddress;
import org.snmp4j.smi.VariableBinding;
import org.snmp4j.transport.DefaultTcpTransportMapping;
import org.snmp4j.transport.DefaultUdpTransportMapping;
import org.snmp4j.util.MultiThreadedMessageDispatcher;
import org.snmp4j.util.ThreadPool;

/**
 * 本类用于监听代理进程的Trap信息
 * 
 * @author zhanjia
 *
 */
public class MultiThreadedTrapReceiver implements CommandResponder {

	private MultiThreadedMessageDispatcher dispatcher;
	private Snmp snmp = null;
	private Address listenAddress;
	private ThreadPool threadPool;

	public MultiThreadedTrapReceiver() {
		// BasicConfigurator.configure();
	}

	private void init() throws UnknownHostException, IOException {
		threadPool = ThreadPool.create("Trap", 2);
		dispatcher = new MultiThreadedMessageDispatcher(threadPool,
				new MessageDispatcherImpl());
		listenAddress = GenericAddress.parse(System.getProperty(
				"snmp4j.listenAddress", "udp:192.168.1.23/162")); // 本地IP与监听端口
		TransportMapping transport;
		// 对TCP与UDP协议进行处理
		if (listenAddress instanceof UdpAddress) {
			transport = new DefaultUdpTransportMapping(
					(UdpAddress) listenAddress);
		} else {
			transport = new DefaultTcpTransportMapping(
					(TcpAddress) listenAddress);
		}
		snmp = new Snmp(dispatcher, transport);
		snmp.getMessageDispatcher().addMessageProcessingModel(new MPv1());
		snmp.getMessageDispatcher().addMessageProcessingModel(new MPv2c());
		snmp.getMessageDispatcher().addMessageProcessingModel(new MPv3());
		USM usm = new USM(SecurityProtocols.getInstance(), new OctetString(MPv3
				.createLocalEngineID()), 0);
		SecurityModels.getInstance().addSecurityModel(usm);
		snmp.listen();
	}

	
	public void run() {
		try {
			init();
			snmp.addCommandResponder(this);
			System.out.println("开始监听Trap信息!");
		} catch (Exception ex) {
			ex.printStackTrace();
		}
	}

	/**
	 * 实现CommandResponder的processPdu方法, 用于处理传入的请求、PDU等信息
	 * 当接收到trap时,会自动进入这个方法
	 * 
	 * @param respEvnt
	 */
	public void processPdu(CommandResponderEvent respEvnt) {
		// 解析Response
        if (respEvnt != null && respEvnt.getPDU() != null) {
        	Vector<VariableBinding> recVBs = respEvnt.getPDU().getVariableBindings();
           	for (int i = 0; i < recVBs.size(); i++) {
            	VariableBinding recVB = recVBs.elementAt(i);
               	System.out.println(recVB.getOid() + " : " + recVB.getVariable());
      		}
		}
	}

	public static void main(String[] args) {
		MultiThreadedTrapReceiver multithreadedtrapreceiver = new MultiThreadedTrapReceiver();
		multithreadedtrapreceiver.run();
	}

}

 

 

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. }  
import java.io.IOException;
import java.util.Vector;

import org.snmp4j.CommunityTarget;
import org.snmp4j.PDU;
import org.snmp4j.Snmp;
import org.snmp4j.TransportMapping;
import org.snmp4j.event.ResponseEvent;
import org.snmp4j.mp.SnmpConstants;
import org.snmp4j.smi.Address;
import org.snmp4j.smi.GenericAddress;
import org.snmp4j.smi.OID;
import org.snmp4j.smi.OctetString;
import org.snmp4j.smi.VariableBinding;
import org.snmp4j.transport.DefaultUdpTransportMapping;

/**
 * 本类用于向管理进程发送Trap信息
 * 
 * @author zhanjia
 *
 */
public class SnmpUtilSendTrap {

	private Snmp snmp = null;

	private Address targetAddress = null;

	public void initComm() throws IOException {

		// 设置管理进程的IP和端口
		targetAddress = GenericAddress.parse("udp:192.168.1.23/162");
		TransportMapping transport = new DefaultUdpTransportMapping();
		snmp = new Snmp(transport);
		transport.listen();

	}

	/**
	 * 向管理进程发送Trap报文
	 * 
	 * @throws IOException
	 */
	public void sendPDU() throws IOException {

		// 设置 target
		CommunityTarget target = new CommunityTarget();
		target.setAddress(targetAddress);

		// 通信不成功时的重试次数
		target.setRetries(2);
		// 超时时间
		target.setTimeout(1500);
		// snmp版本
		target.setVersion(SnmpConstants.version2c);

		// 创建 PDU
		PDU pdu = new PDU();
		pdu.add(new VariableBinding(new OID(".1.3.6.1.2.3377.10.1.1.1.1"),
				new OctetString("SnmpTrap")));
		pdu.add(new VariableBinding(new OID(".1.3.6.1.2.3377.10.1.1.1.2"),
				new OctetString("JavaEE")));
		pdu.setType(PDU.TRAP);

		// 向Agent发送PDU,并接收Response
		ResponseEvent respEvnt = snmp.send(pdu, target);

		// 解析Response
		if (respEvnt != null && respEvnt.getResponse() != null) {
			Vector<VariableBinding> recVBs = respEvnt.getResponse()
			.getVariableBindings();
			for (int i = 0; i < recVBs.size(); i++) {
				VariableBinding recVB = recVBs.elementAt(i);
				System.out.println(recVB.getOid() + " : " + recVB.getVariable());
			}
		}
	}

	public static void main(String[] args) {
		try {
			SnmpUtilSendTrap util = new SnmpUtilSendTrap();
			util.initComm();
			util.sendPDU();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}

 

 

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

 

说明:

      本例只在本人电脑上测试过,操作系统为Windows

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值