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

java利用snmp4j包来读取snmp协议数据,很简单的一个流程,就是利用java来读取运行snmp协议的数据,例如服务器、PC机或者路由器等运行了snmp协议的设备。

snmp协议是什么呢?

简单网络管理协议(SNMP),由一组网络管理的标准组成,包含一个 应用层 协议(application layer protocol)、 数据库模型 (database schema)和一组资源对象。该协议能够支持 网络管理系统 ,用以监测连接到网络上的设备是否有任何引起管理上关注的情况。该协议是互联网工程工作小组(IETF,Internet Engineering Task Force)定义的internet协议簇的一部分。SNMP的目标是管理 互联网 Internet上众多厂家生产的软硬件平台,因此SNMP受Internet标准 网络管理 框架的影响也很大。SNMP已经出到第三个版本的协议,其功能较以前已经大大地加强和改进了。

上面是百度百科上对于snmp的一个定义,其实很简单,就是用来管理网络、查看网络信息的一种协议。

那么如何在本机上开启snmp协议呢?非常简单,可以参考一篇文章: 开启snmp协议 ,其中要注意的地方就是,在开启后,还要到服务里面给snmp协议添加public权限。

package com.test.snmp;
 
import java.io.IOException;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
 
import org.snmp4j.CommunityTarget;
import org.snmp4j.PDU;
import org.snmp4j.Snmp;
import org.snmp4j.TransportMapping;
import org.snmp4j.event.ResponseEvent;
import org.snmp4j.event.ResponseListener;
import org.snmp4j.mp.SnmpConstants;
import org.snmp4j.smi.Address;
import org.snmp4j.smi.GenericAddress;
import org.snmp4j.smi.Integer32;
import org.snmp4j.smi.Null;
import org.snmp4j.smi.OID;
import org.snmp4j.smi.OctetString;
import org.snmp4j.smi.VariableBinding;
import org.snmp4j.transport.DefaultUdpTransportMapping;
 
/**
 * 演示: GET单个OID值
 *
 * blog http://www.micmiu.com
 *
 * @author Michael
 */
public class SnmpData {
 
  public static final int DEFAULT_VERSION = SnmpConstants.version2c;
  public static final String DEFAULT_PROTOCOL = "udp";
  public static final int DEFAULT_PORT = 161;
  public static final long DEFAULT_TIMEOUT = 3 * 1000L;
  public static final int DEFAULT_RETRY = 3;
 
  /**
   * 创建对象communityTarget,用于返回target
   *
   * @param targetAddress
   * @param community
   * @param version
   * @param timeOut
   * @param retry
   * @return CommunityTarget
   */
  public static CommunityTarget createDefault(String ip, String community) {
    Address address = GenericAddress.parse(DEFAULT_PROTOCOL + ":" + ip
        + "/" + DEFAULT_PORT);
    CommunityTarget target = new CommunityTarget();
    target.setCommunity(new OctetString(community));
    target.setAddress(address);
    target.setVersion(DEFAULT_VERSION);
    target.setTimeout(DEFAULT_TIMEOUT); // milliseconds
    target.setRetries(DEFAULT_RETRY);
    return target;
  }
  /*根据OID,获取单条消息*/
  public static void snmpGet(String ip, String community, String oid) {
 
    CommunityTarget target = createDefault(ip, community);
    Snmp snmp = null;
    try {
      PDU pdu = new PDU();
      // pdu.add(new VariableBinding(new OID(new int[]
      // {1,3,6,1,2,1,1,2})));
      pdu.add(new VariableBinding(new OID(oid)));
 
      DefaultUdpTransportMapping transport = new DefaultUdpTransportMapping();
      snmp = new Snmp(transport);
      snmp.listen();
      System.out.println("-------> 发送PDU <-------");
      pdu.setType(PDU.GET);
      ResponseEvent respEvent = snmp.send(pdu, target);
      System.out.println("PeerAddress:" + respEvent.getPeerAddress());
      PDU response = respEvent.getResponse();
 
      if (response == null) {
        System.out.println("response is null, request time out");
      } else {
 
        // Vector vbVect =
        // response.getVariableBindings();
        // System.out.println("vb size:" + vbVect.size());
        // if (vbVect.size() == 0) {
        // System.out.println("response vb size is 0 ");
        // } else {
        // VariableBinding vb = vbVect.firstElement();
        // System.out.println(vb.getOid() + " = " + vb.getVariable());
        // }
 
        System.out.println("response pdu size is " + response.size());
        for (int i = 0; i < response.size(); i++) {
          VariableBinding vb = response.get(i);
          System.out.println(vb.getOid() + " = " + vb.getVariable());
        }
 
      }
      System.out.println("SNMP GET one OID value finished !");
    } catch (Exception e) {
      e.printStackTrace();
      System.out.println("SNMP Get Exception:" + e);
    } finally {
      if (snmp != null) {
        try {
          snmp.close();
        } catch (IOException ex1) {
          snmp = null;
        }
      }
 
    }
  }
  /*根据OID列表,一次获取多条OID数据,并且以List形式返回*/
  public static void snmpGetList(String ip, String community, List oidList)
  {
    CommunityTarget target = createDefault(ip, community);
    Snmp snmp = null;
    try {
      PDU pdu = new PDU();
 
      for(String oid:oidList)
      {
        pdu.add(new VariableBinding(new OID(oid)));
      }
 
      DefaultUdpTransportMapping transport = new DefaultUdpTransportMapping();
      snmp = new Snmp(transport);
      snmp.listen();
      System.out.println("-------> 发送PDU <-------");
      pdu.setType(PDU.GET);
      ResponseEvent respEvent = snmp.send(pdu, target);
      System.out.println("PeerAddress:" + respEvent.getPeerAddress());
      PDU response = respEvent.getResponse();
 
      if (response == null) {
        System.out.println("response is null, request time out");
      } else {
 
        System.out.println("response pdu size is " + response.size());
        for (int i = 0; i < response.size(); i++) {
          VariableBinding vb = response.get(i);
          System.out.println(vb.getOid() + " = " + vb.getVariable());
        }
 
      }
      System.out.println("SNMP GET one OID value finished !");
    } catch (Exception e) {
      e.printStackTrace();
      System.out.println("SNMP Get Exception:" + e);
    } finally {
      if (snmp != null) {
        try {
          snmp.close();
        } catch (IOException ex1) {
          snmp = null;
        }
      }
 
    }
  }
  /*根据OID列表,采用异步方式一次获取多条OID数据,并且以List形式返回*/
  public static void snmpAsynGetList(String ip, String community,List oidList)
  {
    CommunityTarget target = createDefault(ip, community);
    Snmp snmp = null;
    try {
      PDU pdu = new PDU();
 
      for(String oid:oidList)
      {
        pdu.add(new VariableBinding(new OID(oid)));
      }
 
      DefaultUdpTransportMapping transport = new DefaultUdpTransportMapping();
      snmp = new Snmp(transport);
      snmp.listen();
      System.out.println("-------> 发送PDU <-------");
      pdu.setType(PDU.GET);
      ResponseEvent respEvent = snmp.send(pdu, target);
      System.out.println("PeerAddress:" + respEvent.getPeerAddress());
      PDU response = respEvent.getResponse();
 
      /*异步获取*/
      final CountDownLatch latch = new CountDownLatch(1);
      ResponseListener listener = new ResponseListener() {
        public void onResponse(ResponseEvent event) {
          ((Snmp) event.getSource()).cancel(event.getRequest(), this);
          PDU response = event.getResponse();
          PDU request = event.getRequest();
          System.out.println("[request]:" + request);
          if (response == null) {
            System.out.println("[ERROR]: response is null");
          } else if (response.getErrorStatus() != 0) {
            System.out.println("[ERROR]: response status"
                + response.getErrorStatus() + " Text:"
                + response.getErrorStatusText());
          } else {
            System.out.println("Received response Success!");
            for (int i = 0; i < response.size(); i++) {
              VariableBinding vb = response.get(i);
              System.out.println(vb.getOid() + " = "
                  + vb.getVariable());
            }
            System.out.println("SNMP Asyn GetList OID finished. ");
            latch.countDown();
          }
        }
      };
 
      pdu.setType(PDU.GET);
      snmp.send(pdu, target, null, listener);
      System.out.println("asyn send pdu wait for response...");
 
      boolean wait = latch.await(30, TimeUnit.SECONDS);
      System.out.println("latch.await =:" + wait);
 
      snmp.close();
 
      System.out.println("SNMP GET one OID value finished !");
    } catch (Exception e) {
      e.printStackTrace();
      System.out.println("SNMP Get Exception:" + e);
    } finally {
      if (snmp != null) {
        try {
          snmp.close();
        } catch (IOException ex1) {
          snmp = null;
        }
      }
 
    }
  }
  /*根据targetOID,获取树形数据*/
  public static void snmpWalk(String ip, String community, String targetOid)
  {
    CommunityTarget target = createDefault(ip, community);
    TransportMapping transport = null;
    Snmp snmp = null;
    try {
      transport = new DefaultUdpTransportMapping();
      snmp = new Snmp(transport);
      transport.listen();
 
      PDU pdu = new PDU();
      OID targetOID = new OID(targetOid);
      pdu.add(new VariableBinding(targetOID));
 
      boolean finished = false;
      System.out.println("----> demo start <----");
      while (!finished) {
        VariableBinding vb = null;
        ResponseEvent respEvent = snmp.getNext(pdu, target);
 
        PDU response = respEvent.getResponse();
 
        if (null == response) {
          System.out.println("responsePDU == null");
          finished = true;
          break;
        } else {
          vb = response.get(0);
        }
        // check finish
        finished = checkWalkFinished(targetOID, pdu, vb);
        if (!finished) {
          System.out.println("==== walk each vlaue :");
          System.out.println(vb.getOid() + " = " + vb.getVariable());
 
          // Set up the variable binding for the next entry.
          pdu.setRequestID(new Integer32(0));
          pdu.set(0, vb);
        } else {
          System.out.println("SNMP walk OID has finished.");
          snmp.close();
        }
      }
      System.out.println("----> demo end <----");
    } catch (Exception e) {
      e.printStackTrace();
      System.out.println("SNMP walk Exception: " + e);
    } finally {
      if (snmp != null) {
        try {
          snmp.close();
        } catch (IOException ex1) {
          snmp = null;
        }
      }
    }
  }
 
  private static boolean checkWalkFinished(OID targetOID, PDU pdu,
      VariableBinding vb) {
    boolean finished = false;
    if (pdu.getErrorStatus() != 0) {
      System.out.println("[true] responsePDU.getErrorStatus() != 0 ");
      System.out.println(pdu.getErrorStatusText());
      finished = true;
    } else if (vb.getOid() == null) {
      System.out.println("[true] vb.getOid() == null");
      finished = true;
    } else if (vb.getOid().size() < targetOID.size()) {
      System.out.println("[true] vb.getOid().size() < targetOID.size()");
      finished = true;
    } else if (targetOID.leftMostCompare(targetOID.size(), vb.getOid()) != 0) {
      System.out.println("[true] targetOID.leftMostCompare() != 0");
      finished = true;
    } else if (Null.isExceptionSyntax(vb.getVariable().getSyntax())) {
      System.out
          .println("[true] Null.isExceptionSyntax(vb.getVariable().getSyntax())");
      finished = true;
    } else if (vb.getOid().compareTo(targetOID) <= 0) {
      System.out.println("[true] Variable received is not "
          + "lexicographic successor of requested " + "one:");
      System.out.println(vb.toString() + " <= " + targetOID);
      finished = true;
    }
    return finished;
 
  }
  /*根据targetOID,异步获取树形数据*/
  public static void snmpAsynWalk(String ip, String community, String oid)
  {
    final CommunityTarget target = createDefault(ip, community);
    Snmp snmp = null;
    try {
      System.out.println("----> demo start <----");
 
      DefaultUdpTransportMapping transport = new DefaultUdpTransportMapping();
      snmp = new Snmp(transport);
      snmp.listen();
 
      final PDU pdu = new PDU();
      final OID targetOID = new OID(oid);
      final CountDownLatch latch = new CountDownLatch(1);
      pdu.add(new VariableBinding(targetOID));
 
      ResponseListener listener = new ResponseListener() {
        public void onResponse(ResponseEvent event) {
          ((Snmp) event.getSource()).cancel(event.getRequest(), this);
 
          try {
            PDU response = event.getResponse();
            // PDU request = event.getRequest();
            // System.out.println("[request]:" + request);
            if (response == null) {
              System.out.println("[ERROR]: response is null");
            } else if (response.getErrorStatus() != 0) {
              System.out.println("[ERROR]: response status"
                  + response.getErrorStatus() + " Text:"
                  + response.getErrorStatusText());
            } else {
              System.out
                  .println("Received Walk response value :");
              VariableBinding vb = response.get(0);
 
              boolean finished = checkWalkFinished(targetOID,
                  pdu, vb);
              if (!finished) {
                System.out.println(vb.getOid() + " = "
                    + vb.getVariable());
                pdu.setRequestID(new Integer32(0));
                pdu.set(0, vb);
                ((Snmp) event.getSource()).getNext(pdu, target,
                    null, this);
              } else {
                System.out
                    .println("SNMP Asyn walk OID value success !");
                latch.countDown();
              }
            }
          } catch (Exception e) {
            e.printStackTrace();
            latch.countDown();
          }
 
        }
      };
 
      snmp.getNext(pdu, target, null, listener);
      System.out.println("pdu 已发送,等到异步处理结果...");
 
      boolean wait = latch.await(30, TimeUnit.SECONDS);
      System.out.println("latch.await =:" + wait);
      snmp.close();
 
      System.out.println("----> demo end <----");
    } catch (Exception e) {
      e.printStackTrace();
      System.out.println("SNMP Asyn Walk Exception:" + e);
    }
  }
  /*根据OID和指定string来设置设备的数据*/
  public static void setPDU(String ip,String community,String oid,String val) throws IOException
  {
    CommunityTarget target = createDefault(ip, community);
    Snmp snmp = null;
    PDU pdu = new PDU();
    pdu.add(new VariableBinding(new OID(oid),new OctetString(val)));
    pdu.setType(PDU.SET);
 
    DefaultUdpTransportMapping transport = new DefaultUdpTransportMapping();
    snmp = new Snmp(transport);
    snmp.listen();
    System.out.println("-------> 发送PDU <-------");
    snmp.send(pdu, target);
    snmp.close();
  }
}
测试类:
/**
*
*/
package mySNMP;
import java.util.ArrayList;
import java.util.List;
import org.junit.Test;
import org.snmp4j.log.ConsoleLogFactory;
import org.snmp4j.log.LogAdapter;
import org.snmp4j.log.LogFactory;
import com.test.snmp.SnmpData;
/**
* @filename SnmpGet.java
* @author code by jianghuiwen
* @mail [email protected]
*
* 下午2:21:53
*/
public class TestSnmpGet {
@Test
public void testGet()
{
String ip = "127.0.0.1";
String community = "public";
String oidval = "1.3.6.1.2.1.1.6.0";
SnmpData.snmpGet(ip, community, oidval);
}
public void testGetList()
{
String ip = "127.0.0.1";
String community = "public";
List oidList=new ArrayList();
oidList.add("1.3.6.1.2.1.1.5.0");
oidList.add("1.3.6.1.2.1.1.7.0");
SnmpData.snmpGetList(ip, community, oidList);
}
public void testGetAsyList()
{
String ip = "127.0.0.1";
String community = "public";
List oidList=new ArrayList();
oidList.add("1.3.6.1.2.1");
oidList.add("1.3.6.1.2.12");
SnmpData.snmpAsynGetList(ip, community, oidList);
System.out.println("i am first!");
}
public void testWalk()
{
String ip = "127.0.0.1";
String community = "public";
String targetOid = "1.3.6.1.2.1.1.5.0";
SnmpData.snmpWalk(ip, community, targetOid);
}
public void testAsyWalk()
{
String ip = "127.0.0.1";
String community = "public";
// 异步采集数据
SnmpData.snmpAsynWalk(ip, community, "1.3.6.1.2.1.25.4.2.1.2");
}
@Test
public void testSetPDU() throws Exception
{
String ip = "127.0.0.1";
String community = "public";
SnmpData.setPDU(ip, community, "1.3.6.1.2.1.1.6.0","jianghuiwen");
}
public void testVersion()
{
//System.out.println(org.snmp4j.version.VersionInfo.getVersion());
}
}

注意,工程采用的是maven工程,并且测试类用的是junit4测试方法,包用的是snmp4j.jar,下载地址是:http://www.snmp4j.org

关键词:snmp snmp4j

   文章来自IT部落格,http://www.itbuluoge.com

你可能感兴趣的:(Java)