`

利用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

有人做过这方面吗?

相关推荐

    java_conn_SNMPtrap_send_accept.rar_SNMP_SNMPtrap_snmp java

    5. **SNMP4J示例代码**:`JAVA利用SNMP4J实现Snmp Trap例子.mht`提供了具体的Java代码示例,帮助读者理解和实践SNMPTrap的发送过程。 6. **SNMP4J官方资源**:`Download SNMP4J官网地址-SNMP4J的jar说明.mht`指向了...

    java利用snmp4j包来读取snmp协议数据

    SNMP4j库为Java开发者提供了一个完整的SNMP解决方案,包括PDU(协议数据单元)的构建、编码、解码以及错误处理等功能。使用SNMP4j,你可以轻松地创建SNMPv1、SNMPv2c或SNMPv3的请求,并处理来自目标设备的响应。 ...

    snmp4j包来读取snmp协议数据

    本文将深入探讨如何利用SNMP4j包来读取SNMP协议数据。 首先,理解SNMP4j的基本概念至关重要。SNMP4j是一个开源的Java库,完全实现了SNMPv1、SNMPv2c和SNMPv3标准。它提供了一个全面的API,使得开发人员能够创建SNMP...

    UDP的发送接收例子 及SNMP trap

    通过以上代码示例,我们可以学习到如何在实际项目中使用Java实现UDP通信,以及如何利用SNMP4J库来处理SNMP Trap。这些知识对于网络编程和设备管理具有重要的实践意义。在深入理解这些概念后,开发者可以更有效地构建...

    使用snmp4j实现Snmp功能

    `snmp4j` 是一个用Java编写的开源库,提供了实现SNMPv1、SNMPv2c和SNMPv3功能的完整框架。在本文中,我们将探讨如何使用 `snmp4j` 库来实现SNMP的基本功能。 首先,我们需要了解SNMP的基本概念。SNMP由三部分组成:...

    snmp trap例子 源码

    这个"snmp trap例子 源码"很可能是用VC++编写的,用于帮助开发者理解和实现SNMP Trap机制。 首先,我们来深入理解SNMP和SNMP Trap的基本概念。SNMP是Internet工程任务组(IETF)定义的一组协议,用于管理系统和网络...

    SNMP4j学习开发例子及文档

    在这个"SNMP4j学习开发例子及文档"中,你可以找到一系列与SNMP和SNMP4j相关的学习资源,这对于初学者或正在做毕业设计的学生来说非常有价值。以下是一些关键知识点: 1. **SNMP协议基础**:SNMP的基本概念包括管理...

    snmp4j例子

    通过分析和运行这些示例,你可以深入理解SNMP协议的工作原理,以及如何利用SNMP4j库在Java项目中实现网络管理和监控功能。对于任何对网络管理或Java编程感兴趣的开发者来说,这些都是非常有价值的知识点。

    snmp的java实现

    这个例子展示了如何使用snmp4j库发送一个SNMP GET请求,获取目标设备的`sysDescr.0`对象(这是设备的描述信息)。你需要替换`yourPassword`为你的SNMPv3密码,如果使用的是SNMPv1或v2c,则无需设置USM和安全参数,只...

    snmp4j

    SNMP4J是一个Java实现的简单网络管理协议(SNMP)的应用程序编程接口(API),它为开发人员提供了在Java环境中实现SNMP功能的工具。SNMP被广泛用于网络设备的管理和监控,如路由器、交换机、打印机等,通过网络进行...

    java通过SNMP协议获取交换机设备信息(如:交换机下的PC机MAC、IP、连接端口号等信息)

    Snmp4j是一个开源的Java SNMP库,提供了SNMP v1、v2c和v3的支持,允许开发者编写应用程序来执行SNMP操作,如GET、SET和TRAP。在我们的例子中,我们将使用Snmp4j来获取交换机设备的OID(对象标识符)信息。 OID是...

    C++ Snmp实例程序

    总的来说,这个C++ SNMP实例程序提供了一套完整的工具,帮助开发者快速理解和实践SNMP在C++环境中的应用。通过学习和分析提供的源码、文档和示例,你可以深入理解SNMP协议的工作原理,并且能够创建自己的SNMP应用...

    netsnmp例子程序

    这个程序可能包括了初始化SNMP会话、设置目标主机和社区字符串、以及执行GET、SET或Trap操作等步骤。通过阅读和分析这段代码,我们可以学习如何在实际项目中集成Netsnmp功能,实现对网络设备的远程监控。 其次,`...

    snmp例子(c++实现)

    这个库提供了对SNMP协议的完整实现,包括SNMPv1、SNMPv2c和SNMPv3。 2. SNMP版本理解:SNMP有三个主要版本,每个版本有不同的安全性和功能特性。SNMPv1是最基础的,不提供认证和加密;SNMPv2c增加了错误处理能力,...

    snmp例子程序dgf

    在"snmp例子程序dgf"中,"dgf"可能是开发人员或项目名称的一部分,具体的实现细节可能包括编写SNMP代理来发送inform或trap,以及管理站如何处理和确认这些通知。文件“www.pudn.com.txt”可能包含有关示例代码、文档...

    用C实现的SNMP源码

    这个简单的SNMP例子可能只包含基础的GET和SET操作,而不涉及复杂的 Trap 处理或安全管理。通过阅读和分析源代码,你可以了解SNMP请求的构建、发送和响应处理的流程,这对于深入理解SNMP协议非常有帮助。 为了进一步...

    SNMP+MIB完整手册

    SNMP+MIB 完整手册 _SNMP 和 MIB 的概念_ SNMP(Simple Network Management Protocol)是一种简单的网络管理协议,由互联网工程任务组(IETF)定义。SNMP 基于简单网关监视协议(SGMP),允许管理工作站远程管理...

    SNMP探测器 关于SNMP的Java编程

    在Java编程环境中,SNMP4J是一个开源库,为开发者提供了实现SNMP协议的接口和类。 SNMP4J库提供了丰富的功能,包括发送GET、GETNEXT、SET请求以及接收TRAP通知。GET操作用于获取MIB对象的值,GETNEXT用于遍历MIB树...

    snmp中文教程-java

    import org.snmp4j.Snmp; import org.snmp4j.TransportMapping; import org.snmp4j.smi.Address; import org.snmp4j.smi.GenericAddress; import org.snmp4j.smi.Oid; import org.snmp4j.smi.TcpAddress; ...

Global site tag (gtag.js) - Google Analytics