SNMP4j实现Trap的示例

目录:

  • 环境参数
  • 代码示例

[一]、环境参数

  • jdk 1.6.0_18
  • snmp4j 1.11.3

[二]、代码示例

1. Trap接收器的实现

代码:SnmpTrapMultiThreadReceiver.java

package com.micmiu.snmp4j.demo1x;
 
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;
 
/**
 * 演示SNMP Trap多线程接收解析信息
 *
 * @blog http://www.micmiu.com
 * @author Michael
 */
public class SnmpTrapMultiThreadReceiver implements CommandResponder {
	private MultiThreadedMessageDispatcher dispatcher;
	private Snmp snmp = null;
	private Address listenAddress;
	private ThreadPool threadPool;
 
	public SnmpTrapMultiThreadReceiver() {
	}
 
	private void init() throws UnknownHostException, IOException {
		threadPool = ThreadPool.create("TrapPool", 2);
		dispatcher = new MultiThreadedMessageDispatcher(threadPool,
				new MessageDispatcherImpl());
		listenAddress = GenericAddress.parse(System.getProperty(
				"snmp4j.listenAddress", "udp:127.0.0.1/162"));
		TransportMapping transport;
		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() {
		System.out.println("----> Trap Receiver run ... <----");
		try {
			init();
			snmp.addCommandResponder(this);
			System.out.println("----> 开始监听端口,等待Trap message  <----");
		} catch (Exception ex) {
			ex.printStackTrace();
		}
	}
 
	@SuppressWarnings("unchecked")
	public void processPdu(CommandResponderEvent event) {
		System.out.println("----> 开始解析ResponderEvent: <----");
		if (event == null || event.getPDU() == null) {
			System.out.println("[Warn] ResponderEvent or PDU is null");
			return;
		}
		Vector<VariableBinding> vbVect = event.getPDU().getVariableBindings();
		for (VariableBinding vb : vbVect) {
			System.out.println(vb.getOid() + " = " + vb.getVariable());
		}
		System.out.println("---->  本次ResponderEvent 解析结束 <----");
	}
 
	public static void main(String[] args) {
		SnmpTrapMultiThreadReceiver trapReceiver = new SnmpTrapMultiThreadReceiver();
		trapReceiver.run();
	}
}

运行结果:

----> Trap Receiver run ... <----
----> 开始监听端口,等待Trap message  <----



2. Trap 发送消息的模拟实现

代码:SnmpTrapSendDemo.java

package com.micmiu.snmp4j.demo1x;
 
import java.io.IOException;
 
import org.snmp4j.CommunityTarget;
import org.snmp4j.PDU;
import org.snmp4j.Snmp;
import org.snmp4j.TransportMapping;
import org.snmp4j.mp.SnmpConstants;
import org.snmp4j.smi.GenericAddress;
import org.snmp4j.smi.OID;
import org.snmp4j.smi.OctetString;
import org.snmp4j.smi.TimeTicks;
import org.snmp4j.smi.UnsignedInteger32;
import org.snmp4j.smi.VariableBinding;
import org.snmp4j.transport.DefaultUdpTransportMapping;
 
/**
 * 模拟Trap发送消息
 * @blog http://www.micmiu.com
 * @author Michael
 */
public class SnmpTrapSendDemo {
 
	public static final int DEFAULT_VERSION = SnmpConstants.version2c;
	public static final long DEFAULT_TIMEOUT = 3 * 1000L;
	public static final int DEFAULT_RETRY = 3;
 
	private Snmp snmp = null;
	private CommunityTarget target = null;
 
	public void init() throws IOException {
		System.out.println("----> 初始 Trap 的IP和端口 <----");
		target = createTarget4Trap("udp:127.0.0.1/162");
		TransportMapping transport = new DefaultUdpTransportMapping();
		snmp = new Snmp(transport);
		transport.listen();
	}
 
	/**
	 * 向接收器发送Trap 信息
	 *
	 * @throws IOException
	 */
	public void sendPDU() throws IOException {
		PDU pdu = new PDU();
		pdu.add(new VariableBinding(
				new OID(".1.3.6.1.2.1.1.1.0"),
				new OctetString("SNMP Trap Test.see more:http://www.micmiu.com")));
		pdu.add(new VariableBinding(SnmpConstants.sysUpTime, new TimeTicks(
				new UnsignedInteger32(System.currentTimeMillis() / 1000)
						.getValue())));
		pdu.add(new VariableBinding(SnmpConstants.snmpTrapOID, new OID(
				".1.3.6.1.6.3.1.1.4.3")));
 
		// 向Agent发送PDU
		pdu.setType(PDU.TRAP);
		snmp.send(pdu, target);
		System.out.println("----> Trap Send END <----");
	}
 
	/**
	 * 创建对象communityTarget
	 *
	 * @param targetAddress
	 * @param community
	 * @param version
	 * @param timeOut
	 * @param retry
	 * @return CommunityTarget
	 */
	public static CommunityTarget createTarget4Trap(String address) {
		CommunityTarget target = new CommunityTarget();
		target.setAddress(GenericAddress.parse(address));
		target.setVersion(DEFAULT_VERSION);
		target.setTimeout(DEFAULT_TIMEOUT); // milliseconds
		target.setRetries(DEFAULT_RETRY);
		return target;
	}
 
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		try {
			SnmpTrapSendDemo demo = new SnmpTrapSendDemo();
			demo.init();
			demo.sendPDU();
		} catch (IOException e) {
			e.printStackTrace();
		}
 
	}
 
}



运行结果:
----> 初始 Trap 的IP和端口 <----
----> Trap Send END <----



同时接收器的日志变成如下:



----> Trap Receiver run ... <----
----> 开始监听端口,等待Trap message  <----
----> 开始解析ResponderEvent: <----
1.3.6.1.2.1.1.1.0 = SNMP Trap Test.see more:http://www.micmiu.com
1.3.6.1.2.1.1.3.0 = 155 days, 9:52:04.80
1.3.6.1.6.3.1.1.4.1.0 = 1.3.6.1.6.3.1.1.4.3
---->  本次ResponderEvent 解析结束 <----



转载于:https://my.oschina.net/yxwblog/blog/417258

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值