文档章节

SNMP4J简介

开源中国首席带头大哥
 开源中国首席带头大哥
发布于 2016/12/07 18:27
字数 2173
阅读 71
收藏 0

SNMP4J简介

一、SNMP简介

SNMP指的是简单网络管理协议。它属于TCP/IP五层协议中的应用层协议。它提供了一种简单和方便的模式来管理网络中的各个元素。这里的元素就是各个被管理的对象,可以是因特网中的某个硬件,比如网卡,也可以是某些硬件和软件的配置参数的集合。由于SNMP协议简单可靠 ,受到了众多厂商的欢迎,成为了目前最为广泛的网管协议。

SNMP协议主要由两大部分构成:SNMP管理站和SNMP代理。SNMP管理站是一个中心节点,负责收集维护各个SNMP元素的信息,并对这些信息进行处理,最后反馈给网络管理员;而SNMP代理是运行在各个被管理的网络节点之上,负责统计该节点的各项信息,并且负责与SNMP管理站交互,接收并执行管理站的命令,上传各种本地的网络信息。

SNMP管理站和SNMP代理之间是松散耦合。他们之间的通信是通过UDP协议完成的。一般情况下,SNMP管理站通过UDP协议向SNMP代理发送各种命令,当SNMP代理收到命令后,返回SNMP管理站需要的参数。但是当SNMP代理检测到网络元素异常的时候,也可以主动向SNMP管理站发送消息,通告当前异常状况。

SNMP协议于1988年发布。到目前一共经历了V1,V2,V3三个版本。其中V1已经被废弃,而V2c虽然没有能够成为正式标准,,但是已经被很多厂家所接受,V3目前是因特网的正式标准。与V1相比,V2,V3更能适应大规模的网络管理,而且在安全方面有了较大的改进。

二SNMP4J详细介绍

2.1 重要的类和接口

Snmp类:该类是SNMP4J中最为核心的类。负责SNMP报文的接受和发送。

PDU类和ScopedPDU类:该类是SNMP报文单元的抽象,其中PDU类适用于SNMPv1和SNMPv2c。ScopedPDU类继承于PDU类,适用于SNMPv3。

Target接口和UserTarget类:对应于SNMP代理的地址信息,包括IP地址和端口号(161)。其中Target接口适用于SNMPv1和SNMPv2c。UserTarget类实现了Target接口,适用于SNMPv3。

TransportMapping接口:该接口代表了SNMP4J所使用的传输层协议。这也是SNMP4J一大特色的地方。按照RFC的规定,SNMP是只使用UDP作为传输层协议的。而SNMP4J支持管理端和代理端使用UDP或者TCP进行传输。该接口有两个子接口。

2.2 两种消息发送模式

SNMP4J支持两种消息发送模式:同步发送模式和异步发送模式。

其中同步发送模式也称阻塞模式。当管理端发送出一条消息之后,线程会被阻塞,直到收到对方的回应或者时间超时。同步发送模式编程较为简单,但是不适用于发送广播消息。

异步发送模式也称非阻塞模式。当程序发送一条消息之后,线程将会继续执行,当收到消息的回应的时候,程序会对消息作出相应的处理。要实现异步发送模式,需要实例化一个实现了ResponseListener接口的类的对象。ResponseListener接口中有一个名为onResponse的函数。这是一个回调函数,当程序收到响应的时候,会自动调用该函数。由该函数完成对响应的处理。

2.3 实现管理端的总体步骤

该部分说明了利用SNMP4J编写SNMP管理端的大致过程,读者在阅读之后会对SNMP4J有一个宏观上的认识。在附录部分,作者给出了一个用SNMP4J开发管理站的样例程序,如果有进一步的需要,请参考附录部分。

2.3.1 初始化

l  明确SNMP在传输层所使用的协议

一般情况下,我们都使用使用UDP协议作为SNMP的传输层协议,所以我们需要实例化的是一个DefaultUdpTransportMapping接口对象;

l  实例化一个snmp对象

在此过程中,我们需要将1中实例化的DefaultUdpTransportMapping接口的对象作为参数,穿snmp类的构造函数中。

另外,如果实现的SNMPv3协议,我们还需要设置安全机制,添加安全用户等等;

l  监听snmp消息

在此,我们可以调用刚刚实例化的DefaultUdpTransportMapping的接口对象的listen方法,让程序监听snmp消息;

2.3.2 构造发送目标

如果实现的是SNMPv3程序,则需要实例化一个UserTarget对象,如果实现的是SNMPv2c或者说SNMPv1,则需要实例化一个CommunityTarget对象。

之后,我们还需要对实例化的对象做一些设置。如果是CommunityTarget的对象,则需要设置版本,重传时间和等待时延。如果是UserTarget对象,我们不仅需要设置版本、重传时间、等待时延,还需要设置安全级别和安全名称。

2.3.3 构造发送报文

如果发送的是SNMPv3的报文,我们则需要实例化一个ScopedPDU       类的对象,否则我们需要实例化一个PDU类的对象。之后,我们还需要生成一个OID对象,其中包含了我们所需要获取的SNMP对象在MIB库中的ID。然后我们需要将OID和之前生成的PDU对象或者是ScopedPDU对象绑定,并且设置PDU的报文类型(五种SNMP报文类型之一)。

2.3.4 构造响应监听对象(异步模式)

当使用异步模式的时候,我们需要实例化一个实现了ResponseListener

的对象,作为响应消息的监听对象。在构造该对象的过程中,我们需要重写ResponseListener的OnResponse函数,该函数是一个回调函数,用来处理程序收到响应后的一些操作。

2.3.5 发送消息

当所有上述操作都设置完毕之后,就可以发送消息了。同步模式和异步模式发送消息调用的函数名字均为send,但是两个函数所需参数不一样。同步模式的参数仅为4.3.2和4.3.3中构造的目标对象和报文对象,而异步模式还需要4.3.4中构造的监听对象。

同步模式发送消息后便等待响应的到达,到达之后会返回一个ResponseEvent对象,该对象中包含了响应的相应信息。

异步模式发送消息之后便会继续执行,当收到响应消息时便会调用监听对象的OnResponse函数。该函数中的语句便是我们对响应的处理

三、例程

import java.io.IOException;

import org.snmp4j.*;
import org.snmp4j.event.ResponseEvent;
import org.snmp4j.event.ResponseListener;
import org.snmp4j.mp.MPv3;
import org.snmp4j.mp.SnmpConstants;
import org.snmp4j.security.*;
import org.snmp4j.smi.Address;
import org.snmp4j.smi.GenericAddress;
import org.snmp4j.smi.OID;
import org.snmp4j.smi.OctetString;
import org.snmp4j.smi.UdpAddress;
import org.snmp4j.smi.VariableBinding;
import org.snmp4j.transport.DefaultUdpTransportMapping;

public class snmp_manager {
 private Snmp snmp = null;
 private String version=null;
 /**
  * 
  * @param version
  */
 public snmp_manager(String version) {
  try {
   this.version=version;
   TransportMapping transport = new DefaultUdpTransportMapping();
   snmp = new Snmp(transport);
   if(version.equals("3"))
   {
    //设置安全模式
    USM usm = new USM(SecurityProtocols.getInstance(), new OctetString(
      MPv3.createLocalEngineID()), 0);
    SecurityModels.getInstance().addSecurityModel(usm);
   }
   //开始监听消息
   transport.listen();
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 }
/**
 * 
 * @param syn  是否是同步模式
 * @param bro   是否是广播
 * @param pdu    要发送的报文
 * @param addr    目标地址
 * @throws IOException
 */
 public void sendMessage(Boolean syn, final Boolean bro, PDU pdu,
   String addr) throws IOException {
  //生成目标地址对象
  Address targetAddress = GenericAddress.parse(addr);
  Target target=null;
  if(version.equals("3"))
  {
   //添加用户
  snmp.getUSM().addUser(
    new OctetString("MD5DES"),
    new UsmUser(new OctetString("MD5DES"), AuthMD5.ID,
      new OctetString("MD5DESUserAuthPassword"), PrivDES.ID,
      new OctetString("MD5DESUserPrivPassword")));
  
  target = new UserTarget();
  //设置安全级别
  ((UserTarget)target).setSecurityLevel(SecurityLevel.AUTH_PRIV);
  ((UserTarget)target).setSecurityName(new OctetString("MD5DES"));
  target.setVersion(SnmpConstants.version3);
  }else{
   target=new CommunityTarget();
   if(version.equals("1"))
   {
    target.setVersion(SnmpConstants.version1);
    ((CommunityTarget) target).setCommunity(new OctetString("public"));
   }else{
    target.setVersion(SnmpConstants.version2c);
    ((CommunityTarget) target).setCommunity(new OctetString("public"));
   }
      
  }
  // 目标对象相关设置
  target.setAddress(targetAddress);
  target.setRetries(5);
  target.setTimeout(1000);
 
  
  if (syn.equals(true)) {
   //发送报文  并且接受响应
   ResponseEvent response = snmp.send(pdu, target);
   //处理响应
   System.out.println("Synchronize message from "
     + response.getPeerAddress() + "/nrequest:"
     + response.getRequest() + "/nresponse:"
     + response.getResponse());
  } else {
   //设置监听对象
   ResponseListener listener = new ResponseListener() {

    @Override
    public void onResponse(ResponseEvent event) {
     // TODO Auto-generated method stub
     if (bro.equals(false)) {
      ((Snmp) event.getSource()).cancel(event.getRequest(),
        this);
     }
     //处理响应
     PDU request = event.getRequest();
     PDU response = event.getResponse();
     System.out.println("Asynchronise message from "
       + event.getPeerAddress() + "/nrequest:" + request
       + "/nresponse:" + response);
    }

   };
   //发送报文
   snmp.send(pdu, target, null, listener);
  }
 }

 public static void main(String[] args) {
  snmp_manager manager = new snmp_manager("2c");
  //构造报文
  PDU pdu = new PDU();
//  PDU pdu = new ScopedPDU();
  //设置要获取的对象ID
  OID oids=new OID("1.3.6.1.2.1.1.1.0");
  pdu.add(new VariableBinding(oids));
  //设置报文类型
  pdu.setType(PDU.GETNEXT);
 //   ((ScopedPDU) pdu).setContextName(new OctetString("priv"));  
  try {
  //发送消息   其中最后一个是想要发送的目标地址
   manager.sendMessage(false, true, pdu, "udp:192.168.1.255/161");
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 }
}

 

本文转载自:http://blog.csdn.net/bingxue_xuebing/article/details/46269505

共有 人打赏支持
开源中国首席带头大哥
粉丝 13
博文 136
码字总数 88446
作品 0
南京
程序员
私信 提问
maven 配置问题,

请帮忙看看以下命令和配置。 安装本地jar报错 E:\snmp4j-2.3.3\dist>mvn install:install-file -DgroupId=org.snmp4j -DartifactId= snmp4j -Dversion=2.3.3 -Dpackaging=jar -Dfile=snmp4j-......

戢冠生
2015/04/14
459
2
基于snmp4j取得linux系统的cpu、ram信息

ps:希望做过snmp的大拿能过来解答一下。 菜鸟通过 cat /proc/meminfo 得到linux系统的内存信息: 大家可以看到MemTotal: 2071272KB MemFree:97972KB 下面菜鸟同snmp4j得到的内存信息: 1.3....

上山打伞
2013/07/17
4.6K
8
SNMP4J实时获取CPU信息的时间间隔

@xu_zhike1979 你好,想跟你请教个问题:请问SNMP4J实时获取CPU等信息的时间间隔如何设置?是根据它上次获取的时长长短来决定的吗?小弟就是上次问你的那个问题,做了一个用SNMP4J获取CPU等信...

東刀人
2012/12/21
2K
9
snmp获取Unix操作系统信息

用MIB Browser能获取到相关信息,但是在程序里用snmp4J就获取不到,怎么回事啊?

boyTise
2014/03/10
555
0
snmp4j二次开发

@xuzhou2013 你好,想跟你请教个问题:我现在要开发个基于snmp的网络监控系统,看了许多基本知识,和snmp4j的相关例子后还有点晕,请你那边有什么好的资料或者案例,能借用下么?非常感谢了!...

amoxChen
2015/11/06
241
0

没有更多内容

加载失败,请刷新页面

加载更多

RestClientUtil和ConfigRestClientUtil区别说明

RestClientUtil directly executes the DSL defined in the code. ConfigRestClientUtil gets the DSL defined in the configuration file by the DSL name and executes it. RestClientUtil......

bboss
今天
11
0

中国龙-扬科
昨天
2
0
Linux系统设置全局的默认网络代理

更改全局配置文件/etc/profile all_proxy="all_proxy=socks://rahowviahva.ml:80/"ftp_proxy="ftp_proxy=http://rahowviahva.ml:80/"http_proxy="http_proxy=http://rahowviahva.ml:80/"......

临江仙卜算子
昨天
9
0
java框架学习日志-6(bean作用域和自动装配)

本章补充bean的作用域和自动装配 bean作用域 之前提到可以用scope来设置单例模式 <bean id="type" class="cn.dota2.tpye.Type" scope="singleton"></bean> 除此之外还有几种用法 singleton:......

白话
昨天
8
0
在PC上测试移动端网站和模拟手机浏览器的5大方法

总结很全面,保存下来以备不时之需。原文地址:https://www.cnblogs.com/coolfeng/p/4708942.html

kitty1116
昨天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部