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
學習就是學習別人的思惟,學習別人遇到問題的處理方法。
------------思路之重