zoukankan      html  css  js  c++  java
  • java调用snmp4j (snmp协议版本: v1,v2c)

    目录:

    1、java通过snmp4j实现 set、get、getNext,getBulk

    2、java调用snmp4j获取snmp表格所有元素

    1、java调用snmp4j实现 set、get、getNext,getBulk

    package com.harara.test;
    
    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.OID;
    import org.snmp4j.smi.OctetString;
    import org.snmp4j.smi.UdpAddress;
    import org.snmp4j.smi.VariableBinding;
    import org.snmp4j.transport.DefaultUdpTransportMapping;
    
    import java.io.IOException;
    import java.util.Vector;
    /**
     * snmp版本为v2c和v1的调用方式一样,这里以v2c为例
     * @author : harara
     * @version : 2.0
     * @date : 2020/6/28 17:22
     */
    public class SNMPv2Test {
        private static CommunityTarget target = null;
    
        public static void main(String[] args) {
            try {
                //Set
                testSnmpSet();
                //Get
                testSnmpGet();
                //getNext
                testSnmpGetNext();
                //getBulk
                testSnmpGetBulk();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        /**
         * 测试set报文
         */
        public static void testSnmpSet() throws Exception {
            //1、初始化snmp
            SNMPv2Test snmPv2Test = new SNMPv2Test();
            Snmp snmp = snmPv2Test.initSnmp();
            //2.创建CommunityTarget
            CommunityTarget communityTarget = snmPv2Test.getTarget();
            //3.设置udp
            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("test")));
            //4.发送请求,解析响应内容
            snmPv2Test.sendSnmpRequest(snmp, pdu, communityTarget);
        }
    
        /**
         * 测试get报文
         */
        public static void testSnmpGet() throws Exception{
            //1、初始化snmp
            SNMPv2Test snmPv2Test = new SNMPv2Test();
            Snmp snmp = snmPv2Test.initSnmp();
            //2.创建CommunityTarget
            CommunityTarget communityTarget = snmPv2Test.getTarget();
            //3.设置udp
            PDU pdu = new PDU();
            pdu.setType(PDU.GET);
            pdu.add(new VariableBinding(new OID("1.3.6.1.2.1.1.5.0")));
            //4.发送请求,解析响应内容
            snmPv2Test.sendSnmpRequest(snmp,pdu,communityTarget);
        }
    
        /**
         * 测试getBulk
         */
        public static void testSnmpGetBulk() throws Exception{
            //1、初始化snmp
            SNMPv2Test snmPv2Test = new SNMPv2Test();
            Snmp snmp = snmPv2Test.initSnmp();
            //2.创建CommunityTarget
            CommunityTarget communityTarget = snmPv2Test.getTarget();
    
            //3.设置udp
            PDU pdu = new PDU();
            pdu.setType(PDU.GETBULK);
            //non-repeaters字段指出只返回一个后继变量的变量数。max-repetitions字段指出其他的变量应返回的最大的后继变量数
            pdu.setMaxRepetitions(7);    //must set it, default is 0
            pdu.setNonRepeaters(0);
            pdu.add(new VariableBinding(new OID("1.3.6.1.2.1.1.5.0")));
    
            //4.发送请求,解析响应内容
            snmPv2Test.sendSnmpRequest(snmp, pdu, communityTarget);
        }
    
    
    
    
        /**
         * 测试getNext报文
         */
        public static void testSnmpGetNext() throws Exception{
            //1、初始化snmp
            SNMPv2Test snmPv2Test = new SNMPv2Test();
            Snmp snmp = snmPv2Test.initSnmp();
            //2.创建CommunityTarget
            CommunityTarget communityTarget = snmPv2Test.getTarget();
    
            //3.设置udp
            PDU pdu = new PDU();
            pdu.setType(PDU.GETNEXT);
            pdu.add(new VariableBinding(new OID("1.3.6.1.2.1.1.5.0")));
            //4.发送请求,解析响应内容
            snmPv2Test.sendSnmpRequest(snmp, pdu, communityTarget);
        }
    
    
        /**
         * 发送snmp请求并解析响应内容
         * @param snmp
         * @param pdu
         * @param target
         * @throws Exception
         */
        public void sendSnmpRequest(Snmp snmp, PDU pdu, CommunityTarget target) throws Exception{
            //1.发送请求
            ResponseEvent responseEvent = snmp.send(pdu, target);
    
            //2.解析响应内容
            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());
                }
            }
        }
    
        /**
         * 初始化snmp
         * @return
         */
        public Snmp initSnmp(){
            TransportMapping transport = null;
            try {
                transport = new DefaultUdpTransportMapping();
                Snmp snmp = new Snmp(transport);
                snmp.listen();
                //transport.listen();
                return snmp;
            } catch (IOException e) {
                e.printStackTrace();
                return null;
            }
        }
    
        /**
         * 创建/获取CommunityTarget
         * @return
         */
        public  CommunityTarget getTarget(){
            if(target == null){
                synchronized (this) {
                    if(target == null){
                        //创建CommunityTarget
                        target = new CommunityTarget();
                        //团体名字
                        target.setCommunity(new OctetString("public"));
                        //snmp服务的地址
                        target.setAddress(new UdpAddress("192.169.1.66/161"));
                        //失败重试次数
                        target.setRetries(1);
                        //超时时间 单位毫秒
                        target.setTimeout(3000);
                        //snmp通信协议版本 v1,v2c调用方式一样,这里以v2为例
                        target.setVersion(SnmpConstants.version2c);
                    }
                }
            }
            return target;
    
        }
    
    }

    2、java调用snmp4j获取snmp表格所有元素

    package com.chenly.test;
    
    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.*;
    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;
    
    /**
     * @author : harara
     * @version : 2.0
     * @date : 2020/9/3 15:41
     */
    public class SNMPTableTest {
        private static CommunityTarget target = null;
    
        public static void main(String[] args) {
            testTableUtils();
            testTableByGetNext();
        }
    
    
        /**
         * 使用TableUtils方式获取表格的所有元素
         */
        public static void testTableUtils(){
            SNMPTableTest snmpTableTest = new SNMPTableTest();
            Snmp snmp = snmpTableTest.initSnmp();
            CommunityTarget communityTarget = snmpTableTest.getTarget();
    
            //GETNEXT or GETBULK
            TableUtils utils = new TableUtils(snmp, new DefaultPDUFactory(PDU.GETBULK));
            //only for GETBULK, set max-repetitions, default is 10
            utils.setMaxNumRowsPerPDU(2);
            OID[] columnOids = new OID[] {
                    new OID("1.3.6.1.2.1.4.20")
            };
            // If not null, all returned rows have an index in a range (lowerBoundIndex, upperBoundIndex]
            //第3个参数是最小列oid索引,第四个参数是最大列oid索引
            List<TableEvent> list = utils.getTable(communityTarget, columnOids, new OID("1"), new OID("10"));
            if(list == null || list.size() <= 0){
                System.out.println("list为空");
                return;
            }
            System.out.println("list size : "+ list.size());
            for (TableEvent event : list) {
                System.out.println(event);
            }
        }
    
        /**
         * 通过getNext遍历获取表格所有元素
         * @return
         */
        public static  void testTableByGetNext()  {
            SNMPTableTest snmpTableTest = new SNMPTableTest();
            Snmp snmp = null;
            CommunityTarget communityTarget = null;
            PDU pdu = null;
            OID targetOID = new OID("1.3.6.1.2.1.4.20");
            try{
                snmp = snmpTableTest.initSnmp();
                communityTarget = snmpTableTest.getTarget();
                pdu = new PDU();
                pdu.add(new VariableBinding(targetOID));
                boolean finished = false;
                //walk操作
                while (!finished) {
                    VariableBinding vb = null;
                    // 向Agent发送PDU实施getNext操作,并接收Response
                    ResponseEvent respEvent = snmp.getNext(pdu, target);
                    // 解析Response数据
                    PDU response = respEvent.getResponse();
                    if (null == response) {
                        finished = true;
                        break;
                    }
                    vb = response.get(0);
                    // 检查是否结束
                    finished = checkWalkFinished(targetOID, pdu, vb);
                    if (!finished) {
                        System.out.println(vb.getOid() + "="+  vb.getVariable() +" ," + vb.getVariable().getSyntaxString());
                        // 将variable binding设置到下一个
                        pdu.setRequestID(new Integer32(0));
                        pdu.set(0, vb);
    
                    }
                }
            }catch(Exception e){
                e.printStackTrace();
            }finally{
                if(snmp !=null){
                    try {
                        snmp.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    
    
        /**
         * 检查walk是否结束
         * @param targetOID
         * @param pdu
         * @param vb
         * @return
         */
        private static boolean checkWalkFinished(OID targetOID, PDU pdu, VariableBinding vb) {
            boolean finished = false;
            if (pdu.getErrorStatus() != 0) {
                finished = true;
            } else if (vb.getOid() == null) {
                finished = true;
            } else if (vb.getOid().size() < targetOID.size()) {
                finished = true;
            } else if (targetOID.leftMostCompare(targetOID.size(), vb.getOid()) != 0) {
                finished = true;
            } else if (Null.isExceptionSyntax(vb.getVariable().getSyntax())) {
                finished = true;
            } else if (vb.getOid().compareTo(targetOID) <= 0) {
                finished = true;
            }
            return finished;
        }
    
        /**
         * 初始化snmp
         * @return
         */
        public Snmp initSnmp(){
            TransportMapping transport = null;
            try {
                transport = new DefaultUdpTransportMapping();
                Snmp snmp = new Snmp(transport);
                snmp.listen();
                //transport.listen();
                return snmp;
            } catch (IOException e) {
                e.printStackTrace();
                return null;
            }
        }
    
        /**
         * 创建/获取CommunityTarget
         * @return
         */
        public  CommunityTarget getTarget(){
            if(target == null){
                synchronized (this) {
                    if(target == null){
                        //创建CommunityTarget
                        target = new CommunityTarget();
                        //团体名字
                        target.setCommunity(new OctetString("public"));
                        //snmp服务的地址
                        target.setAddress(new UdpAddress("192.169.1.66/161"));
                        //失败重试次数
                        target.setRetries(1);
                        //超时时间 单位毫秒
                        target.setTimeout(3000);
                        //snmp通信协议版本 v1,v2c调用方式一样,这里以v2为例
                        target.setVersion(SnmpConstants.version2c);
                    }
                }
            }
            return target;
    
        }
    
    }

    参考地址:

    snmp4j编程之四 实现tableView操作

  • 相关阅读:
    网络CCNA基础了解
    KVM 安装 VMware 虚拟机
    [转载]JS浏览器兼容性问题
    java中数组是不是对象?
    [转载]request.getServletPath()方法
    weblogic下更改jsp不生效的解决办法
    java之args[0]
    docker小demo
    eclipse优化
    [转载]oracle建表语句大全
  • 原文地址:https://www.cnblogs.com/kiko2014551511/p/13608807.html
Copyright © 2011-2022 走看看