SNMP4J重要的類和接口介紹_第1頁
SNMP4J重要的類和接口介紹_第2頁
SNMP4J重要的類和接口介紹_第3頁
SNMP4J重要的類和接口介紹_第4頁
SNMP4J重要的類和接口介紹_第5頁
已閱讀5頁,還剩5頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、一、SNMP4J介紹SNMP4J是一個(gè)用Java來實(shí)現(xiàn)SNMP(簡單網(wǎng)絡(luò)管理協(xié)議)協(xié)議的開源項(xiàng)目.它支持以命令行的形式進(jìn)行管理與響應(yīng)。SNMP4J是純面向?qū)ο笤O(shè)計(jì)與SNMP+(用C+實(shí)現(xiàn)SNMPv1/v2c/v3)相類似。SNMP4J API 提供以下下特性:支持MD5和SHA驗(yàn)證,DES,3DES,AES128、AES192和AES256加密的SNMPv3。支持MPv1,MPv2C和MPv3,帶執(zhí)行的可阻塞的信息處理模塊。全部PDU格式。可阻塞的傳輸拓?fù)?。支持UPD、TCP、TLS ??勺枞某瑫r(shí)模塊。同步和異步請(qǐng)求。命令發(fā)生器以及命令應(yīng)答器的支持?;贏pache license的開源免費(fèi)

2、。JAVA 1.4.1或更高版本(2.0或更高版本需要jdk1.6及以上的支持)?;贚OG4J記錄日志。使用GETBULK實(shí)現(xiàn)Row-based的有效的異步表格獲取。支持多線程。二、SNMP4J重要的類和接口介紹2.1、Snmp類Snmp類:該類是SNMP4J中最為核心的類。負(fù)責(zé)SNMP報(bào)文的接受和發(fā)送。它提供了發(fā)送和接收PDU的方法,所有的PDU類型都可以采用同步或者異步的方式被發(fā)送2.2、PDU類和ScopedPDU類該類是SNMP報(bào)文單元的抽象,其中PDU類適用于SNMPv1和SNMPv2c。ScopedPDU類繼承于PDU類,適用于SNMPv3。2.3、Target接口和Commun

3、ityTarget類以及UserTarget類對(duì)應(yīng)于SNMP代理的地址信息,包括IP地址和端口號(hào)(161)。其中Target接口適用于SNMPv1和SNMPv2c。CommunityTarget類實(shí)現(xiàn)了Target接口,用于SNMPv1和SNMPv2c這兩個(gè)版本,UserTarget類實(shí)現(xiàn)了Target接口,適用于SNMPv3。2.4、TransportMapping接口該接口代表了SNMP4J所使用的傳輸層協(xié)議。這也是SNMP4J一大特色的地方。按照RFC的規(guī)定,SNMP是只使用UDP作為傳輸層協(xié)議的。而SNMP4J支持管理端和代理端使用UDP或者TCP進(jìn)行傳輸。該接口有兩個(gè)子接口。2.5、

4、Snmp、Target、PDU三者的關(guān)系Target代表遠(yuǎn)程設(shè)備或者遠(yuǎn)程實(shí)體、PDU代表管理端同Target通信的數(shù)據(jù),Snmp就代表管理者管理功能(其實(shí)就是數(shù)據(jù)的收發(fā))的具體執(zhí)行者。打個(gè)比方:Target就是你遠(yuǎn)方的戀人,PDU就是你們之間傳遞的情書、而Snmp就是負(fù)責(zé)幫你寄信收信的郵差。三、SNMP4J的兩種消息發(fā)送模式SNMP4J支持兩種消息發(fā)送模式:同步發(fā)送模式和異步發(fā)送模式。同步發(fā)送模式也稱阻塞模式。當(dāng)管理端發(fā)送出一條消息之后,線程會(huì)被阻塞,直到收到對(duì)方的回應(yīng)或者時(shí)間超時(shí)。同步發(fā)送模式編程較為簡單,但是不適用于發(fā)送廣播消息。異步發(fā)送模式也稱非阻塞模式。當(dāng)程序發(fā)送一條消息之后,線程將會(huì)

5、繼續(xù)執(zhí)行,當(dāng)收到消息的回應(yīng)的時(shí)候,程序會(huì)對(duì)消息作出相應(yīng)的處理。要實(shí)現(xiàn)異步發(fā)送模式,需要實(shí)例化一個(gè)實(shí)現(xiàn)了ResponseListener接口的類的對(duì)象。ResponseListener接口中有一個(gè)名為onResponse的函數(shù)。這是一個(gè)回調(diào)函數(shù),當(dāng)程序收到響應(yīng)的時(shí)候,會(huì)自動(dòng)調(diào)用該函數(shù)。由該函數(shù)完成對(duì)響應(yīng)的處理。四、使用SNMP4J實(shí)現(xiàn)管理端的步驟該部分說明了利用SNMP4J編寫SNMP管理端的大致過程,讀者在閱讀之后會(huì)對(duì)SNMP4J有一個(gè)宏觀上的認(rèn)識(shí)。在附錄部分,作者給出了一個(gè)用SNMP4J開發(fā)管理站的樣例程序,如果有進(jìn)一步的需要,請(qǐng)參考附錄部分。4.1 、初始化、明確SNMP在傳輸層所使用的協(xié)

6、議一般情況下,我們都使用使用UDP協(xié)議作為SNMP的傳輸層協(xié)議,所以我們需要實(shí)例化的是一個(gè)DefaultUdpTransportMapping接口對(duì)象;、實(shí)例化一個(gè)snmp對(duì)象在此過程中,我們需要將1中實(shí)例化的DefaultUdpTransportMapping接口的對(duì)象作為參數(shù),穿snmp類的構(gòu)造函數(shù)中。另外,如果實(shí)現(xiàn)的SNMPv3協(xié)議,我們還需要設(shè)置安全機(jī)制,添加安全用戶等等;、監(jiān)聽snmp消息在此,我們可以調(diào)用剛剛實(shí)例化的DefaultUdpTransportMapping的接口對(duì)象的listen方法,讓程序監(jiān)聽snmp消息;4.2、 構(gòu)造發(fā)送目標(biāo)如果實(shí)現(xiàn)的是SNMPv2c或者說SNMP

7、v1,需要實(shí)例化一個(gè)CommunityTarget對(duì)象。如果實(shí)現(xiàn)的是SNMPv3程序,則需要實(shí)例化一個(gè)UserTarget對(duì)象。之后,我們還需要對(duì)實(shí)例化的對(duì)象做一些設(shè)置。如果是CommunityTarget的對(duì)象,則需要設(shè)置使用的Snmp版本,重傳時(shí)間和等待時(shí)延。如果是UserTarget對(duì)象,我們不僅需要設(shè)置版本、重傳時(shí)間、等待時(shí)延,還需要設(shè)置安全級(jí)別和安全名稱。4.3、 構(gòu)造發(fā)送報(bào)文如果發(fā)送的是SNMPv2c或者說SNMPv1的報(bào)文,我們需要實(shí)例化一個(gè)PDU類的對(duì)象。如果發(fā)送的是SNMPv3的報(bào)文,我們則需要實(shí)例化一個(gè)ScopedPDU類的對(duì)象。之后,我們還需要生成一個(gè)OID對(duì)象,其中包含

8、了我們所需要獲取的SNMP對(duì)象在MIB庫中的ID。然后我們需要將OID和之前生成的PDU對(duì)象或者是ScopedPDU對(duì)象綁定,并且設(shè)置PDU的報(bào)文類型(五種SNMP報(bào)文類型之一)。4.4、 構(gòu)造響應(yīng)監(jiān)聽對(duì)象(異步模式)當(dāng)使用異步模式的時(shí)候,我們需要實(shí)例化一個(gè)實(shí)現(xiàn)了ResponseListener接口的對(duì)象,作為響應(yīng)消息的監(jiān)聽對(duì)象。在構(gòu)造該對(duì)象的過程中,我們需要重寫ResponseListener的OnResponse函數(shù),該函數(shù)是一個(gè)回調(diào)函數(shù),用來處理程序收到響應(yīng)后的一些操作。4.5、 發(fā)送消息當(dāng)所有上述操作都設(shè)置完畢之后,就可以發(fā)送消息了。同步模式和異步模式發(fā)送消息調(diào)用的函數(shù)名字均為send

9、,但是兩個(gè)函數(shù)所需參數(shù)不一樣。同步模式的參數(shù)僅為4.2和4.3中構(gòu)造的目標(biāo)對(duì)象和報(bào)文對(duì)象,而異步模式還需要4.4中構(gòu)造的監(jiān)聽對(duì)象。同步模式發(fā)送消息后便等待響應(yīng)的到達(dá),到達(dá)之后會(huì)返回一個(gè)ResponseEvent對(duì)象,該對(duì)象中包含了響應(yīng)的相應(yīng)信息。異步模式發(fā)送消息之后便會(huì)繼續(xù)執(zhí)行,當(dāng)收到響應(yīng)消息時(shí)便會(huì)調(diào)用監(jiān)聽對(duì)象的OnResponse函數(shù)。該函數(shù)中的語句便是我們對(duì)響應(yīng)的處理五、使用SNMP4J實(shí)現(xiàn)管理端的編程實(shí)現(xiàn)、設(shè)定遠(yuǎn)程實(shí)體snmp4j中,用CommunityTarget對(duì)象來表示遠(yuǎn)程實(shí)體(要進(jìn)行snmp消息通信的遠(yuǎn)程主機(jī),使用snmp的v2版本)、指定遠(yuǎn)程實(shí)體的地址snmp4j中使用Addr

10、ess接口對(duì)象來表示,Address對(duì)象需要通過實(shí)現(xiàn)該接口的類的對(duì)象向上轉(zhuǎn)型來實(shí)例化、通過CommunityTarget以及其父接口中提供的setXX方法來設(shè)定遠(yuǎn)程實(shí)體的屬性,如設(shè)定遠(yuǎn)程實(shí)體的snmp共同體屬性、遠(yuǎn)程實(shí)體的地址、超時(shí)時(shí)間、重傳次數(shù)、snmp版本等、設(shè)定使用的傳輸協(xié)議snmp4j中,用TransportMapping接口的對(duì)象來表示傳輸協(xié)議(tcp/udp)、調(diào)用TransportMapping中的listen()方法,啟動(dòng)監(jiān)聽進(jìn)程,接收消息,由于該監(jiān)聽進(jìn)程是守護(hù)進(jìn)程,最后應(yīng)調(diào)用close()方法來釋放該進(jìn)程、創(chuàng)建SNMP對(duì)象,用于發(fā)送請(qǐng)求PDU a、創(chuàng)建請(qǐng)求pdu,即創(chuàng)建PDU

11、類的對(duì)象,調(diào)用PDU類中的add()方法綁定要查詢的OID,調(diào)用PDU中的setType()方法來確定該pdu的類型(與snmp中五種操作想對(duì)應(yīng)) b、通過PDU的構(gòu)造方法 public SNMP(TransportMapping transportingMapping),或者其他構(gòu)造方法來生成pdu,之后調(diào)用 ResopnseEvent send(PDU pdu,Target target)發(fā)送pdu,該方法返回一個(gè)ResponseEvent對(duì)象、通過ResponseEvent對(duì)象來獲得SNMP請(qǐng)求的應(yīng)答pdu,方法:public PDU getResponse()、通過應(yīng)答pdu獲得mib

12、信息(之前綁定的OID的值),方法:VaribleBinding get(int index)5.1、獲取遠(yuǎn)程計(jì)算機(jī)的名稱復(fù)制代碼 1 package me.gacl.snmp; 2 3 import java.io.IOException; 4 import org.snmp4j.CommunityTarget; 5 import org.snmp4j.PDU; 6 import org.snmp4j.ScopedPDU; 7 import org.snmp4j.Snmp; 8 import org.snmp4j.Target; 9 import org.snmp4j.TransportMa

13、pping; 10 import org.snmp4j.UserTarget; 11 import org.snmp4j.event.ResponseEvent; 12 import org.snmp4j.event.ResponseListener; 13 import org.snmp4j.mp.MPv3; 14 import org.snmp4j.mp.SnmpConstants; 15 import org.snmp4j.security.AuthMD5; 16 import org.snmp4j.security.PrivDES; 17 import org.snmp4j.secur

14、ity.SecurityLevel; 18 import org.snmp4j.security.SecurityModels; 19 import org.snmp4j.security.SecurityProtocols; 20 import org.snmp4j.security.USM; 21 import org.snmp4j.security.UsmUser; 22 import org.snmp4j.smi.Address; 23 import org.snmp4j.smi.GenericAddress; 24 import org.snmp4j.smi.OID; 25 impo

15、rt org.snmp4j.smi.OctetString; 26 import org.snmp4j.smi.VariableBinding; 27 import org.snmp4j.transport.DefaultUdpTransportMapping; 28 29 public class Snmp4jFirstDemo 30 31 private Snmp snmp = null; 32 private int version ; 33 34 public Snmp4jFirstDemo(int version) 35 try 36 this.version = version;

16、37 TransportMapping transport = new DefaultUdpTransportMapping(); 38 snmp = new Snmp(transport); 39 if (version = SnmpConstants.version3) 40 / 設(shè)置安全模式 41 USM usm = new USM(SecurityProtocols.getInstance(),new OctetString(MPv3.createLocalEngineID(), 0); 42 SecurityModels.getInstance().addSecurityModel(

17、usm); 43 44 / 開始監(jiān)聽消息 45 transport.listen(); 46 catch (IOException e) 47 e.printStackTrace(); 48 49 50 51 public void sendMessage(Boolean syn, final Boolean bro, PDU pdu, String addr) 52 throws IOException 53 / 生成目標(biāo)地址對(duì)象 54 Address targetAddress = GenericAddress.parse(addr); 55 Target target = null; 5

18、6 if (version = SnmpConstants.version3) 57 / 添加用戶 58 snmp.getUSM().addUser(new OctetString("MD5DES"),new UsmUser(new OctetString("MD5DES"), AuthMD5.ID,new OctetString("MD5DESUserAuthPassword"),PrivDES.ID, new OctetString("MD5DESUserPrivPassword"); 59 target =

19、new UserTarget(); 60 / 設(shè)置安全級(jí)別 61 (UserTarget) target).setSecurityLevel(SecurityLevel.AUTH_PRIV); 62 (UserTarget) target).setSecurityName(new OctetString("MD5DES"); 63 target.setVersion(SnmpConstants.version3); 64 65 target = new Community Target(); 66 if (version = SnmpConstants.version1)

20、67 target.setVersion(SnmpConstants.version1); 68 (CommunityTarget) target).setCommunity(new OctetString("public"); 69 else 70 target.setVersion(SnmpConstants.version2c); 71 (CommunityTarget) target).setCommunity(new OctetString("public"); 72 73 74 75 / 目標(biāo)對(duì)象相關(guān)設(shè)置 76 target.setAddre

21、ss(targetAddress); 77 target.setRetries(5); 78 target.setTimeout(1000); 79 80 if (!syn) 81 / 發(fā)送報(bào)文 并且接受響應(yīng) 82 ResponseEvent response = snmp.send(pdu, target); 83 / 處理響應(yīng) 84 System.out.println("Synchronize(同步) message(消息) from(來自) " 85 + response.getPeerAddress() + "rn"+"request

22、(發(fā)送的請(qǐng)求):" 86 + response.getRequest() + "rn"+"response(返回的響應(yīng)):" 87 + response.getResponse(); 88 /* 89 * 輸出結(jié)果: 90 * Synchronize(同步) message(消息) from(來自) 33/161 91 request(發(fā)送的請(qǐng)求):GETrequestID=632977521, errorStatus=Success(0), errorIndex=0, VBS..0 = Nul

23、l 92 response(返回的響應(yīng)):RESPONSErequestID=632977521, errorStatus=Success(0), errorIndex=0, VBS..0 = WIN-667H6TS3U37 93 94 */ 95 else 96 / 設(shè)置監(jiān)聽對(duì)象 97 ResponseListener listener = new ResponseListener() 98 99 public void onResponse(ResponseEvent event) 100 if (bro.equals(false) 101 (Snmp) eve

24、nt.getSource().cancel(event.getRequest(),this);102 103 / 處理響應(yīng)104 PDU request = event.getRequest();105 PDU response = event.getResponse();106 System.out.println("Asynchronise(異步) message(消息) from(來自) "107 + event.getPeerAddress() + "rn"+"request(發(fā)送的請(qǐng)求):" + request108 + &

25、quot;rn"+"response(返回的響應(yīng)):" + response);109 110 111 ;112 / 發(fā)送報(bào)文113 snmp.send(pdu, target, null, listener);114 115 116 117 public static void main(String args) 118 /Snmp的三個(gè)版本號(hào)119 /int ver3 = SnmpConstants.version3;120 int ver2c = SnmpConstants.version2c;121 /int ver1 = SnmpConstants.ve

26、rsion1;122 Snmp4jFirstDemo manager = new Snmp4jFirstDemo(ver2c);123 / 構(gòu)造報(bào)文124 PDU pdu = new PDU();125 /PDU pdu = new ScopedPDU();126 / 設(shè)置要獲取的對(duì)象ID,這個(gè)OID代表遠(yuǎn)程計(jì)算機(jī)的名稱127 OID oids = new OID("..0");128 pdu.add(new VariableBinding(oids);129 / 設(shè)置報(bào)文類型130 pdu.setType(PDU.GET);131 /(Scop

27、edPDU) pdu).setContextName(new OctetString("priv");132 try 133 / 發(fā)送消息 其中最后一個(gè)是想要發(fā)送的目標(biāo)地址134 /manager.sendMessage(false, true, pdu, "udp:29/161");/29 Linux服務(wù)器135 manager.sendMessage(false, true, pdu, "udp:33/161");/33 WinServer20

28、08服務(wù)器136 catch (IOException e) 137 e.printStackTrace();138 139 140 復(fù)制代碼5.2、獲得本機(jī)的信息復(fù)制代碼 1 package me.gacl.snmp; 2 3 import java.io.IOException; 4 import org.snmp4j.CommunityTarget; 5 import org.snmp4j.PDU; 6 import org.snmp4j.Snmp; 7 import org.snmp4j.TransportMapping; 8 import org.snmp4j.event.Respo

29、nseEvent; 9 import org.snmp4j.mp.SnmpConstants;10 import org.snmp4j.smi.Address;11 import org.snmp4j.smi.GenericAddress;12 import org.snmp4j.smi.OID;13 import org.snmp4j.smi.OctetString;14 import org.snmp4j.smi.VariableBinding;15 import org.snmp4j.transport.DefaultUdpTransportMapping;16 17 /*18 * &l

30、t;p>ClassName: GetOID<p>19 * <p>Description:獲得本機(jī)的信息 <p>20 * author xudp21 * version 1.0 V22 * createTime 2014-9-15 下午04:45:1223 */24 public class GetOID 25 26 public static void main(String args) throws Exception 27 28 try 29 /設(shè)定CommunityTarget 30 CommunityTarget myTarget = new

31、CommunityTarget();31 /定義遠(yuǎn)程主機(jī)的地址 32 /Address deviceAdd = GenericAddress.parse("udp:33/161"); 33 /定義本機(jī)的地址 34 Address localAdd = GenericAddress.parse("udp:localhost/161");35 /設(shè)定遠(yuǎn)程主機(jī)的地址 36 /myTarget.setAddress(deviceAdd); 37 /設(shè)定本地主機(jī)的地址38 myTarget.setAddress(localAdd);39 /設(shè)

32、置snmp共同體 40 myTarget.setCommunity(new OctetString("public"); 41 /設(shè)置超時(shí)重試次數(shù) 42 myTarget.setRetries(2); 43 /設(shè)置超時(shí)的時(shí)間 44 myTarget.setTimeout(5*60);45 /設(shè)置使用的snmp版本 46 myTarget.setVersion(SnmpConstants.version2c); 47 48 /設(shè)定采取的協(xié)議 49 TransportMapping transport = new DefaultUdpTransportMapping();/設(shè)定

33、傳輸協(xié)議為UDP50 /調(diào)用TransportMapping中的listen()方法,啟動(dòng)監(jiān)聽進(jìn)程,接收消息,由于該監(jiān)聽進(jìn)程是守護(hù)進(jìn)程,最后應(yīng)調(diào)用close()方法來釋放該進(jìn)程51 transport.listen(); 52 /創(chuàng)建SNMP對(duì)象,用于發(fā)送請(qǐng)求PDU53 Snmp protocol = new Snmp(transport); 54 /創(chuàng)建請(qǐng)求pdu,獲取mib 55 PDU request = new PDU(); 56 /調(diào)用的add方法綁定要查詢的OID57 request.add(new VariableBinding(new OID(".");

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論