snmp 协议开发之SNMP4J-SNMPv1/v2

转载 2015年07月09日 14:13:56
使用SNMP4J可以很方便的实现一个SNMP NMS的功能。
对于SNMPv1/SNMPv2,简单的说,只需要以下几个步骤
1) 创建Snmp对象snmp

2) 创建CommunityTarget对象target,并指定community, version, address, timeout, retry等参数。

3) 创建PDU对象pdu,并指定操作类型(GET/GETNEXT/GETBULK/SET), 添加VariableBinding(也就是待操作的OID),
    如果是GETBULK操作,还可以指定MaxRepetitions和NonRepeaters。
 注意一定要指定MaxRepetitions,默认值是0,那样不会返回任何结果。

4) 调用snmp.send(pdu, target)方法,发送请求请返回结果。

此外,SNMP4J提供了TableUtils类,可以很轻松的实现一个SNMP Walk的功能,比如一次返回一个表格下面的所有MIB值。
TableUtils类还支持指定ower bound index 和 upper bound index, 得到更小范围的结果以提高性能。这一点对于从一个很多行的表中取一部分行的数据来说很重要。

Snmp还支持异步的send方法。

下面的代码实例实现了GET, GETNEXT, GETBULK, Walk, SET操作,
以及一个利用异步send方法实现的agent discovery: 对一个广播地址发送请求,等待agent返回的应答。

如果需要对一个范围内的IP进行扫描,可以稍加改进,反复调用异步send多次发送给不同IP。

package com.snmp.demo;

import org.snmp4j.CommunityTarget;
import org.snmp4j.PDU;
import org.snmp4j.Snmp;
import org.snmp4j.event.ResponseEvent;
import org.snmp4j.event.ResponseListener;
import org.snmp4j.mp.SnmpConstants;
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;
import org.snmp4j.util.DefaultPDUFactory;
import org.snmp4j.util.TableEvent;
import org.snmp4j.util.TableUtils;

import java.io.IOException;
import java.util.List;
import java.util.Vector;

/**
 * Created by vixuan-008 on 2015/7/9.
 */
public class SNMPv1 {
    public static void main(String[] args) throws Exception {
        Snmp snmp = new Snmp(new DefaultUdpTransportMapping());
        snmp.listen();

        CommunityTarget target = new CommunityTarget();
        target.setCommunity(new OctetString("public"));
        target.setVersion(SnmpConstants.version2c);
        target.setAddress(new UdpAddress("127.0.0.1/161"));
        target.setTimeout(3000);    //3s
        target.setRetries(1);

        sendRequest(snmp, createGetPdu(), target);
        sendRequest(snmp, createGetNextPdu(), target);
        sendRequest(snmp, createGetBulkPdu(), target);
        snmpWalk(snmp, target);()

        target.setCommunity(new OctetString("public"));
        sendRequest(snmp, createSetPdu(), target);

        CommunityTarget broadcastTarget = new CommunityTarget();
        broadcastTarget.setCommunity(new OctetString("public"));
        broadcastTarget.setVersion(SnmpConstants.version2c);
        broadcastTarget.setAddress(new UdpAddress("192.168.0.204/161"));
        broadcastTarget.setTimeout(5000);   //5s
        sendAsyncRequest(snmp, createGetNextPdu(), broadcastTarget);
        Thread.sleep(6000); //main thread wait 6s for the completion of asynchronous request
    }
    private static PDU createGetPdu() {
        PDU pdu = new PDU();
        pdu.setType(PDU.GET);
        pdu.add(new VariableBinding(new OID("1.3.6.1.2.1.1.3"))); //sysUpTime
        pdu.add(new VariableBinding(new OID("1.3.6.1.2.1.1.5.0"))); //sysName
        pdu.add(new VariableBinding(new OID("1.3.6.1.2.1.1.5")));   //expect an no_such_instance error
        return pdu;
    }

    private static PDU createGetNextPdu() {
        PDU pdu = new PDU();
        pdu.setType(PDU.GETNEXT);
        pdu.add(new VariableBinding(new OID("1.3.6.1.2.1.1.3")));   //sysUpTime
        pdu.add(new VariableBinding(new OID("1.3.6.1.2.1.1.5")));   //sysName

        return pdu;
    }

    private static PDU createGetBulkPdu() {
        PDU pdu = new PDU();
        pdu.setType(PDU.GETBULK);
        pdu.setMaxRepetitions(10);  //must set it, default is 0 .1.3.6.1.2.1.1.1.0
        pdu.setNonRepeaters(0);
        pdu.add(new VariableBinding(new OID("1.3.6.1.2.1.1")));     //system
        return pdu;
    }

    private static PDU createSetPdu() {
        PDU pdu = new PDU();
        pdu.setType(PDU.SET);
        pdu.add(new VariableBinding(new OID("1.3.6.1.2.1.1.5.0"), new OctetString("sysname"))); //sysName
        return pdu;
    }

    private static void sendRequest(Snmp snmp, PDU pdu, CommunityTarget target)
            throws IOException {
        ResponseEvent responseEvent = snmp.send(pdu, target);
        PDU response = responseEvent.getResponse();

        if (response == null) {
            System.out.println("TimeOut...");
        } else {
            if (response.getErrorStatus() == PDU.noError) {
                Vector<? extends VariableBinding> vbs = response.getVariableBindings();
                for (VariableBinding vb : vbs) {
                    System.out.println(vb + " ," + vb.getVariable().getSyntaxString());
                }
            } else {
                System.out.println("Error:" + response.getErrorStatusText());
            }
        }
    }

    private static void sendAsyncRequest(Snmp snmp, PDU pdu, CommunityTarget target)
            throws IOException {
        snmp.send(pdu, target, null, new ResponseListener(){

            @Override
            public void onResponse(ResponseEvent event) {
                PDU response = event.getResponse();
                System.out.println("Got response from " + event.getPeerAddress());
                if (response == null) {
                    System.out.println("TimeOut...");
                } else {
                    if (response.getErrorStatus() == PDU.noError) {
                        Vector<? extends VariableBinding> vbs = response.getVariableBindings();
                        for (VariableBinding vb : vbs) {
                            System.out.println(vb + " ," + vb.getVariable().getSyntaxString());
                        }
                    } else {
                        System.out.println("Error:" + response.getErrorStatusText());
                    }
                }
            }});
    }

    private static void snmpWalk(Snmp snmp, CommunityTarget target) {
        TableUtils utils = new TableUtils(snmp, new DefaultPDUFactory(PDU.GETNEXT));//GETNEXT or GETBULK
        utils.setMaxNumRowsPerPDU(5);   //only for GETBULK, set max-repetitions, default is 10
        OID[] columnOids = new OID[] {
                new OID("1.3.6.1.2.1.1.9.1.2"), //sysORID
                new OID("1.3.6.1.2.1.1.9.1.3"), //sysORDescr
                new OID("1.3.6.1.2.1.1.9.1.5")  //wrong OID, expect an null in in VariableBinding array
        };
        // If not null, all returned rows have an index in a range (lowerBoundIndex, upperBoundIndex]
        List<TableEvent> l = utils.getTable(target, columnOids, new OID("3"), new OID("10"));
        for (TableEvent e : l) {
            System.out.println(e);
        }
    }
}


SNMP协议以及著名的MIB详解

SNMP协议介绍    简单网络管理协议(SNMP:Simple Network Management Protocol)是由互联网工程任务组(IETF:Internet Engineering T...
  • xuguokun1986
  • xuguokun1986
  • 2016年03月25日 11:21
  • 757

SNMP协议

 SNMP(Simple Network Management Protocol,简单网络管理协议)的前身是简单网关监控协议(SGMP),用来对通信线路进行管理。随后,人们对SGMP进行了很大的...
  • renminzdb
  • renminzdb
  • 2015年01月23日 15:16
  • 658

snmp 协议开发之SNMP4J-SNMPv1/v2

使用SNMP4J可以很方便的实现一个SNMP NMS的功能。 对于SNMPv1/SNMPv2,简单的说,只需要以下几个步骤 1) 创建Snmp对象snmp 2) 创建CommunityTar...
  • zhouzhiwengang
  • zhouzhiwengang
  • 2015年07月09日 14:13
  • 1117

网络协议篇之SNMP协议(三)—— 不同版本(SNMPv1、v2c、v3)报文区别

转自:http://blog.csdn.net/shmily_cml0603/article/details/13287899  http://blog.csdn.net/shmily_cml0603...
  • zqixiao_09
  • zqixiao_09
  • 2017年08月12日 20:27
  • 3221

SNMP v1 v2 v3

转自:http://blog.csdn.net/shangzhiliang_2008/article/details/5624428 --------------------------------...
  • u012398362
  • u012398362
  • 2015年09月29日 14:41
  • 761

snmp协议访问服务器得到CPU,内存等

package com.zoe.hip.component.monitor.utils.snmp; import java.io.IOException; import java.text.Deci...
  • whiteForever
  • whiteForever
  • 2015年08月27日 13:13
  • 2614

snmp监控 jvm

snmp监控 jvm 我只用过TOMCAT,以此记录 一、原理:JAVA在设计之初已实现通过SNMP协议来提供查询JAVA运行程序情况,经过对被监控的主机一番配置后,JAVA会启动一个UDP协议监听的...
  • nerissa
  • nerissa
  • 2014年03月19日 16:58
  • 1190

SNMP协议标准RFC文档

贴一下SNMP的协议标准相关文档,方便初学者下载。 关于下载地址:http://tools.ietf.org/rfc/index  这是RFC的一个索引页面,下面涉及到的RFC文档都在这个页面中有下载...
  • shanzhizi
  • shanzhizi
  • 2013年09月06日 06:23
  • 4550

snmp 协议开发之SNMP4J 简单封装

源代码项目结构: snmp.comm包:主要展示OID 和对应的实体对象 snmp_conf.properties配置文件 # ROOT OID # Internet Part ...
  • zhouzhiwengang
  • zhouzhiwengang
  • 2015年07月09日 14:20
  • 1179

关于SNMP的MIB文件的语法简述

MIB file的开始和结束 所有的MIB file的都以DEFINITIONS ::= BEGIN关键字开始,以END结束。我们所有添加的节点均应在此之间。 XXX-TEST-MIB DEFIN...
  • shanzhizi
  • shanzhizi
  • 2013年11月11日 16:57
  • 19758
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:snmp 协议开发之SNMP4J-SNMPv1/v2
举报原因:
原因补充:

(最多只允许输入30个字)