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操作


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM