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 解析结束 <----
时间: 2024-11-05 21:43:39

SNMP4j实现Trap的示例的相关文章

X86 Linux 下 SIGBUS 总结

SIGBUS 在 x86 Linux 上并不多见,但一旦出现,其调用堆栈常常让人摸不着头脑,加之信号问题各平台系统间差异较大,更让人难以理清,这里稍微总结一下 x86 Linux 上大概有哪些情形会触发 BUS ERROR. 文件映射访问异常 这是 SIGBUS 在用户态最为常见的场景,也最容易触发,通常来说根本原因都是进程 mmap 了一个文件后,另外的进程把这个文件截断了,导致 mmap 出来的某些内存页超出文件的实际大小,访问那些超出的内存页就会触发 SIGBUS,具体来说有以下几种场景:

使用snmp4j实现Snmp功能(三)

相关链接:Snmp学习笔记使用snmp4j实现Snmp功能(一)使用snmp4j实现Snmp功能(二)使用snmp4j实现Snmp功能(三) 前两篇文章讲了如何使用Snmp4j实现Set.Get(使用snmp4j实现Snmp功能(一))以及发送.接收Trap(使用snmp4j实现Snmp功能(二)) 功能. 在我们前面的实现中,如果访问MIB库中不存在的OID,Get方式的话,我们会得到一个Null值,而Set方式时Agent端会把我们发过去的 PDU原封不动的返回回来.当然多数情况下这不是我们

ARMLinux下Alignment trap的一些测试 【转自 李迟的专栏 CSDN http://blog.csdn.net/subfate/article/details/7847356

项目中有时会遇到字节对齐的问题,英文为“Alignment trap”,如果直译,意思为“对齐陷阱”,不过这个说法不太好理解,还是直接用英文来表达. ARM平台下一般是4字节对齐,可以参考文后的给出的文章链接.此处不细说.后面提及“字节对齐” 下面的例子使用了几种重现Alignment trap的方法,例子1是将char*指针直接转换成int*指针,经测试,未发现有字节对齐的问题.例子2和例子3相似,主要是结构体中的字段没有进行对齐(或者访问的地址没有4字节对齐).例子4是直接访问了没有字节对齐

使用snmp4j实现Snmp功能(二)

相关链接:Snmp学习笔记使用snmp4j实现Snmp功能(一)使用snmp4j实现Snmp功能(二)使用snmp4j实现Snmp功能(三) 前一篇文章讲了如何用snmp4j实现set和get的功能,今天讲如何接收trap. snmp4j提供了一个抽象类CommandResponder类用于接收trap,这个类里面有一个必须实现的方法processPdu(),当接收到trap,会自动进入这个方法,因此我们可以将对trap的处理写在这里. 下面修改上篇文章例子中的initComm()方法: pri

【转】shell脚本调试(bash trap support bashdb )

原文网址:http://zhu8337797.blog.163.com/blog/static/170617549201122512712136/ 命 令 选 项 功 能 bash –x 脚本名 回显 在变量替换之后.执行命令之前,显示脚本的每一行 bash –v 脚本名 详细 在执行之前,按输入的原样打印脚本中各行 bash –n 脚本名 不执行 解释但不执行命令 set –x 打开回显 跟踪脚本的执行 set +x 关闭回显 关闭跟踪功能 --------------------------

关于Snmp的Trap代码开发之坑

最近是被这个snmp的trap给坑了,其实回想起来主要是对这个不了解.特别是对snmp协议研究不够深入, 真的不想看这些协议东西,只想大概知道.结果在开发snmp trap时候被坑了,下面列下自己踩到的坑: 1.snmp的trap的中文问题 本来在自己的机器上运行挺好,但是测试说发现乱码,内心直呼不可能吧,结果还真是,原来的代码如下: if (val_type.equals("OCTET STRING")){ //字符串类型转码,防止里面有中文内容 strValue = new Str

SNMP4J与ObjectSNMP对比分析之我见

SNMP4J是一个用Java来实现SNMP(简单网络管理协议)协议的开源项目.它支持以命令行的形式进行管理与响应.Object SNMP是一个面向对象的SNMP开发组件,与关系数据库流行的O-R Mapping技术类似,实现了Object到SNMP MIB的操作映射(简称O-M Mapping).使用SNMP4J与ObjectSNMP开发类似于使用原生JDBC开发与Hibernate框架. SNMP4J介绍 SNMP4J是一个用Java来实现SNMP(简单网络管理协议)协议的开源项目.它支持以命

【转载】 java利用snmp4j包来读取snmp协议数据(Manager端)

https://www.cnblogs.com/xdp-gacl/p/4187089.html http://doc.okbase.net/yuanfy008/archive/265663.html java利用snmp4j包来读取snmp协议数据(Manager端) 1 snmp简单介绍 java利用snmp4j包来读取snmp协议数据,很简单的一个流程,就是利用java来读取运行snmp协议的数据,例如服务器.PC机或者路由器等运行了snmp协议的设备. snmp协议是什么呢? 简单网络管理

pfsense Web服务器负载平衡配置示例

在pfsense的网关和服务器中有两种类型的负载平衡功能.网关负载平衡可以通过多个WAN连接分发Internet绑定的流量.服务器负载平衡管理传入流量,因此它利用多个内部服务器进行负载分配和冗余,服务器负载平衡允许流量在多个内部服务器之间分配,它最常用于Web服务器和SMTP服务器.下面我们就以实例来介绍服务器负载平衡的设置. 下面介绍如何通过pfsense2.32配置Web服务器的负载平衡. 网络环境 服务器负载平衡示例网络环境 上图为示例网络环境.它由单个防火墙组成,使用其WAN IP地址池