SNMP trap(SNMP 陷阱):某种入口,到达该入口会使SNMP被管设备主动通知SNMP管理器,而不是等待SNMP管理器的再次轮询!
在网管系统中,被管理设备中的代理可以在任何时候向网络管理工作站报告错误情况,例如预制定阈值越界程度等等。代理并不需要等到管理工作站为获得这些错误情况而轮询他的时候才会报告。这些错误情况就是众所周知的SNMP自陷(trap)!
网管系统开放监听端口,始终监听被管设备对于该端口的通信信息。被管设备发生故障会主动向该端口发送故障信息,网管系统收到消息进行告警!
首先要模拟工作站对端口进行监听,请看如下程序:
package t3; 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信息 */ public class MultiThreadedTrapReceiver implements CommandResponder { public static void main(String[] args) { MultiThreadedTrapReceiver multithreadedtrapreceiver = new MultiThreadedTrapReceiver(); multithreadedtrapreceiver.run(); } private MultiThreadedMessageDispatcher dispatcher; private Snmp snmp = null; private Address listenAddress; private ThreadPool threadPool; public MultiThreadedTrapReceiver() { } public void run() { try { init(); snmp.addCommandResponder(this); System.out.println("--------------->开始监听Trap信息!<---------------"); } catch (Exception ex) { ex.printStackTrace(); } } 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:127.0.0.1/2008")); // 本地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(); } /** * 实现CommandResponder的processPdu方法, 用于处理传入的请求、PDU等信息 * 当接收到trap时,会自动进入这个方法 */ @SuppressWarnings("unchecked") 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()); } } } }
我们采用的是实现 CommandResponder 接口,该接口有一个方法
public void processPdu(CommandResponderEvent respEvnt)
在该端口接收到信息时会主动调用该方法!
运行Main方法,控制台提示
-------------->开始监听Trap信息!<---------------
程序对本机端口 2008 开始监听!
使用命令
>netstate -an
发现本机UDP端口已经开始监听!
我们再来实现Agent,被管设备向网管系统TRAP信息:
package t3; 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.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信息 */ public class SnmpUtilSendTrap { private Snmp snmp = null; private Address targetAddress = null; public static void main(String[] args) { try { SnmpUtilSendTrap util = new SnmpUtilSendTrap(); util.initComm(); util.sendPDU(); } catch (IOException e) { e.printStackTrace(); } } public void initComm() throws IOException { // 设置管理进程的IP和端口 targetAddress = GenericAddress.parse("udp:127.0.0.1/2008"); TransportMapping transport = new DefaultUdpTransportMapping(); snmp = new Snmp(transport); transport.listen(); } /** * 向管理进程发送Trap报文 * * @throws IOException */ @SuppressWarnings("unchecked") public void sendPDU() throws IOException { // 设置 target CommunityTarget target = new CommunityTarget(); target.setAddress(targetAddress); // 通信不成功时的重试次数 target.setRetries(2); // 超时时间 target.setTimeout(1000 * 5); // snmp版本 target.setVersion(SnmpConstants.version2c); // 创建 PDU PDU pdu = new PDU(); pdu.add(new VariableBinding(new OID("1.3.6.1.2.1.1.6.0"),new OctetString("aaaa"))); pdu.add(new VariableBinding(new OID("1.3.6.1.2.1.1.2.0"),new OctetString("bbbb"))); pdu.setType(PDU.TRAP); // 向Agent发送PDU,并接收Response snmp.send(pdu, target); System.out.println("------------> END<--------------"); } }
使用的SNMP版本应该是 V2,V1的操作与V2 TRAP不同!
运行后控制台打印运行结束!
网管系统模拟端打印收到的OID和OID对应的值信息!
请您到ITEYE看我的原创:http://cuisuqiang.iteye.com
或支持我的个人博客,地址:http://www.javacui.com
相关推荐
本文将详细介绍使用 SNMP4J 实现 SNMP Trap 发送与接收的知识点。 SNMPTrap 的定义 SNMP Trap 是一种异步 Notification 消息,用于在网络设备中报告事件或警报信息。Trap 消息可以由网络设备发送到网络管理站点,...
本文将详细讲解如何使用Java的SNMP4J库来实现SNMP Trap接口,发送这些消息。 首先,我们需要了解SNMP4J库。SNMP4J是Java平台上的一个开源SNMP库,它提供了完整的SNMPv1、SNMPv2c和SNMPv3支持。该库不仅包含SNMP协议...
利用SNMP4J实现Snmp Trap完整例子 - 企业应用 - Java - JavaEye论坛.mht
SNMP(简单网络管理协议)是一种广泛用于网络设备...通过理解这些概念并参考"SnmpTrap"的源码,开发者可以更好地掌握如何使用SNMP4J在Java环境中实现SNMP Trap功能,从而在实际项目中实现网络设备的自动监控和报警。
SNMP(Simple Network Management Protocol)是一种广泛用于网络设备管理的标准协议,它允许网络管理员远程监控和配置网络设备。...通过理解和掌握SNMP4J的使用,你可以有效地进行网络管理,提升运维效率。
在提供的“snmp4j.pdf”文档中,你将找到更多关于如何使用SNMP4J的详细示例和教程,包括初始化设置、发送请求、处理响应、以及设置陷阱监听器等内容。这份文档将帮助你深入理解和应用SNMP4J库,以便在Java环境中有效...
以上代码片段展示了如何使用SNMP4j包读取SNMP协议数据的基本步骤,包括初始化SNMP会话、发送GET请求、处理陷阱以及配置SNMPv3安全模型。实际应用中,根据网络设备的具体情况,可能需要对这些基础代码进行相应的调整...
- **程序方式发送Trap**:对于某些特定需求,可以编写C语言程序,使用SNMP库(如`send_easy_trap`或`send_v2trap`)发送Trap。 2. **Manager 端配置**: - **配置 snmptrapd.conf**:设置访问权限,添加Trap...
开发者需要通过SNMP库(如Python的pysnmp或Java的SNMP4J)来解析和读取这些信息。这个过程包括解析MIB文件,映射对象标识符(OID)到具体的变量,以及查询和获取这些变量的当前值。 2. **设备数据的修改**:SNMP...
开发者可以通过查阅文档,了解每个类的功能、方法的参数和返回值,以便更有效地使用SNMP4J进行SNMP编程。 总之,SNMP4J为Java开发者提供了一个强大且灵活的框架,用于构建SNMP应用程序。通过理解和掌握SNMP4J API,...
本文将深入探讨如何使用SNMP4J-Agent工具在个人计算机上模拟SNMP服务,以便进行测试和开发。 SNMP4J-Agent是SNMP4J项目的一部分,是一个开源的Java库,用于实现SNMP代理功能。它提供了丰富的API,可以方便地构建...
下面将详细讨论SNMP4J的核心类、功能以及API的使用。 首先,我们来看一下`TransportMapping`类。这个类是SNMP4J中的传输映射接口,负责处理SNMP报文的网络传输。它定义了如何将PDU(协议数据单元)封装到网络协议中...
SNMP(Simple Network Management Protocol)是一种应用层协议,使用 UDP 封装进行传输,旨在管理网络上的节点,包括工作站、路由器、交换机、集线器和其他的外围设备。SNMP 使网络管理者能够管理网络性能,发现和...
它支持SNMP V1、V2c和V3版本,涵盖了Get、Set、Trap接收等功能。使用该库,开发者可以创建SNMP代理,执行读取、写入操作,甚至处理SNMP陷阱。 **SNMP V1和SNMP V2c的区别** SNMP V1是最原始的版本,主要用于简单的...
在提供的压缩文件列表中,"www.pudn.com.txt"可能是一个包含更多关于SNMP4J使用示例或MIB模拟细节的文本文件,而"snmp"可能是一个实际的代码文件或目录,包含具体的SNMP4J示例代码。为了进一步学习和实践,你应该...
`snmp4j-agent-2.0.10a.jar`则是SNMP4J的代理扩展,它提供了构建SNMP代理所需的功能,如MIB对象的管理、变量绑定(Variable Binding)处理、陷阱(Trap)发送等。MIB(Management Information Base)是定义网络设备...
SNMP4J是Java开发人员实现SNMP功能的首选工具,因为它提供了完整的SNMPv1、v2c和v3支持,包括Trap处理、Get、Set操作以及Walk机制。在实际应用中,我们可以通过以下步骤使用SNMP4J: 1. **导入SNMP4J库**:首先,在...
使用SNMP4j进行开发时,你需要了解以下关键概念和方法: 1. **Session**: 这是SNMP4j的核心接口,代表与SNMP实体的连接。你可以通过`SessionFactory`创建一个`Session`对象,设置相应的参数,如版本号、社区字符串...
总结,这个项目提供了一个全面的SNMP实践案例,涵盖了从基本的GET/SET操作到复杂的Trap收发,对于熟悉和掌握C#环境下使用net-snmp库进行SNMP开发具有很高的参考价值。通过源码的学习和实践,开发者可以进一步提升...
9. **使用示例**:使用SNMP4J进行设备管理通常涉及以下步骤: - 创建`TransportMapping`实例,如`UdpTransportMapping`,并注册到`MessageDispatcher`。 - 创建`CommunityData`或`UsmUserData`,根据SNMP版本设置...