




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、一、SNMP4J介紹SNMP4J是一個用Java來實現(xiàn)SNMP(簡單網(wǎng)絡管理協(xié)議)協(xié)議的開源項目.它支持以命令行的形式進行管理與響應。SNMP4J是純面向對象設計與SNMP+(用C+實現(xiàn)SNMPv1/v2c/v3)相類似。SNMP4J API 提供以下下特性:支持MD5和SHA驗證,DES,3DES,AES128、AES192和AES256加密的SNMPv3。支持MPv1,MPv2C和MPv3,帶執(zhí)行的可阻塞的信息處理模塊。全部PDU格式??勺枞膫鬏斖負?。支持UPD、TCP、TLS 。可阻塞的超時模塊。同步和異步請求。命令發(fā)生器以及命令應答器的支持?;贏pache license的開源免費
2、。JAVA 1.4.1或更高版本(2.0或更高版本需要jdk1.6及以上的支持)?;贚OG4J記錄日志。使用GETBULK實現(xiàn)Row-based的有效的異步表格獲取。支持多線程。二、SNMP4J重要的類和接口介紹2.1、Snmp類Snmp類:該類是SNMP4J中最為核心的類。負責SNMP報文的接受和發(fā)送。它提供了發(fā)送和接收PDU的方法,所有的PDU類型都可以采用同步或者異步的方式被發(fā)送2.2、PDU類和ScopedPDU類該類是SNMP報文單元的抽象,其中PDU類適用于SNMPv1和SNMPv2c。ScopedPDU類繼承于PDU類,適用于SNMPv3。2.3、Target接口和Commun
3、ityTarget類以及UserTarget類對應于SNMP代理的地址信息,包括IP地址和端口號(161)。其中Target接口適用于SNMPv1和SNMPv2c。CommunityTarget類實現(xiàn)了Target接口,用于SNMPv1和SNMPv2c這兩個版本,UserTarget類實現(xiàn)了Target接口,適用于SNMPv3。2.4、TransportMapping接口該接口代表了SNMP4J所使用的傳輸層協(xié)議。這也是SNMP4J一大特色的地方。按照RFC的規(guī)定,SNMP是只使用UDP作為傳輸層協(xié)議的。而SNMP4J支持管理端和代理端使用UDP或者TCP進行傳輸。該接口有兩個子接口。2.5、
4、Snmp、Target、PDU三者的關系Target代表遠程設備或者遠程實體、PDU代表管理端同Target通信的數(shù)據(jù),Snmp就代表管理者管理功能(其實就是數(shù)據(jù)的收發(fā))的具體執(zhí)行者。打個比方:Target就是你遠方的戀人,PDU就是你們之間傳遞的情書、而Snmp就是負責幫你寄信收信的郵差。三、SNMP4J的兩種消息發(fā)送模式SNMP4J支持兩種消息發(fā)送模式:同步發(fā)送模式和異步發(fā)送模式。同步發(fā)送模式也稱阻塞模式。當管理端發(fā)送出一條消息之后,線程會被阻塞,直到收到對方的回應或者時間超時。同步發(fā)送模式編程較為簡單,但是不適用于發(fā)送廣播消息。異步發(fā)送模式也稱非阻塞模式。當程序發(fā)送一條消息之后,線程將會
5、繼續(xù)執(zhí)行,當收到消息的回應的時候,程序會對消息作出相應的處理。要實現(xiàn)異步發(fā)送模式,需要實例化一個實現(xiàn)了ResponseListener接口的類的對象。ResponseListener接口中有一個名為onResponse的函數(shù)。這是一個回調函數(shù),當程序收到響應的時候,會自動調用該函數(shù)。由該函數(shù)完成對響應的處理。四、使用SNMP4J實現(xiàn)管理端的步驟該部分說明了利用SNMP4J編寫SNMP管理端的大致過程,讀者在閱讀之后會對SNMP4J有一個宏觀上的認識。在附錄部分,作者給出了一個用SNMP4J開發(fā)管理站的樣例程序,如果有進一步的需要,請參考附錄部分。4.1 、初始化、明確SNMP在傳輸層所使用的協(xié)
6、議一般情況下,我們都使用使用UDP協(xié)議作為SNMP的傳輸層協(xié)議,所以我們需要實例化的是一個DefaultUdpTransportMapping接口對象;、實例化一個snmp對象在此過程中,我們需要將1中實例化的DefaultUdpTransportMapping接口的對象作為參數(shù),穿snmp類的構造函數(shù)中。另外,如果實現(xiàn)的SNMPv3協(xié)議,我們還需要設置安全機制,添加安全用戶等等;、監(jiān)聽snmp消息在此,我們可以調用剛剛實例化的DefaultUdpTransportMapping的接口對象的listen方法,讓程序監(jiān)聽snmp消息;4.2、 構造發(fā)送目標如果實現(xiàn)的是SNMPv2c或者說SNMP
7、v1,需要實例化一個CommunityTarget對象。如果實現(xiàn)的是SNMPv3程序,則需要實例化一個UserTarget對象。之后,我們還需要對實例化的對象做一些設置。如果是CommunityTarget的對象,則需要設置使用的Snmp版本,重傳時間和等待時延。如果是UserTarget對象,我們不僅需要設置版本、重傳時間、等待時延,還需要設置安全級別和安全名稱。4.3、 構造發(fā)送報文如果發(fā)送的是SNMPv2c或者說SNMPv1的報文,我們需要實例化一個PDU類的對象。如果發(fā)送的是SNMPv3的報文,我們則需要實例化一個ScopedPDU類的對象。之后,我們還需要生成一個OID對象,其中包含
8、了我們所需要獲取的SNMP對象在MIB庫中的ID。然后我們需要將OID和之前生成的PDU對象或者是ScopedPDU對象綁定,并且設置PDU的報文類型(五種SNMP報文類型之一)。4.4、 構造響應監(jiān)聽對象(異步模式)當使用異步模式的時候,我們需要實例化一個實現(xiàn)了ResponseListener接口的對象,作為響應消息的監(jiān)聽對象。在構造該對象的過程中,我們需要重寫ResponseListener的OnResponse函數(shù),該函數(shù)是一個回調函數(shù),用來處理程序收到響應后的一些操作。4.5、 發(fā)送消息當所有上述操作都設置完畢之后,就可以發(fā)送消息了。同步模式和異步模式發(fā)送消息調用的函數(shù)名字均為send
9、,但是兩個函數(shù)所需參數(shù)不一樣。同步模式的參數(shù)僅為4.2和4.3中構造的目標對象和報文對象,而異步模式還需要4.4中構造的監(jiān)聽對象。同步模式發(fā)送消息后便等待響應的到達,到達之后會返回一個ResponseEvent對象,該對象中包含了響應的相應信息。異步模式發(fā)送消息之后便會繼續(xù)執(zhí)行,當收到響應消息時便會調用監(jiān)聽對象的OnResponse函數(shù)。該函數(shù)中的語句便是我們對響應的處理五、使用SNMP4J實現(xiàn)管理端的編程實現(xiàn)、設定遠程實體snmp4j中,用CommunityTarget對象來表示遠程實體(要進行snmp消息通信的遠程主機,使用snmp的v2版本)、指定遠程實體的地址snmp4j中使用Addr
10、ess接口對象來表示,Address對象需要通過實現(xiàn)該接口的類的對象向上轉型來實例化、通過CommunityTarget以及其父接口中提供的setXX方法來設定遠程實體的屬性,如設定遠程實體的snmp共同體屬性、遠程實體的地址、超時時間、重傳次數(shù)、snmp版本等、設定使用的傳輸協(xié)議snmp4j中,用TransportMapping接口的對象來表示傳輸協(xié)議(tcp/udp)、調用TransportMapping中的listen()方法,啟動監(jiān)聽進程,接收消息,由于該監(jiān)聽進程是守護進程,最后應調用close()方法來釋放該進程、創(chuàng)建SNMP對象,用于發(fā)送請求PDU a、創(chuàng)建請求pdu,即創(chuàng)建PDU
11、類的對象,調用PDU類中的add()方法綁定要查詢的OID,調用PDU中的setType()方法來確定該pdu的類型(與snmp中五種操作想對應) b、通過PDU的構造方法 public SNMP(TransportMapping transportingMapping),或者其他構造方法來生成pdu,之后調用 ResopnseEvent send(PDU pdu,Target target)發(fā)送pdu,該方法返回一個ResponseEvent對象、通過ResponseEvent對象來獲得SNMP請求的應答pdu,方法:public PDU getResponse()、通過應答pdu獲得mib
12、信息(之前綁定的OID的值),方法:VaribleBinding get(int index)5.1、獲取遠程計算機的名稱復制代碼 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 / 設置安全模式 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 / 生成目標地址對象 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 / 設置安全級別 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 / 目標對象相關設置 76 target.setAddre
21、ss(targetAddress); 77 target.setRetries(5); 78 target.setTimeout(1000); 79 80 if (!syn) 81 / 發(fā)送報文 并且接受響應 82 ResponseEvent response = snmp.send(pdu, target); 83 / 處理響應 84 System.out.println("Synchronize(同步) message(消息) from(來自) " 85 + response.getPeerAddress() + "rn"+"request
22、(發(fā)送的請求):" 86 + response.getRequest() + "rn"+"response(返回的響應):" 87 + response.getResponse(); 88 /* 89 * 輸出結果: 90 * Synchronize(同步) message(消息) from(來自) 33/161 91 request(發(fā)送的請求):GETrequestID=632977521, errorStatus=Success(0), errorIndex=0, VBS..0 = Nul
23、l 92 response(返回的響應):RESPONSErequestID=632977521, errorStatus=Success(0), errorIndex=0, VBS..0 = WIN-667H6TS3U37 93 94 */ 95 else 96 / 設置監(jiān)聽對象 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 / 處理響應104 PDU request = event.getRequest();105 PDU response = event.getResponse();106 System.out.println("Asynchronise(異步) message(消息) from(來自) "107 + event.getPeerAddress() + "rn"+"request(發(fā)送的請求):" + request108 + &
25、quot;rn"+"response(返回的響應):" + response);109 110 111 ;112 / 發(fā)送報文113 snmp.send(pdu, target, null, listener);114 115 116 117 public static void main(String args) 118 /Snmp的三個版本號119 /int ver3 = SnmpConstants.version3;120 int ver2c = SnmpConstants.version2c;121 /int ver1 = SnmpConstants.ve
26、rsion1;122 Snmp4jFirstDemo manager = new Snmp4jFirstDemo(ver2c);123 / 構造報文124 PDU pdu = new PDU();125 /PDU pdu = new ScopedPDU();126 / 設置要獲取的對象ID,這個OID代表遠程計算機的名稱127 OID oids = new OID("..0");128 pdu.add(new VariableBinding(oids);129 / 設置報文類型130 pdu.setType(PDU.GET);131 /(Scop
27、edPDU) pdu).setContextName(new OctetString("priv");132 try 133 / 發(fā)送消息 其中最后一個是想要發(fā)送的目標地址134 /manager.sendMessage(false, true, pdu, "udp:29/161");/29 Linux服務器135 manager.sendMessage(false, true, pdu, "udp:33/161");/33 WinServer20
28、08服務器136 catch (IOException e) 137 e.printStackTrace();138 139 140 復制代碼5.2、獲得本機的信息復制代碼 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:獲得本機的信息 <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 /設定CommunityTarget 30 CommunityTarget myTarget = new
31、CommunityTarget();31 /定義遠程主機的地址 32 /Address deviceAdd = GenericAddress.parse("udp:33/161"); 33 /定義本機的地址 34 Address localAdd = GenericAddress.parse("udp:localhost/161");35 /設定遠程主機的地址 36 /myTarget.setAddress(deviceAdd); 37 /設定本地主機的地址38 myTarget.setAddress(localAdd);39 /設
32、置snmp共同體 40 myTarget.setCommunity(new OctetString("public"); 41 /設置超時重試次數(shù) 42 myTarget.setRetries(2); 43 /設置超時的時間 44 myTarget.setTimeout(5*60);45 /設置使用的snmp版本 46 myTarget.setVersion(SnmpConstants.version2c); 47 48 /設定采取的協(xié)議 49 TransportMapping transport = new DefaultUdpTransportMapping();/設定
33、傳輸協(xié)議為UDP50 /調用TransportMapping中的listen()方法,啟動監(jiān)聽進程,接收消息,由于該監(jiān)聽進程是守護進程,最后應調用close()方法來釋放該進程51 transport.listen(); 52 /創(chuàng)建SNMP對象,用于發(fā)送請求PDU53 Snmp protocol = new Snmp(transport); 54 /創(chuàng)建請求pdu,獲取mib 55 PDU request = new PDU(); 56 /調用的add方法綁定要查詢的OID57 request.add(new VariableBinding(new OID(".");
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 主管護師考試全方位試題及答案
- 行政管理??普Z文考試局限與試題及答案分析
- 執(zhí)業(yè)藥師考試的Oracle教程與試題及答案
- 行政管理學語文課外實踐活動的意義與效果試題及答案
- 2025年文化總結試題及答案
- 行政法律制度的變革試題與答案
- 行政法學的創(chuàng)新思維試題與答案
- 衛(wèi)生資格考試各類輔導資料總結及分享試題及答案
- 考前必做的醫(yī)師考試試題
- 抗生素使用原則與管理試題及答案
- 2022年全國大學生英語競賽C類試題
- 裝飾、裝修施工方案
- 礦井瓦斯抽采
- 施工現(xiàn)場安全檢查記錄表(周)以及詳細記錄
- 立法學完整版教學課件全套ppt教程
- 五年級下冊科學說課課件 -1.2 沉浮與什么因素有關 |教科版 (共28張PPT)
- 流動注射分析儀常見問題解決方案.
- 《出口報關單模板》word版
- 邊坡護坡檢驗批表格模板
- 工會會計制度——會計科目和會計報表(全)
- 馬清河灌區(qū)灌溉系統(tǒng)的規(guī)劃設計課程設計
評論
0/150
提交評論