`

利用SNMP4J实现Snmp Trap完整例子

阅读更多

下面是两个用于发送和接收Trap报文信息的类:

 

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();
	}

}

 

 

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

 

分享到:
评论
9 楼 zhanjia 2013-05-17  
windseamless 写道
为什么我使用这两段代码总是没有结果,而且会报错呢

首先确保要监测的目标安装并启用了SNMP服务
8 楼 windseamless 2013-05-17  
为什么我使用这两段代码总是没有结果,而且会报错呢
7 楼 pch272215690 2012-05-18  
这两段代码我们还在用,支持。。。
6 楼 berlou 2009-11-11  
做网络监控是很有前途的, 云计算服务商将来将非常依赖网络监控系统。庞大的计算机集群和网络资源是需要非常好的监控系统的。
5 楼 herry 2009-11-11  
那就处于等待状态啊,类似数据库的连接池差不多,如果都消耗光了,那只能一个个排队了
4 楼 slf616 2009-11-10  
谢谢你的示例!!我现在有个疑问:threadPool = ThreadPool.create("Trap", 2);  
上面这句是使用线程池创建了2个等待trap的线程,如果成千个trap发送过来,这两个线程都被用光了,会出现什么情况?? 线程池会不会自动增加线程?? 谢谢!
3 楼 herry 2009-08-27  
<div class="quote_title"><span><span>SnmpUtilSendTrap 中冒失必须得设置 sysTime和trapId吧</span></span></div>
<div class="quote_title"> //必须设定第一个变量为sysUpTime<br>        pdu.add(new VariableBinding(SnmpConstants.sysUpTime, new TimeTicks(new UnsignedInteger32(1000).toLong())));<br><br> //设定第二个变量snmpTrapOID<br>        pdu.add(new VariableBinding(SnmpConstants.snmpTrapOID, new OID(".1.2.156.112546.16.0.1")));<br>
</div>
<div class="quote_title">否者的话,会出现解析不了的错误。</div>
<div class="quote_title">另外Trap没有返回信息,所以也没必要处理 Response<br>
</div>
<div class="quote_title">zhanjia 写道</div>
<div class="quote_div">
<p>下面是两个用于发送和接收Trap报文信息的类:</p>
<p> </p>
<pre name="code" class="java">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 &amp;&amp; respEvnt.getPDU() != null) {
        Vector&lt;VariableBinding&gt; recVBs = respEvnt.getPDU().getVariableBindings();
           for (int i = 0; i &lt; 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();
}

}</pre>
<p> </p>
<p> </p>
<pre name="code" class="java">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 &amp;&amp; respEvnt.getResponse() != null) {
Vector&lt;VariableBinding&gt; recVBs = respEvnt.getResponse()
.getVariableBindings();
for (int i = 0; i &lt; 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();
}
}

}</pre>
<p> </p>
<p> </p>
<p>1、运行MultiThreadedTrapReceiver类,提示“开始监听Trap信息!”并处理监听状态</p>
<p>2、运行SnmpUtilSendTrap类,运行完毕后,将会在“开始监听Trap信息!”后面显示:</p>
<p>1.3.6.1.2.3377.10.1.1.1.1 : SnmpTrap<br>1.3.6.1.2.3377.10.1.1.1.2 : JavaEE</p>
<p>MultiThreadedTrapReceiver输出面板中显示以上两行即表示测试成功!</p>
<p> </p>
<p>说明:</p>
<p>      本例只在本人电脑上测试过,操作系统为Windows</p>
<p> </p>
</div>
<p> </p>
2 楼 tom840520 2009-07-29  
啥都不说,就是支持!
1 楼 zousch 2009-04-21  
http://publib.boulder.ibm.com/infocenter/tivihelp/v8r1/index.jsp?topic=/com.ibm.netcool_OMNIbus.doc/gateways/snmp/snmp/wip/concept/snmp_intro.html

有人做过这方面吗?

相关推荐

    snmp trap例子 源码

    vc++ snmp trap例子 源码

    利用SNMP#NET做trap接收器

    利用SNMP#NET做的trap接收器例子

    UDP的发送接收例子 及SNMP trap

    NULL 博文链接:https://jyao.iteye.com/blog/357216

    snmp例子程序dgf

    snmp例子程序dgf inform/trap

    C++ Snmp实例程序

    基于VS下的C++ SNMP实例程序,带SNMP库源码,LIB及其编译方法文档,DEMO均测试通过(包括获取OID和TRAP服务)。

    SNMP++中文文档 (pdf版,我的资源里有word版的)

    3.1. 完整的一套SNMP C++类 3.2. SNMP内存的自动管理 3.3. 简单易用的 3.4. 强大灵活的 3.5. 可移植对象的 3.6. 自动超时和重发机制 3.7. 阻塞模式 3.8. 异步的非阻塞模式 3.9. Notification、Trap的收发 3.10. 通过...

    发送和接收snmp例子代码

    Windows上实现snmp发送与接收的例子程序,发送的例子是发送的trap,接收例子是接收后提取出数据包中的oid等数据

    gosnmptrap:用go(golang)编写的snmp陷阱服务器

    SNMP陷阱的Golang工具 gosnmptrap是用于Go(Golang)的开源SNMP陷阱服务器库。 这使您可以设置陷阱服务器以从设备(例如思科交换机)接收陷阱。 到现在为止,gosnmptrap支持 Snmp V1陷阱 Snmp V2陷阱 安装 最简单...

    net snmp代理开发

    自己总结的net-snmp代理的开发,包括叶子,表以及trap的代码.MIB是自己写得一个最简单的例子,功能都实现了.

    snmp agent开发包

    这是一个snmp agent开发包,完全支持snmpv1和snmpv2c(目前暂时不支持Counter64)的 各种操作包括get,getnext,getbulk,set和v1,v2两种Trap。用户编写程序时不需考虑协议 细节,程序框架由mib编译器自动生成,使用...

    snmp agent

    senp get set trap例子程序

    TCP/IP详解 卷1完整版

    《TCP/IP详解,卷1:协议》是一本完整而详细的TCP/IP协议指南。描述了属于每一层的各个协议以及它们如何在不同操作系统中运行。作者用Lawrence Berkeley实验室的tcpdump程序来捕获不同操作系统和TCP/IP实现之间传输...

    TCP_IP详解卷1

    29.6.4 例子:服务器崩溃 358 29.6.5 等幂过程 360 29.7 第3版的NFS 360 29.8 小结 361 第30章 其他的TCP/IP应用程序 363 30.1 引言 363 30.2 Finger协议 363 30.3 Whois协议 364 30.4 Archie、WAIS、Gopher、...

    TCPIP详解卷[1].part04

    29.6.4 例子:服务器崩溃 358 29.6.5 等幂过程 360 29.7 第3版的NFS 360 29.8 小结 361 第30章 其他的TCP/IP应用程序 363 30.1 引言 363 30.2 Finger协议 363 30.3 Whois协议 364 30.4 Archie、WAIS、Gopher、...

    TCPIP详解卷[1].part09

    29.6.4 例子:服务器崩溃 358 29.6.5 等幂过程 360 29.7 第3版的NFS 360 29.8 小结 361 第30章 其他的TCP/IP应用程序 363 30.1 引言 363 30.2 Finger协议 363 30.3 Whois协议 364 30.4 Archie、WAIS、Gopher、...

    TCPIP详解卷[1].part03

    29.6.4 例子:服务器崩溃 358 29.6.5 等幂过程 360 29.7 第3版的NFS 360 29.8 小结 361 第30章 其他的TCP/IP应用程序 363 30.1 引言 363 30.2 Finger协议 363 30.3 Whois协议 364 30.4 Archie、WAIS、Gopher、...

    TCPIP详解卷[1].part05

    29.6.4 例子:服务器崩溃 358 29.6.5 等幂过程 360 29.7 第3版的NFS 360 29.8 小结 361 第30章 其他的TCP/IP应用程序 363 30.1 引言 363 30.2 Finger协议 363 30.3 Whois协议 364 30.4 Archie、WAIS、Gopher、...

    TCPIP详解卷[1].part06

    29.6.4 例子:服务器崩溃 358 29.6.5 等幂过程 360 29.7 第3版的NFS 360 29.8 小结 361 第30章 其他的TCP/IP应用程序 363 30.1 引言 363 30.2 Finger协议 363 30.3 Whois协议 364 30.4 Archie、WAIS、Gopher、...

Global site tag (gtag.js) - Google Analytics