`
信仰在天空飘荡
  • 浏览: 12366 次
社区版块
存档分类
最新评论

SNMP4J实现SNMP TRAP

    博客分类:
  • SNMP
阅读更多

近期项目和华为的接口有要求用SNMP做实时告警的上送,在网上查找了些资料,整理了下

SNMP分为:SNMP TRAP\SNMP GET\SNMP SET

     1.SNMP TRAP简单说一般就是Manager和agent之间拿来传输数据,Manager会一直监听着代理进程发送           TRAP消息 

     2.SNMP GET看到GET就知道就是从SNMP服务端获取某个节点的数据

     3.SNMP SET就是设置SNMP服务端的某个节点的数据

实现SNMPTRAP需SNMP4J JAR包    http://www.snmp4j.org/html/download.html官网下载

1.首先实现SNMP TRAP接收消息服务端,监听Agent发来的TRAP消息

package com.eshore.snmptrap;
 
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:127.0.0.1/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 = (Vector<VariableBinding>) 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();  
    }  
  
}  

 

 

2.再写个Agent向服务端发送TRAP消息

 

package com.eshore.snmptrap;
 
import java.io.IOException;
import java.util.Date;
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.Integer32;
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:127.0.0.1/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.4.1.2011.2.15.2.1.2.1.1.1.1"), new OctetString("SNMPTEST")));  
        
        pdu.add(new VariableBinding(new OID(".1.3.6.1.4.1.2011.2.15.2.1.2.1.1.1.2"), new Integer32(10)));  
        
        pdu.add(new VariableBinding(new OID(".1.3.6.1.4.1.2011.2.15.2.1.2.1.1.1.3"), new OctetString(new Date().toString()))); 
        
        pdu.setType(PDU.TRAP);  
  
        // 向Agent发送PDU,并接收Response  
        ResponseEvent respEvnt = snmp.send(pdu, target);  
        
        // 解析Response  
        if (respEvnt != null && respEvnt.getResponse() != null) {  
            Vector<VariableBinding> recVBs = (Vector<VariableBinding>) 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();  
        }  
    }  
  
}  

 

 

 

 

分享到:
评论

相关推荐

    snmp4j实现snmp trap 发送与接收

    SNMPTrap 的定义 SNMP Trap 是一种异步 Notification 消息,用于在网络设备中报告事件或警报信息。Trap 消息可以由网络设备发送到网络管理站点,以便实时监控和管理网络设备的状态。 SNMP4J 库的使用 SNMP4J 库...

    利用SNMP4J实现Snmp Trap完整例子

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

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

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

    用SNMP4J实现的Trap源码

    在这个项目中,"用SNMP4J实现的Trap源码"是基于JAVA语言利用SNMP4J库编写的,旨在帮助开发者理解和实践如何通过编程方式实现SNMP Trap的功能。下面将详细解释相关的知识点: 1. **SNMP4J库**:SNMP4J是一个开源的...

    java_conn_SNMPtrap_send_accept.rar_SNMP_SNMPtrap_snmp java

    2. **SNMPTrap实现**:`利用SNMP4J实现Snmp Trap完整例子.mht`文件详细解释了如何使用SNMP4J发送和接收SNMPTrap。SNMPTrap的发送涉及设置陷阱源、目的地、协议版本、陷阱类型和相关变量绑定;接收则需要配置Trap监听...

    SNMP实例大全--snmp4j(get ,trap,set,取mib)

    本文将详细介绍SNMP实例,特别是通过Java库snmp4j实现的GET、GETNEXT、SET操作以及TRAP发送和MIB获取。 1. **SNMP基本概念** SNMP由三个主要组件构成:管理站(Manager)、代理(Agent)和管理信息库(MIB)。管理...

    基于SNMP4J的SNMP操作实现代码

    本文将深入探讨如何使用SNMP4J来实现SNMP的基本操作,包括GET、GETNEXT、SET和TRAP。 1. SNMP协议基础: SNMP协议主要由管理站(Manager)和代理(Agent)两部分组成。管理站负责发送请求并接收响应,而代理则驻留...

    snmp4j的发送和接收trap.zip

    SNMP4j是一个Java库,用于实现SNMP协议的客户端功能,如发送Trap、Get、Set请求等。这个压缩包"snmp4j的发送和接收trap.zip"包含了使用SNMP4j进行Trap操作的相关资源。 首先,我们要了解SNMP Trap。在SNMP中,Trap...

    snmp4j.rar_SNMP_SNMP4J.jar_snmp4j的jar包_网络设备监控

    SNMP4J是一个Java实现的SNMP协议库,使得Java开发者能够轻松地在应用程序中集成SNMP功能,从而对网络设备进行监控和管理。 SNMP4J.jar是这个库的核心组件,包含了SNMP协议的各种操作所需的类和方法。这个压缩包中的...

    snmp++实现Trap接收

    **SNMP++实现Trap接收详解** SNMP(Simple Network Management Protocol)是一种广泛应用于网络设备管理的协议,它允许网络管理员远程监控和管理网络设备。在SNMP中,Trap是一种网络设备向管理站发送的被动通知,...

    snmp4j源码和API

    SNMP4J是一个Java实现的简单网络管理协议(SNMP)的应用编程接口(API),它提供了全面的功能,用于开发SNMP应用。SNMP是网络管理领域的重要标准,用于监控和管理网络设备,如路由器、交换机和服务器。下面将详细...

    SNMP_TRAP监听工具

    SNMP TRAP是一种机制,网络设备在发生特定事件时会主动发送通知到预设的管理站,这些通知被称为TRAP消息。"SNMP_TRAP监听工具"正是用于接收并处理这些TRAP消息的应用程序。 SNMP TRAP分为多种类型,包括标准陷阱和...

    snmp trap命令接收软件

    4. 变量绑定列表:包含关于引发Trap事件的具体信息,如受影响的对象的值。 要测试你的trap命令,首先需要确保你的网络设备支持SNMP,并且已经正确配置了SNMP代理。这通常涉及设置社区字符串(用于认证的简单文本...

    snmp_trap 协议接收工具

    4. 启动工具:运行jar文件启动`snmp_trap`服务,开始监听Trap消息。 5. 解析并查看Trap:接收到Trap后,工具会显示事件详情,帮助管理员理解问题所在。 在Linux和Unix环境下使用`snmp_trap`工具: 1. 安装Open SNMP...

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

    SNMP4J是一个开源的Java库,专门设计用于实现SNMP协议的客户端功能,使得开发者能够从网络设备中读取或设置管理信息。本篇文章将详细探讨如何使用SNMP4j库在Java中读取SNMP协议数据。 首先,了解SNMP是必要的。SNMP...

    snmp4j.zip_java使用snmp4j_snmp4j_snmp4j java

    SNMP4J是一个Java库,专门用于实现简单网络管理协议(SNMP)的应用程序。SNMP是一种广泛应用于网络设备管理的标准协议,它允许系统管理员远程监控和管理网络设备,如路由器、交换机、服务器等。在Java环境中,SNMP4J...

    使用snmp4j实现Snmp功能

    总的来说,使用snmp4j实现SNMP功能涉及初始化SNMP客户端、设置目标设备、创建和发送PDU,以及处理返回的响应。这个过程可以扩展到更复杂的SNMP操作,包括遍历MIB树、批量GET请求、设置设备属性等。了解这些基础知识...

    snmp4j包来读取snmp协议数据

    读取SNMP变量:SNMP4j通过`GetRequest`或`GetNextRequest`实现对网络设备的查询。以下是如何获取特定OID(Object Identifier)的值: ```java PDU pdu = new PDU(); pdu.add(new VariableBinding(new OID("1.3.6.1....

    snmp4j的jar包

    SNMP4J是一个基于Java语言实现的简单网络管理协议(SNMP)的开源库,它为开发者提供了在Java环境中开发SNMP应用的全面支持。SNMP是网络设备管理和监控的标准协议,广泛应用于网络设备配置、性能监控以及故障排查等...

Global site tag (gtag.js) - Google Analytics