snmp snmp4j的使用

 

snmp4j的使用java

一.什麼是snmp及snmp4j?node

snmp是 Simple Network Management Protocol (簡單網絡管理協議)的簡寫。api

SNMP4J是一個用Java來實現SNMP(簡單網絡管理協議)協議的開源項目.它支持以命令行的形式進行管理與響應。SNMP4J是純面向對象設計與SNMP++(用C++實現SNMPv1/v2c/v3)相相似。網絡

參考百度百科:app

http://baike.baidu.com/link?url=fzj8rJp06yZBxx4MRVTYu5Iiub45QmK3WVzVC30tDtXFQmMJZkfEA9yfcP2E1HJz4bSYh9oNCc5zQVr7gmceP_異步

 

二.步驟:函數

管理端步驟:工具

1.設定傳輸協議
2.snmp初始化
3.構造發送報文
4.構造發送目標
5.構造響應監聽(異步)
6.發送學習

監控端步驟:this

1.設定傳輸協議
2.snmp初始化
3.構造發送報文
4.構造發送目標
5.發送並返回響應
6.處理返回結果

 

三.snmp經常使用的類:

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.Address;
import org.snmp4j.smi.GenericAddress;
import org.snmp4j.smi.OID;
import org.snmp4j.smi.OctetString;
import org.snmp4j.smi.VariableBinding;
import org.snmp4j.transport.DefaultUdpTransportMapping;

別看這麼多包就嚇怕了,遇事不驚纔是站到最後的人,下面咱們一塊兒來研究他們的用法,按照如上步驟:

我就以管理端的方式講解:

工具的重要性不說你們都懂的,能事半功倍的效果:建議你們先下載snmp4j api文檔。而後跟着我一塊兒研究:

首先咱們把一個大問題劃分紅幾個小問題,個個擊破,因而一個大問題就解決了:(參考下面的demo熟悉snmp協議及snmp4j)

1.設定傳輸協議:

TransportMapping接口:此該接口表明了SNMP4J所使用的傳輸層協議。這也是SNMP4J一大特點的地方。按照RFC的規定,SNMP是隻使用UDP做爲傳輸層協議的。而SNMP4J支持管理端和代理端使用UDP或者TCP進行傳輸。該接口有兩個子接口。(查看api文檔)

在Package org.snmp4j.transport這個包下有一個類設定了傳輸方式爲udp:這個類就是DefaultUdpTransportMapping,使用時只需實例化它便可。

2.初始化snmp:

snmp:這個類主要用來收發數據,它主要有一個send方法,這個很重要,有不少重載。查看文檔。

3.構造報文(PDU):

PDU:就是要通訊的數據。

4.構造目標:

CommunityTarget:要發送通訊數據要去的目標。

5.監聽:

ResponseListener:負責監聽並回調對應的函數處理。

ResponseListener listener = new ResponseListener() {
   public void onResponse(ResponseEvent event) {
    ((Snmp) event.getSource()).cancel(event.getRequest(), this);
    PDU request = event.getRequest();
    PDU response = event.getResponse();
    if (response != null) {
     System.out.println("request.size()=" + request.size());
     System.out.println("response.size()=" + response.size());
    }
   }
  };

6.發送:

發送:就是指將pdu(數據)發送到target(目標)機器,監聽返回的數據並做響應。

snmp.send(pdu, target, null, listener);

 

snmp、pdu及target之間的關係能夠用一句話歸納:

Target就是你遠方的戀人,PDU就是大家之間傳遞的情書、而Snmp就是負責幫你寄信收信的郵差。

 

四.demo:(以廣播的方式)

1.管理端:

  1 package com.main;
  2 
  3 import java.io.IOException;
  4 
  5 import org.snmp4j.CommunityTarget;
  6 import org.snmp4j.PDU;
  7 import org.snmp4j.Snmp;
  8 import org.snmp4j.TransportMapping;
  9 import org.snmp4j.event.ResponseEvent;
 10 import org.snmp4j.event.ResponseListener;
 11 import org.snmp4j.mp.SnmpConstants;
 12 import org.snmp4j.smi.Address;
 13 import org.snmp4j.smi.GenericAddress;
 14 import org.snmp4j.smi.OID;
 15 import org.snmp4j.smi.OctetString;
 16 import org.snmp4j.smi.VariableBinding;
 17 import org.snmp4j.transport.DefaultUdpTransportMapping;
 18 
 19  
 20 /**
 21  *以廣播的方式發送snmp並獲取設備的信息
 22  *
 23  * @author PC
 24  * 
 25  */
 26 public class Manager {
 27 
 28     /**
 29      * @param args
 30      */
 31     public static void main(String[] args) {
 32         // TODO Auto-generated method stub
 33         
 34         System.out.println("管理端啓動。。。");
 35         
 36         send();
 37         
 38         System.out.println("success");
 39     }
 40 
 41     // 發送數據到目標機器
 42     public static void send() {
 43 
 44         TransportMapping transport = null;
 45         
 46         try {
 47             // 傳輸協議爲UDP
 48             transport = new DefaultUdpTransportMapping();
 49         } catch (IOException e) {
 50             // TODO Auto-generated catch block
 51             e.printStackTrace();
 52         }
 53         // 建立snmp對象,發送報文
 54         Snmp snmp = new Snmp(transport);
 55 
 56         try {
 57             snmp.listen();
 58         } catch (IOException e1) {
 59             // TODO Auto-generated catch block
 60             e1.printStackTrace();
 61         }
 62 
 63         OID oid = new OID("1.3.6.1.2.2.1.0");
 64         // 報文
 65         PDU pdu = new PDU();
 66         VariableBinding variableBinding = new VariableBinding(oid);
 67         pdu.add(variableBinding);
 68         pdu.setType(PDU.GET);
 69 
 70         // 目標
 71         CommunityTarget target = new CommunityTarget();
 72 
 73         // 設置snmp共同體
 74         OctetString oct = new OctetString("public");
 75         target.setCommunity(oct);
 76 
 77         // 向255.255.255.255發送UPD數據包即爲UDP廣播,接收端只需綁定UDP廣播的端口號便可獲得數據
 78         Address address = GenericAddress.parse("udp:192.168.0.254/161");
 79         target.setAddress(address);
 80         target.setRetries(2);
 81         target.setTimeout(5000);
 82         target.setVersion(SnmpConstants.version1);
 83 
 84         // 設置監聽對象
 85         ResponseListener listener = new ResponseListener() {
 86             public void onResponse(ResponseEvent event) {
 87                 ((Snmp) event.getSource()).cancel(event.getRequest(), this);
 88                 PDU request = event.getRequest();
 89                 PDU response = event.getResponse();
 90                 if (response != null) {
 91                     System.out.println("request.size()=" + request.size());
 92                     System.out.println("response.size()=" + response.size());
 93                 }
 94             }
 95         };
 96 
 97         try {
 98             snmp.send(pdu, target, null, listener);
 99         } catch (IOException e) {
100             // TODO Auto-generated catch block
101             e.printStackTrace();
102         }
103     }
104 
105 }

 

2.監控端:(獲取本地信息)

  1 package com.main;
  2 
  3 import java.io.IOException;
  4 
  5 import org.snmp4j.CommunityTarget;
  6 import org.snmp4j.PDU;
  7 import org.snmp4j.Snmp;
  8 import org.snmp4j.TransportMapping;
  9 import org.snmp4j.event.ResponseEvent;
 10 import org.snmp4j.mp.SnmpConstants;
 11 import org.snmp4j.smi.Address;
 12 import org.snmp4j.smi.GenericAddress;
 13 import org.snmp4j.smi.OID;
 14 import org.snmp4j.smi.OctetString;
 15 import org.snmp4j.smi.VariableBinding;
 16 import org.snmp4j.transport.DefaultUdpTransportMapping;
 17 
 18 public class Monitor {
 19  
 20     // systemDescr
 21         static final String OID1 = "1.3.6.1.2.1.1.1.0";
 22         // eth0
 23         static final String OID2 = "1.3.6.1.2.1.2.2.1.2.2";
 24         // MAC
 25         static final String OID3 = "1.3.6.1.2.1.2.2.1.6.2";
 26         
 27         static final String OID4 = "1.3.6.1.2.1.1.1";
 28         
 29         //static final int [] OID5 = {1,3,6,1,2,1,1,2}; 與第一個同樣
 30         
 31     /**
 32      * @param args
 33      */
 34     public static void main(String[] args) {
 35         // TODO Auto-generated method stub
 36         GetOID();
 37     }
 38 
 39     /**
 40      * 得到本機oid
 41      */
 42     public static void GetOID() {
 43 
 44         TransportMapping transport = null;
 45 
 46         try {
 47             // 傳輸協議udp
 48             transport = new DefaultUdpTransportMapping();
 49             transport.listen();
 50         } catch (IOException e1) {
 51             // TODO Auto-generated catch block
 52             e1.printStackTrace();
 53         }
 54 
 55         // 構造報文
 56         PDU request = new PDU();        
 57         request.add(new VariableBinding(new OID(OID1)));  
 58         request.add(new VariableBinding(new OID(OID2)));
 59         request.add(new VariableBinding(new OID(OID3)));
 60         
 61         request.add(new VariableBinding(new OID(OID4)));  
 62         //request.add(new VariableBinding(new OID(OID5)));
 63 
 64         request.setType(PDU.GETNEXT);
 65 
 66         // snmp初始化
 67         Snmp snmp = new Snmp(transport);
 68 
 69         // 構造目標
 70         CommunityTarget target = new CommunityTarget();
 71         Address localAddress =GenericAddress.parse("udp:localhost/161");
 72         target.setAddress(localAddress);
 73         OctetString oct = new OctetString("public");
 74         target.setCommunity(oct);
 75         target.setVersion(SnmpConstants.version2c);
 76         target.setRetries(2);
 77         target.setTimeout(5 * 60);
 78 
 79         try {
 80             // 發送報文
 81             ResponseEvent responseEvent = snmp.send(request, target);
 82         
 83                 PDU response = responseEvent.getResponse();
 84                 if (response != null) {
 85                 System.out.println("request.size()=" + request.size());
 86                 System.out.println("response.size()=" + response.size());
 87                 VariableBinding vb1 = response.get(0);
 88                 VariableBinding vb2 = response.get(1);
 89                 VariableBinding vb3 = response.get(2);
 90                 VariableBinding vb4 = response.get(3);
 91                 //VariableBinding vb5 = response.get(4);
 92                 System.out.println(vb1);
 93                 System.out.println(vb2);
 94                 System.out.println(vb3);
 95                 System.out.println(vb4);
 96                 //System.out.println(vb5);
 97                 
 98                 //釋放
 99                 transport.close();
100             }
101         } catch (IOException e) {
102             // TODO Auto-generated catch block
103             e.printStackTrace();
104         }
105     }
106 }

 五.MIB:

經常使用OID:

系統參數(1.3.6.1.2.1.1)
OID 描述 備註 請求方式
.1.3.6.1.2.1.1.1.0 獲取系統基本信息 SysDesc GET
.1.3.6.1.2.1.1.3.0 監控時間 sysUptime GET
.1.3.6.1.2.1.1.4.0 系統聯繫人 sysContact GET
.1.3.6.1.2.1.1.5.0 獲取機器名 SysName GET
.1.3.6.1.2.1.1.6.0 機器坐在位置 SysLocation GET
.1.3.6.1.2.1.1.7.0 機器提供的服務 SysService GET
.1.3.6.1.2.1.25.4.2.1.2 系統運行的進程列表 hrSWRunName WALK
.1.3.6.1.2.1.25.6.3.1.2 系統安裝的軟件列表 hrSWInstalledName WALK

 

網絡接口(1.3.6.1.2.1.2)
OID 描述 備註 請求方式
.1.3.6.1.2.1.2.1.0 網絡接口的數目 IfNumber GET
.1.3.6.1.2.1.2.2.1.2 網絡接口信息描述 IfDescr WALK
.1.3.6.1.2.1.2.2.1.3 網絡接口類型 IfType WALK
.1.3.6.1.2.1.2.2.1.4 接口發送和接收的最大IP數據報[BYTE] IfMTU WALK
.1.3.6.1.2.1.2.2.1.5 接口當前帶寬[bps] IfSpeed WALK
.1.3.6.1.2.1.2.2.1.6 接口的物理地址 IfPhysAddress WALK
.1.3.6.1.2.1.2.2.1.8 接口當前操做狀態[up|down] IfOperStatus WALK
.1.3.6.1.2.1.2.2.1.10 接口收到的字節數 IfInOctet WALK
.1.3.6.1.2.1.2.2.1.16 接口發送的字節數 IfOutOctet WALK
.1.3.6.1.2.1.2.2.1.11 接口收到的數據包個數 IfInUcastPkts WALK
.1.3.6.1.2.1.2.2.1.17 接口發送的數據包個數 IfOutUcastPkts WALK

 

CPU及負載
OID 描述 備註 請求方式
. 1.3.6.1.4.1.2021.11.9.0 用戶CPU百分比 ssCpuUser GET
. 1.3.6.1.4.1.2021.11.10.0 系統CPU百分比 ssCpuSystem GET
. 1.3.6.1.4.1.2021.11.11.0 空閒CPU百分比 ssCpuIdle GET
. 1.3.6.1.4.1.2021.11.50.0 原始用戶CPU使用時間 ssCpuRawUser GET
.1.3.6.1.4.1.2021.11.51.0 原始nice佔用時間 ssCpuRawNice GET
. 1.3.6.1.4.1.2021.11.52.0 原始系統CPU使用時間 ssCpuRawSystem. GET
. 1.3.6.1.4.1.2021.11.53.0 原始CPU空閒時間 ssCpuRawIdle GET
. 1.3.6.1.2.1.25.3.3.1.2 CPU的當前負載,N個核就有N個負載 hrProcessorLoad WALK
. 1.3.6.1.4.1.2021.11.3.0 ssSwapIn GET
. 1.3.6.1.4.1.2021.11.4.0 SsSwapOut GET
. 1.3.6.1.4.1.2021.11.5.0 ssIOSent GET
. 1.3.6.1.4.1.2021.11.6.0 ssIOReceive GET
. 1.3.6.1.4.1.2021.11.7.0 ssSysInterrupts GET
. 1.3.6.1.4.1.2021.11.8.0 ssSysContext GET
. 1.3.6.1.4.1.2021.11.54.0 ssCpuRawWait GET
. 1.3.6.1.4.1.2021.11.56.0 ssCpuRawInterrupt GET
. 1.3.6.1.4.1.2021.11.57.0 ssIORawSent GET
. 1.3.6.1.4.1.2021.11.58.0 ssIORawReceived GET
. 1.3.6.1.4.1.2021.11.59.0 ssRawInterrupts GET
. 1.3.6.1.4.1.2021.11.60.0 ssRawContexts GET
. 1.3.6.1.4.1.2021.11.61.0 ssCpuRawSoftIRQ GET
. 1.3.6.1.4.1.2021.11.62.0 ssRawSwapIn. GET
. 1.3.6.1.4.1.2021.11.63.0 ssRawSwapOut GET
.1.3.6.1.4.1.2021.10.1.3.1 Load5 GET
.1.3.6.1.4.1.2021.10.1.3.2 Load10 GET
.1.3.6.1.4.1.2021.10.1.3.3 Load15 GET

 

內存及磁盤(1.3.6.1.2.1.25)
OID 描述 備註 請求方式
.1.3.6.1.2.1.25.2.2.0 獲取內存大小 hrMemorySize GET
.1.3.6.1.2.1.25.2.3.1.1 存儲設備編號 hrStorageIndex WALK
.1.3.6.1.2.1.25.2.3.1.2 存儲設備類型 hrStorageType[OID] WALK
.1.3.6.1.2.1.25.2.3.1.3 存儲設備描述 hrStorageDescr WALK
.1.3.6.1.2.1.25.2.3.1.4 簇的大小 hrStorageAllocationUnits WALK
.1.3.6.1.2.1.25.2.3.1.5 簇的的數目 hrStorageSize WALK
.1.3.6.1.2.1.25.2.3.1.6 使用多少,跟總容量相除就是佔用率 hrStorageUsed WALK
.1.3.6.1.4.1.2021.4.3.0 Total Swap Size(虛擬內存) memTotalSwap GET
.1.3.6.1.4.1.2021.4.4.0 Available Swap Space memAvailSwap GET
.1.3.6.1.4.1.2021.4.5.0 Total RAM in machine memTotalReal GET
.1.3.6.1.4.1.2021.4.6.0 Total RAM used memAvailReal GET
.1.3.6.1.4.1.2021.4.11.0 Total RAM Free memTotalFree GET
.1.3.6.1.4.1.2021.4.13.0 Total RAM Shared memShared GET
.1.3.6.1.4.1.2021.4.14.0 Total RAM Buffered memBuffer GET
.1.3.6.1.4.1.2021.4.15.0 Total Cached Memory memCached GET
.1.3.6.1.4.1.2021.9.1.2 Path where the disk is mounted dskPath WALK
.1.3.6.1.4.1.2021.9.1.3 Path of the device for the partition dskDevice WALK
.1.3.6.1.4.1.2021.9.1.6 Total size of the disk/partion (kBytes) dskTotal WALK
.1.3.6.1.4.1.2021.9.1.7 Available space on the disk dskAvail WALK
.1.3.6.1.4.1.2021.9.1.8 Used space on the disk dskUsed WALK
.1.3.6.1.4.1.2021.9.1.9 Percentage of space used on disk dskPercent WALK
.1.3.6.1.4.1.2021.9.1.10 Percentage of inodes used on disk dskPercentNode WALK

                                                                                                                              

其餘的mib

參考:http://www.iana.org/assignments/enterprise-numbers/enterprise-numbers

                                                                                                                           學習就是學習別人的思惟,學習別人遇到問題的處理方法。 

                                                                                                                                                                    ------------思路之重

相關文章
相關標籤/搜索