`
ybyonline
  • 浏览: 40193 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

SNMP实现通信

阅读更多

 

  snmp类是SNMP4J的核心,它提供了发送和接收SNMP PDUs的方法,所有的SNMP PDU 类型都可以采用同步或者异步的方式被发送。

     Snmp采用独立的传输协议,通过TransportMapping   接口调用addTransportMapping(TransportMapping transportMapping) 方法或者采用默认的构造函数来实现传输映射,以此来实现信息的传输。

下面的代码片段是采用UDP传输方式来实现一个SNMPv3的SNMP session :

 

Java代码  复制代码
   1. Address targetAddress = GenericAddress.parse("udp:127.0.0.1/161");   
   2.     TransportMapping transport = new DefaultUdpTransportMapping();   
   3.     snmp = new Snmp(transport);   
   4.     USM usm = new USM(SecurityProtocols.getInstance(),   
   5.                      new OctetString(MPv3.createLocalEngineID()), 0);   
   6.     SecurityModels.getInstance().addSecurityModel(usm);   
   7.     transport.listen();  
 

如何实现SNMPv3信息的同步发送,下面举例说明:

Java代码  复制代码
   1. // add user to the USM   
   2.     snmp.getUSM().addUser(new OctetString("MD5DES"),   
   3.                          new UsmUser(new OctetString("MD5DES"),   
   4.                                       AuthMD5.ID,   
   5.                                      new OctetString("MD5DESUserAuthPassword"),   
   6.                                       PrivDES.ID,   
   7.                                      new OctetString("MD5DESUserPrivPassword")));   
   8.    // create the target   
   9.     UserTarget target = new UserTarget();   
  10.     target.setAddress(targetAddress);   
  11.     target.setRetries(1);   
  12.     target.setTimeout(5000);   
  13.     target.setVersion(SnmpConstants.version3);   
  14.     target.setSecurityLevel(SecurityLevel.AUTH_PRIV);   
  15.     target.setSecurityName(new OctetString("MD5DES"));   
  16.   
  17.    // create the PDU   
  18.     PDU pdu = new ScopedPDU();   
  19.     pdu.add(new VariableBinding(new OID("1.3.6")));   
  20.     pdu.setType(PDU.GETNEXT);   
  21.   
  22.    // send the PDU   
  23.     ResponseEvent response = snmp.send(pdu, target);   
  24.    // extract the response PDU (could be null if timed out)   
  25.     PDU responsePDU = response.getResponse();   
  26.    // extract the address used by the agent to send the response:   
  27.     Address peerAddress = response.getPeerAddress();   
  28. An asynchronous SNMPv1 request is sent by the following code:   
  29.   
  30.    // setting up target   
  31.     CommunityTarget target = new CommunityTarget();   
  32.     target.setCommunity(new OctetString("public"));   
  33.     target.setAddress(targetAddress);   
  34.     target.setRetries(2);   
  35.     target.setTimeout(1500);   
  36.     target.setVersion(SnmpConstants.version1);   
  37.    // creating PDU   
  38.     PDU pdu = new PDU();   
  39.     pdu.add(new VariableBinding(new OID(new int[] {1,3,6,1,2,1,1,1})));   
  40.     pdu.add(new VariableBinding(new OID(new int[] {1,3,6,1,2,1,1,2})));   
  41.     pdu.setType(PDU.GETNEXT);   
  42.    // sending request   
  43.     ResponseListener listener = new ResponseListener() {   
  44.      public void onResponse(ResponseEvent event) {   
  45.        // Always cancel async request when response has been received   
  46.        // otherwise a memory leak is created! Not canceling a request   
  47.        // immediately can be useful when sending a request to a broadcast   
  48.        // address.   
  49.         ((Snmp)event.getSource()).cancel(event.getRequest(), this);   
  50.         System.out.println("Received response PDU is: "+event.getResponse());   
  51.       }   
  52.     };   
  53.     snmp.sendPDU(pdu, target, null, listener);   
  54.   
  55. //Traps (notifications) and other SNMP PDUs can be received by adding the folling code to the first code snippet above:   
  56.     CommandResponder trapPrinter = new CommandResponder() {   
  57.      public synchronized void processPdu(CommandResponderEvent e) {   
  58.         PDU command = e.getPDU();   
  59.        if (command != null) {   
  60.           System.out.println(command.toString());   
  61.         }   
  62.       }   
  63.     };   
  64.     snmp.addCommandResponder(trapPrinter);   
  65.   
  66.   
  67.   
  68. Version:   
  69. 1.8   
  70. Author:   
  71. Frank Fock   
  72. translate:avery_leo  
 

Snmp类提供了一套有关Snmp的功能接口。具体来讲,就是发送、接受、创建Snmp消息。
    一个Snmp对象是一个Session,而在Snmp4j中,一个Session可以同多个远程设备通信。

(1) Snmp、Target、PDU三者的关系
    Target代表远程设备或者远程实体、PDU代表管理端同Target通信的数据,Snmp就代表管理者管理功能(其实就是数据的收发)的具体执行者。
       打个比方:Target就是你远方的恋人,PDU就是你们之间传递的情书、而Snmp就是负责帮你寄信收信的邮差。

(2)Snmp收发数据的两种方式
    Snmp可以同步、也可异步收发数据。详细见代码示例说明。

(3)Snmp与传输层协议
    Snmp可以定制传输层协议,一般选择udp,也可以选择tcp。详细见代码示例说明。

(4)Snmp与Usm
    创建Snmp用来发送Snmpv3版本的消息时候,一般还要创建USM,将它添加至安全模型管理器(SecriryModels)中,同时还需要向Usm中添加相应的USM用户(UsmUser)。详细见代码示例说明。

代码示例:(摘自Snmp4j的API文档)

(1)创建Snmp
    1)使用UDP传输协议

 

 

TransportMapping transport = new DefaultUdpTransportMapping();
        snmp = new Snmp(transport);
 

     2)使用TCP传输协议 

 

 

 TransportMapping transport = new DefaultTcpTransportMapping();
   snmp = new Snmp(transport);
 

    3)创建用于Snmpv3的Snmp

 

   // 创建Snmp
   TransportMapping transport =
      new DefaultUdpTransportMapping();
   Snmp snmp = new Snmp(transport);
   if (version == SnmpConstants.version3) {
       byte[] localEngineID =
            ((MPv3)snmp.getMessageProcessingModel(MessageProcessingModel.MPv3)).createLocalEngineID();
       // 创建USM
       USM usm = new USM(SecurityProtocols.getInstance(),
                      new OctetString(localEngineID), 0);
       // 将USM添加至安全模式管理器中
       // 安全模型管理器采用了单例模式,它内部可以维护为3个安全模型,分别对应Snmp三个版本
       SecurityModels.getInstance().addSecurityModel(usm);
       snmp.setLocalEngine(localEngineID, 0, 0);
       // 添加用户
       snmp.getUSM().addUser(securityName,new UsmUser(securityName,authProtocol,
                            authPassphrase,privProtocol,privPassphrase));
     } 
 

 

(2)同步收发消息

 

import org.snmp4j.*;
    ...
    Snmp snmp = new Snmp(new DefaultUdpTransportMapping());
    ...
    ResponseEvent response = snmp.send(requestPDU, target);
    if (response.getResponse() == null) {
       // request timed out
       ...
    }else {
        System.out.println("Received response from: "+
                       response.getPeerAddress());
        // dump response PDU
        System.out.println(response.getResponse().toString());
    }

(3)异步收发消息

import org.snmp4j.*;
    import org.snmp4j.event.*;
    ...
    Snmp snmp = new Snmp(new DefaultUdpTransportMapping());
    ...
    // 增加监听器
    ResponseListener listener = new ResponseListener() {
       public void onResponse(ResponseEvent event) {
            PDU response = event.getResponse();
            PDU request = event.getRequest();
            if (response == null) {
                System.out.println("Request "+request+" timed out");
            } else {
                System.out.println("Received response "+response+" on request "+
                               request);
            }
      };
     snmp.sendPDU(request, target, null, listener);
     ...

 

(4)实现trap
       实现trap需要三步:
       1)创建Snmp;
       2)对于listen()使处于网络监听(实际上是同于网络编程中的Socket监听);
       3)实现CommandResponder接口的监听器,并且调用Snmp.addCommandResponder(CommandResponder)注册监听器。

import org.snmp4j.*;
    import org.snmp4j.smi.*;
    import org.snmp4j.mp.SnmpConstants;
    ...
    TransportMapping transport =
        new DefaultUdpTransportMapping(new UdpAddress("0.0.0.0/161"));
    Snmp snmp = new Snmp(transport);
    if (version == SnmpConstants.version3) {
        byte[] localEngineID =
           ((MPv3)snmp.getMessageProcessingModel(MessageProcessingModel.MPv3)).createLocalEngineID();
        USM usm = new USM(SecurityProtocols.getInstance(),
                      new OctetString(localEngineID), 0);
        SecurityModels.getInstance().addSecurityModel(usm);
        snmp.setLocalEngine(localEngineID, 0, 0);
        // Add the configured user to the USM
        ...
    }
    // 注册命令响应监听器
    snmp.addCommandResponder(this);
    transport.listen();
    ...
    // 实现CommandResponder接口
    public synchronized void processPdu(CommandResponderEvent e) {
        PDU command = e.getPdu();
        if (command != null) {
        ...
       }
    } 
 


总结
    Snmp内含了一个消息分发器,消息分发器中内含了处理网络的线程,在使用完后最好调用close(),将其资源回归处理。
    掌握了上面所说的三个概念,基本上可以使用Snmp4j编写Snmp的程序了。   
    有关Snmp4j编程最好也最详细的资料:API文档和源代码。关于使用Snmp4j编写Snmp程序的例子,多线程的例子可以参看源代码中:org.snmp4j.test包下的MultiThreadedTrapReceiver.java,完整的例子可以参看 org.snmp4j.tools.console包下的SnmpRequest(一个命令行的Snmp管理器)。
    不过,要想快速和深入掌握Snmp编程,最好的办法一定是先弄懂Snmp协议,这方面的资料最权威的就是RFC协议了。

 

分享到:
评论

相关推荐

    VB6实现SNMP通信

    用VB6实现SNMP通信,程序中详细对SNMP数据结构进行了解析

    snmp_Java进行SNMP通信_SNMP协议_snmp配置_常用OID_snmp.jar_snmp4j_.jar

    Java进行SNMP通信的指南SnmpProgrammingGuideViaJava.doc Java实现snmp的get和walk代码示例.doc snmp4j.chm snmp.chm SnmpMain.java snmp配置说明.doc snmp协议详细讲解.doc ToolsetAdministratorGuide.pdf ...

    snmp.rar_RSH.EXE SNMP_SNMP_snmp协议通信

    用snmp协议实现PC与网关的通信,获取网关的cpu使用率和内存使用率的情况。

    基于SNMP实现对服务器中LXD容器的流量监控系统Java源码.zip

    基于SNMP实现对服务器中LXD容器的流量监控系统Java源码.zip基于SNMP实现对服务器中LXD容器的流量监控系统Java源码.zip基于SNMP实现对服务器中LXD容器的流量监控系统Java源码.zip基于SNMP实现对服务器中LXD容器的流量...

    基于SNMP及串口通信的网络监控与报警系统

    提出了利用基于简单网络管理协议的网络管理编程与串口通信相结合,在Windows平台下用VC开发网络监控、自动报警系统,并描述了该系统的实现过程

    SNMP-NMS.zip_NMS SNMP_nms_snmp 管理端_snmp管理端_通信管理

    SNMP通信协议,管理端实现。保证可用!

    基于SNMP的通信网络性能管理模块设计与实现

    ISO定义的网络管理包含五个功能域:配置管理、故障管理、性能管理、安全管理和计费管理,其中性能管理的目标是优化网络性能,提高运行质量。性能管理是测试组成网络各个单元性能的过程,它包括测试网络连接和当前...

    SNMP管理框架及其在思科路由器的实现

    SNMP(Simple Network Management Protocol,简单网络管理协议)是一个应用层协议,提供了SNMP管理者和SNMP代理间报文格式的消息通信。它规定了在网络环境中对设备进行监视 和管理的标准化管理框架,通信的公共语言...

    JAVA基于SNMP网络设备MIB信息采集设计与实现.doc

    这个系统采用三层模型进行设计,最底层负责SNMP中基本对象编码、定义,与设备连接通信等;中间层在底层的基础上定义了MIB对象,负责OID与MIB对象间的转换,分析MIB信息文件以生成MIB树型结构,单个MIB变量信息查询等...

    基于Java与SNMP实现的网络设备MIB信息采集.zip

    最底层负责SNMP中基本对象编码、定义,与设备连接通信等; 中间层在底层的基础上定义了MIB对象,负责OID与MIB对象间的转换,分析MIB信息文件以生成MIB树型结构,单个MIB变量信息查询等功能 顶层,即界面层则在中间层...

    基于SNMP的网络拓扑发现.doc

    基于SNMP的网络拓扑发现 一、 SNMP简介 SNMP(Simple Network Management Protocol,...图3.1说明了SNMP网络管理框架的一般体系结构,它由四个主要部件构成,分别是:通信网络、网络协议、网络管理进程和被管网络实体。

    mibbrowser测试snmp工具

    网络管理员使用SNMP管理系统(Manager),通过发送请求和接收响应的方式,与代理设备进行通信。 MIB Browser是网络管理员在配置和监控网络设备时的有用工具。它可以帮助管理员更方便地获取设备信息和诊断问题,实现...

    snmp4j-1.7.6a.zip_SNMP4J例子_java snmp编程_package_snmp in java _snm

    Java SNMP Package:这是一个实现了SNMP协议的Java包.它提供对基本的SNMP客户端与在SNMP版本1和2中定义的代理操作的支持.这个包提供了一种机制用于取得与设置SNMP对象标识(OID:object identifier)值通过一个简单的...

    基于.NET技术实现的SNMP通信

    NET技术支持下的SNMP-SharpNet开发包提供的接口不断进行实验研究,终从SNMP请求的建立、发送和接受以及SNMP请求的超时和重传都实现了函数封装,同时实现了管理站和管理代理之间的SNMP通信,为监控系统后续功能的开发...

    java_conn_SNMPtrap_send_accept.rar_SNMP_SNMPtrap_snmp java

    java实现SNMP通信协议电子书介绍与入门

    基于.NET技术实现的SNMP通信

    利用.NET技术支持下的SNMPSharpNet开发包提供的接口不断进行实验研究,最终从SNMP请求的建立、发送和接受以及SNMP请求的超时和重传都实现了函数封装,同时实现了管理站和管理代理之间的SNMP通信,为监控系统后续功能...

    SNMP网管系统中MIB编译的实现与应用-文档

    对基于MIB编译的SNMP网管系统进行了系统设计,根据MIB编译器生成的Java目标代码设计了SNMP网管系统中的通信模块,并对PDU处理模块和本地MIB缓存进行的详细的分析和设计,并根据设计实现了SNMP通信模块中的部分功能,...

    基于SNMP 及串口通信的网络监控与报警系统

    提出了利用基于简单网络管理协议的网络管理编程与串口通信相结合,在Windows NT/98/2000 平台下用VC++6.0 开发网络监控、自动报警系统,并描述了该系统的实现过程. 关键词:网络管理系统,SNMP,代理管理,串口通信

    电力通信网络数据采集框架的设计与实现.pdf

    针对国家电网提出的北向接口统一标准,在Acro View网管基础上提出了基于SNMP协议的网管北向接口软件的实现设计方案。针对网管系统私有接口采集的需求和现状,设计了一种基于Apache Ant的数据采集管理系统并通过实验...

    snmp及socket网络测试

    snmp及socket网络测试.网络上的两个程序通过一个双向的通信连接实现数据的交换的socket工具以及管理设备信息的snmp工具

Global site tag (gtag.js) - Google Analytics