`
cuisuqiang
  • 浏览: 3960221 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
3feb66c0-2fb6-35ff-968a-5f5ec10ada43
Java研发技术指南
浏览量:3670062
社区版块
存档分类
最新评论

SNMP 使用SNMP4J V2进行TRAP

阅读更多

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

 

1
1
分享到:
评论
7 楼 cuisuqiang 2014-06-04  
KuhYygy 写道
请问下楼主,如果trap里的包含中文的信息,应该如何解码,准确来讲,应该如何选择字符编码?

String s = new String(((OctetString)recVB.getVariable()).getValue(), "UTF-8");

如上,我看有些写UTF-8,有些写GBK,请问这个应该怎么选择,或者有其它的方法解释出trap里的中文?谢谢~

如果是我们俩之间做通信,咱俩之间肯定知道字符串是什么编码格式的,为什么会出现不知道编码的情况?
6 楼 KuhYygy 2014-06-03  
请问下楼主,如果trap里的包含中文的信息,应该如何解码,准确来讲,应该如何选择字符编码?

String s = new String(((OctetString)recVB.getVariable()).getValue(), "UTF-8");

如上,我看有些写UTF-8,有些写GBK,请问这个应该怎么选择,或者有其它的方法解释出trap里的中文?谢谢~
5 楼 lanqiu17 2014-02-21  
cuisuqiang 写道
lanqiu17 写道
  @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()); 
            } 
        } 
    }

楼主,我觉得这里应该交给线程去处理。它占用的是接收trap线程池中的线程,会阻塞trap消息的接收

SNMP4J用的是堵塞线程池处理,既然已经有线程池处理了,为什么再做一层线程处理?除非是担心收到的消息很长时间处理不掉,那增大SNMP线程池就可以了


但当管理设备过多,并且发送trap消息频繁时,增大snmp线程池只是将问题延后了
4 楼 cuisuqiang 2014-02-20  
lanqiu17 写道
  @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()); 
            } 
        } 
    }

楼主,我觉得这里应该交给线程去处理。它占用的是接收trap线程池中的线程,会阻塞trap消息的接收

SNMP4J用的是堵塞线程池处理,既然已经有线程池处理了,为什么再做一层线程处理?除非是担心收到的消息很长时间处理不掉,那增大SNMP线程池就可以了
3 楼 lanqiu17 2014-02-20  
  @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()); 
            } 
        } 
    }

楼主,我觉得这里应该交给线程去处理。它占用的是接收trap线程池中的线程,会阻塞trap消息的接收
2 楼 lanqiu17 2014-02-20  
哥们, 你也是做网管软件的啊 , 能交流下吗
1 楼 cuisuqiang 2012-06-05  
如果Trap时需要给客户端返回一些信息,可以参考如下代码:
	/**
	 * 实现CommandResponder的processPdu方法, 用于处理传入的请求、PDU等信息
	 * 当接收到trap时,会自动进入这个方法
	 */
	@SuppressWarnings("unchecked")
	public void processPdu(CommandResponderEvent respEvnt) {
		List<VariableBinding> list = new ArrayList<VariableBinding>();
		// 解析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());
	           	Random random = new Random();
	           	list.add(new VariableBinding(recVB.getOid(),new Integer32(random.nextInt(1999))));
	  		}        	
	       	org.snmp4j.mp.StatusInformation statusInformation = new org.snmp4j.mp.StatusInformation();
			org.snmp4j.mp.StateReference ref = respEvnt.getStateReference();
			try {
				// 创建 PDU
				PDU vPDU = respEvnt.getPDU();
				vPDU.setType(PDU.RESPONSE);
				Random random = new Random();
				for(int i = 0;i< list.size() ;i++){
					VariableBinding vb = list.get(i);
					vb.setVariable(new Integer32(random.nextInt(9999)));
					vPDU.set(i,vb);
				}
				respEvnt.getMessageDispatcher().returnResponsePdu(
						respEvnt.getMessageProcessingModel(),
						respEvnt.getSecurityModel(),
						respEvnt.getSecurityName(),
						respEvnt.getSecurityLevel(), 
						vPDU,
						respEvnt.getMaxSizeResponsePDU(), 
						ref,
						statusInformation);
			} catch (Exception e) {
				e.printStackTrace();
			}          	
		}
	}

相关推荐

    snmp4j实现snmp trap 发送与接收

    本文将详细介绍使用 SNMP4J 实现 SNMP Trap 发送与接收的知识点。 SNMPTrap 的定义 SNMP Trap 是一种异步 Notification 消息,用于在网络设备中报告事件或警报信息。Trap 消息可以由网络设备发送到网络管理站点,...

    Java使用SNMP4J实现snmp trap接口发送消息_20170808_LK

    本文将详细讲解如何使用Java的SNMP4J库来实现SNMP Trap接口,发送这些消息。 首先,我们需要了解SNMP4J库。SNMP4J是Java平台上的一个开源SNMP库,它提供了完整的SNMPv1、SNMPv2c和SNMPv3支持。该库不仅包含SNMP协议...

    利用SNMP4J实现Snmp Trap完整例子

    利用SNMP4J实现Snmp Trap完整例子 - 企业应用 - Java - JavaEye论坛.mht

    用SNMP4J实现的Trap源码

    SNMP(简单网络管理协议)是一种广泛用于网络设备...通过理解这些概念并参考"SnmpTrap"的源码,开发者可以更好地掌握如何使用SNMP4J在Java环境中实现SNMP Trap功能,从而在实际项目中实现网络设备的自动监控和报警。

    基于SNMP4J的SNMP操作实现代码

    SNMP(Simple Network Management Protocol)是一种广泛用于网络设备管理的标准协议,它允许网络管理员远程监控和配置网络设备。...通过理解和掌握SNMP4J的使用,你可以有效地进行网络管理,提升运维效率。

    snmp4j.zip_java使用snmp4j_snmp4j_snmp4j java

    在提供的“snmp4j.pdf”文档中,你将找到更多关于如何使用SNMP4J的详细示例和教程,包括初始化设置、发送请求、处理响应、以及设置陷阱监听器等内容。这份文档将帮助你深入理解和应用SNMP4J库,以便在Java环境中有效...

    snmp4j包来读取snmp协议数据

    以上代码片段展示了如何使用SNMP4j包读取SNMP协议数据的基本步骤,包括初始化SNMP会话、发送GET请求、处理陷阱以及配置SNMPv3安全模型。实际应用中,根据网络设备的具体情况,可能需要对这些基础代码进行相应的调整...

    Snmp_trap的配置与使用.doc

    - **程序方式发送Trap**:对于某些特定需求,可以编写C语言程序,使用SNMP库(如`send_easy_trap`或`send_v2trap`)发送Trap。 2. **Manager 端配置**: - **配置 snmptrapd.conf**:设置访问权限,添加Trap...

    Snmp+trap+mib开发代码

    开发者需要通过SNMP库(如Python的pysnmp或Java的SNMP4J)来解析和读取这些信息。这个过程包括解析MIB文件,映射对象标识符(OID)到具体的变量,以及查询和获取这些变量的当前值。 2. **设备数据的修改**:SNMP...

    snmp4j api文档

    开发者可以通过查阅文档,了解每个类的功能、方法的参数和返回值,以便更有效地使用SNMP4J进行SNMP编程。 总之,SNMP4J为Java开发者提供了一个强大且灵活的框架,用于构建SNMP应用程序。通过理解和掌握SNMP4J API,...

    如何利用snmp4j-agent在PC端模拟snmp服务

    本文将深入探讨如何使用SNMP4J-Agent工具在个人计算机上模拟SNMP服务,以便进行测试和开发。 SNMP4J-Agent是SNMP4J项目的一部分,是一个开源的Java库,用于实现SNMP代理功能。它提供了丰富的API,可以方便地构建...

    snmp4j源码和API

    下面将详细讨论SNMP4J的核心类、功能以及API的使用。 首先,我们来看一下`TransportMapping`类。这个类是SNMP4J中的传输映射接口,负责处理SNMP报文的网络传输。它定义了如何将PDU(协议数据单元)封装到网络协议中...

    SNMP V1 V2 V3版本的联系和区别 ..docx

    SNMP(Simple Network Management Protocol)是一种应用层协议,使用 UDP 封装进行传输,旨在管理网络上的节点,包括工作站、路由器、交换机、集线器和其他的外围设备。SNMP 使网络管理者能够管理网络性能,发现和...

    C#基于SnmpSharpNet做的SNMP客户端(SNMP V1和V2版本)

    它支持SNMP V1、V2c和V3版本,涵盖了Get、Set、Trap接收等功能。使用该库,开发者可以创建SNMP代理,执行读取、写入操作,甚至处理SNMP陷阱。 **SNMP V1和SNMP V2c的区别** SNMP V1是最原始的版本,主要用于简单的...

    snmp.zip_SNMP4J MIB_java mib_mib_mib snmp4j_snmp模拟

    在提供的压缩文件列表中,"www.pudn.com.txt"可能是一个包含更多关于SNMP4J使用示例或MIB模拟细节的文本文件,而"snmp"可能是一个实际的代码文件或目录,包含具体的SNMP4J示例代码。为了进一步学习和实践,你应该...

    SNMP4J 的jar包

    `snmp4j-agent-2.0.10a.jar`则是SNMP4J的代理扩展,它提供了构建SNMP代理所需的功能,如MIB对象的管理、变量绑定(Variable Binding)处理、陷阱(Trap)发送等。MIB(Management Information Base)是定义网络设备...

    SNMP4J远程获取设备信息案例

    SNMP4J是Java开发人员实现SNMP功能的首选工具,因为它提供了完整的SNMPv1、v2c和v3支持,包括Trap处理、Get、Set操作以及Walk机制。在实际应用中,我们可以通过以下步骤使用SNMP4J: 1. **导入SNMP4J库**:首先,在...

    snmp4j开发包,强烈推荐

    使用SNMP4j进行开发时,你需要了解以下关键概念和方法: 1. **Session**: 这是SNMP4j的核心接口,代表与SNMP实体的连接。你可以通过`SessionFactory`创建一个`Session`对象,设置相应的参数,如版本号、社区字符串...

    net-snmp,c#,收发trap,有模拟客户端和管理端,含代码

    总结,这个项目提供了一个全面的SNMP实践案例,涵盖了从基本的GET/SET操作到复杂的Trap收发,对于熟悉和掌握C#环境下使用net-snmp库进行SNMP开发具有很高的参考价值。通过源码的学习和实践,开发者可以进一步提升...

    snmp4j最新开发包

    9. **使用示例**:使用SNMP4J进行设备管理通常涉及以下步骤: - 创建`TransportMapping`实例,如`UdpTransportMapping`,并注册到`MessageDispatcher`。 - 创建`CommunityData`或`UsmUserData`,根据SNMP版本设置...

Global site tag (gtag.js) - Google Analytics