




已阅读5页,还剩6页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
使用SNMP4J可以很方便的实现一个SNMP NMS的功能。对于SNMPv1/SNMPv2,简单的说,只需要以下几个步骤1) 创建Snmp对象snmp2) 创建CommunityTarget对象target,并指定community, version, address, timeout, retry等参数。3) 创建PDU对象pdu,并指定操作类型(GET/GETNEXT/GETBULK/SET), 添加VariableBinding(也就是待操作的OID), 如果是GETBULK操作,还可以指定MaxRepetitions和NonRepeaters。注意一定要指定MaxRepetitions,默认值是0,那样不会返回任何结果。4) 调用snmp.send(pdu, target)方法,发送请求请返回结果。此外,SNMP4J提供了TableUtils类,可以很轻松的实现一个SNMP Walk的功能,比如一次返回一个表格下面的所有MIB值。TableUtils类还支持指定ower bound index 和 upper bound index, 得到更小范围的结果以提高性能。这一点对于从一个很多行的表中取一部分行的数据来说很重要。Snmp还支持异步的send方法。下面的代码实例实现了GET, GETNEXT, GETBULK, Walk, SET操作,以及一个利用异步send方法实现的agent discovery: 对一个广播地址发送请求,等待agent返回的应答。如果需要对一个范围内的IP进行扫描,可以稍加改进,反复调用异步send多次发送给不同IP。java view plaincopyprint?1. importjava.io.IOException;2. importjava.util.List;3. importjava.util.Vector;4. 5. importorg.snmp4j.CommunityTarget;6. importorg.snmp4j.PDU;7. importorg.snmp4j.Snmp;8. importorg.snmp4j.event.ResponseEvent;9. importorg.snmp4j.event.ResponseListener;10. importorg.snmp4j.mp.SnmpConstants;11. importorg.snmp4j.smi.OID;12. importorg.snmp4j.smi.OctetString;13. importorg.snmp4j.smi.UdpAddress;14. importorg.snmp4j.smi.VariableBinding;15. importorg.snmp4j.transport.DefaultUdpTransportMapping;16. importorg.snmp4j.util.DefaultPDUFactory;17. importorg.snmp4j.util.TableEvent;18. importorg.snmp4j.util.TableUtils;19. 20. publicclassSNMPv2Test21. publicstaticvoidmain(Stringargs)throwsIOException,InterruptedException22. Snmpsnmp=newSnmp(newDefaultUdpTransportMapping();23. snmp.listen();24. 25. CommunityTargettarget=newCommunityTarget();26. target.setCommunity(newOctetString(public);27. target.setVersion(SnmpConstants.version2c);28. target.setAddress(newUdpAddress(00/161);29. target.setTimeout(3000);/3s 30. target.setRetries(1);31. 32. sendRequest(snmp,createGetPdu(),target);33. sendRequest(snmp,createGetNextPdu(),target);34. sendRequest(snmp,createGetBulkPdu(),target);35. snmpWalk(snmp,target);36. 37. target.setCommunity(newOctetString(private);38. sendRequest(snmp,createSetPdu(),target);39. 40. CommunityTargetbroadcastTarget=newCommunityTarget();41. broadcastTarget.setCommunity(newOctetString(public);42. broadcastTarget.setVersion(SnmpConstants.version2c);43. broadcastTarget.setAddress(newUdpAddress(55/161);44. broadcastTarget.setTimeout(5000);/5s 45. sendAsyncRequest(snmp,createGetNextPdu(),broadcastTarget);46. Thread.sleep(6000);/mainthreadwait6sforthecompletionofasynchronousrequest 47. 48. 49. privatestaticPDUcreateGetPdu()50. PDUpdu=newPDU();51. pdu.setType(PDU.GET);52. pdu.add(newVariableBinding(newOID(..0);/sysUpTime 53. pdu.add(newVariableBinding(newOID(..0);/sysName 54. pdu.add(newVariableBinding(newOID(.);/expectanno_such_instanceerror 55. returnpdu;56. 57. 58. privatestaticPDUcreateGetNextPdu()59. PDUpdu=newPDU();60. pdu.setType(PDU.GETNEXT);61. pdu.add(newVariableBinding(newOID(.);/sysUpTime 62. pdu.add(newVariableBinding(newOID(.);/sysName 63. 64. returnpdu;65. 66. 67. privatestaticPDUcreateGetBulkPdu()68. PDUpdu=newPDU();69. pdu.setType(PDU.GETBULK);70. pdu.setMaxRepetitions(10);/mustsetit,defaultis0 71. pdu.setNonRepeaters(0);72. pdu.add(newVariableBinding(newOID(.2.1.1);/system 73. returnpdu;74. 75. 76. privatestaticPDUcreateSetPdu()77. PDUpdu=newPDU();78. pdu.setType(PDU.SET);79. pdu.add(newVariableBinding(newOID(..0),newOctetString(sysname);/sysName 80. returnpdu;81. 82. 83. privatestaticvoidsendRequest(Snmpsnmp,PDUpdu,CommunityTargettarget)84. throwsIOException85. ResponseEventresponseEvent=snmp.send(pdu,target);86. PDUresponse=responseEvent.getResponse();87. 88. if(response=null)89. System.out.println(TimeOut.);90. else91. if(response.getErrorStatus()=PDU.noError)92. Vectorvbs=response.getVariableBindings();93. for(VariableBindingvb:vbs)94. System.out.println(vb+,+vb.getVariable().getSyntaxString();95. 96. else97. System.out.println(Error:+response.getErrorStatusText();98. 99. 100. 101. 102. privatestaticvoidsendAsyncRequest(Snmpsnmp,PDUpdu,CommunityTargettarget)103. throwsIOException104. snmp.send(pdu,target,null,newResponseListener()105. 106. Override107. publicvoidonResponse(ResponseEventevent)108. PDUresponse=event.getResponse();109. System.out.println(Gotresponsefrom+event.getPeerAddress();110. if(response=null)111. System.out.println(TimeOut.);112. else113. if(response.getErrorStatus()=PDU.noError)114. Vectorvbs=response.getVariableBindings();115. for(VariableBindingvb:vbs)116. System.out.println(vb+,+vb.getVariable().getSyntaxString();117. 118. else119. System.out.println(Error:+response.getErrorStatusText();120. 121. 122. );123. 124. 125. privatestaticvoidsnmpWalk(Snmpsnmp,CommunityTargettarget)126. TableUtilsutils=newTableUtils(snmp,newDefaultPDUFactory(PDU.GETBULK);/GETNEXTorGETBULK 127. utils.setMaxNumRowsPerPDU(5);/onlyforGETBULK,setmax-repetitions,defaultis10 128. OIDcolumnOids=newOID129. newOID(..1.2),/sysORID 130. newOID(..1.3),/sysORDescr 131. newOID(..1.5)/wrongOID,expectannullininVariableBindingarray 132. ;133. /Ifnotnull,allreturnedrowshaveanindexinarange(lowerBoundIndex,upperBoundIndex 134. Listl=utils.getTable(target,columnOids,newOID(3),newOID(10);135. for(TableEvente:l)136. System.out.println(e);137. 138. 139. 对于SNMPv3,不同点有1) 需要创建USM对象并添加User, 关于USM-/fw0124/article/details/85570292) 需要创建UserTarget对象,而不是创建CommunityTarget对象。3) 需要创建ScopedPDU对象,而不是PDU对象。使用SNMP4J进行SNMPv3编程的步骤如下:1) 创建Snmp对象snmp2) 创建USM对象,并创建User,添加到USM对象中。创建User是需要指定securityName,认证协议MD5/SHA1,认证密钥,加密算法DES/AES,加密密钥。添加User到USM对象中时候,可以指定engineID也可以不指定。3) 创建UserTarget对象target,并指定version, address, timeout, retry等参数,这些和SNMPv1/v2相同。另外还必须指定SNMPv3特有的两个参数SecurityLevel和SecurityName。SNMP4J会根据这个SecurityName到USM的UserTable中查找匹配的User,用这个User的信息进行认证加密处理。查找的时候必须同时匹配SecurityName和engineID,但是如果添加User到USM对象中时候,没有指定engineID,那么SecurityName相同即匹配成功。4) 创建ScopedPDU对象pdu,并指定操作类型(GET/GETNEXT/GETBULK/SET), 添加VariableBinding(也就是待操作的OID),如果是GETBULK操作,还可以指定MaxRepetitions和NonRepeaters。注意一定要指定MaxRepetitions,默认值是0,那样不会返回任何结果。如果agent上设定的contextEngineId和snmpEngineId不一致,那么需要调用ScopedPDU.setContextEngineID()方法设定contextEngineId。如果agent上设定了contextName,那么需要调用ScopedPDU.setContextName()方法设定contextName。5) 调用snmp.send(pdu, target)方法,发送请求请返回结果。对于SNMPv3,仍然可以调用TableUtils类实现一个SNMP Walk的功能。但是如果需要指定contextEngineId和contextName, 那么不能使用DefaultPDUFactory,可以从它继承并覆盖它的createPDU方法。异步的send方法支持和SNMPv1/v2类似。下面的代码实例实现了GET, Walk操作, 其他GETNEXT, GETBULK, SET操作类似。java view plaincopyprint?1. importjava.io.IOException;2. importjava.util.List;3. importjava.util.Vector;4. 5. importorg.snmp4j.PDU;6. importorg.snmp4j.ScopedPDU;7. importorg.snmp4j.Snmp;8. importorg.snmp4j.Target;9. importorg.snmp4j.UserTarget;10. importorg.snmp4j.event.ResponseEvent;11. importorg.snmp4j.mp.MPv3;12. importorg.snmp4j.mp.SnmpConstants;13. importorg.snmp4j.security.AuthMD5;14. importorg.snmp4j.security.PrivDES;15. importorg.snmp4j.security.SecurityLevel;16. importorg.snmp4j.security.SecurityModels;17. importorg.snmp4j.security.SecurityProtocols;18. importorg.snmp4j.security.USM;19. importorg.snmp4j.security.UsmUser;20. importorg.snmp4j.smi.OID;21. importorg.snmp4j.smi.OctetString;22. importorg.snmp4j.smi.UdpAddress;23. importorg.snmp4j.smi.VariableBinding;24. importorg.snmp4j.transport.DefaultUdpTransportMapping;25. importorg.snmp4j.util.DefaultPDUFactory;26. importorg.snmp4j.util.TableEvent;27. importorg.snmp4j.util.TableUtils;28. 29. publicclassSNMPv3Test30. publicstaticvoidmain(Stringargs)throwsIOException,InterruptedException31. 32. Snmpsnmp=newSnmp(newDefaultUdpTransportMapping();33. USMusm=newUSM(SecurityProtocols.getInstance(),newOctetString(MPv3.createLocalEngineID(),0);34. SecurityModels.getInstance().addSecurityModel(usm);35. snmp.listen();36. 37. /AddUser 38. UsmUseruser=newUsmUser(39. newOctetString(nmsAdmin),40. AuthMD5.ID,newOctetString(nmsAuthKey),41. PrivDES.ID,newOctetString(nmsPrivKey);42. /IfthespecifiedSNMPengineidisspecified,thisusercanonlybeusedwiththespecifiedengineID 43. /Soifitsnotcorrect,willgetanerrorthatcantfindauserfromtheusertable. 44. /snmp.getUSM().addUser(newOctetString(nmsAdmin),newOctetString(0002651100),user); 45. snmp.getUSM().addUser(newOctetString(nmsAdmin),user);46. 47. UserTargettarget=newUserTarget();48. target.setVersion(SnmpConstants.version3);49. target.setAddress(newUdpAddress(00/161);50. target.setSecurityLevel(SecurityLevel.AUTH_PRIV);51. target.setSecurityName(newOctetString(nmsAdmin);52. target.setTimeout(3000);/3s 53. target.setRetries(0);54. 55. OctetStringcontextEngineId=newOctetString(000265110002);56. sendRequest(snmp,createGetPdu(contextEngineId),target);57. snmpWalk(snmp,target,contextEngineId);58. 59. 60. privatestaticPDUcreateGetPdu(OctetStringcontextEngineId)61. ScopedPDUpdu=newScopedPDU();62. pdu.setType(PDU.GET);63. pdu.setContextEngineID(contextEngineId);/ifnotset,willbeSNMPengineid 64. /pdu.setContextName(contextName);/mustbesameasSNMPagent 65. 66. pdu.add(newVariableBinding(newOID(..0);/sysUpTime 67. pdu.add(newVariableBinding(newOID(..0);/sysName 68. pdu.add(newVariableBinding(newOID(.);/expectanno_such_instanceerror 69. returnpdu;70. 71. 72. privatestaticvoidsendRequest(Snmpsnmp,PDUpdu,UserTargettarget)73. throwsIOException74. ResponseEventresponseEvent=snmp.send(pdu,target);75. PDUresponse=responseEvent.getResponse();76. 77. if(response=null)78. System.out.println(TimeOut.);79. else80. if(response.getErrorStatus()=PDU.noError)81. Vectorvbs=response.getVariableBindings();82. for(VariableBindingvb:vbs)83. System.out.println(vb+,+vb.getVariable().getSyntaxString();84. 85. else86. System.out.println(Error:+response.getErrorStatusText();87. 88. 89. 90. 91. privatestaticvoidsnmpWalk(Snmpsnmp,UserTargettarget,OctetStringcontextEngineId)92. TableUtilsutils=newTableUtils(snmp,93. newMyDefaultPDUFactory(PDU.GETNEXT,/GETNEXTorGETBULK) 94. contextEngineId);95. utils.setMaxNumRowsPerPDU(5);/onlyforGETBULK,setmax-repetitions,defaultis10 96. OIDcolumnOids=newOID97. newOID(..1.2),/sysORID 98. newOID(..1.3)/sysORDescr 99. ;100. /Ifnotnull,allreturnedrowshaveanindexinarange(lowerBoundIndex,upperBoundIndex 101. Listl=utils.getTable(target,columnOids,newOID(3),newOID(10);102. for(TableEvente:l)103. System.out.println(e);104. 105. 106. 107. privatestaticclassMyDefaultPDUFactoryextendsDefaultPDUFactory108. privateOctetStringcontextEngineId=null;109. 110. publicMyDefaultPDUFactory(intpduType,OctetStringcontextEngineId)111. super(pduType);112. this.contextEngineId=contextEngineId;113. 114. 115. Override116. publicPDUcreatePDU(Targettarget)117. PDUpdu=super.createPDU(target);118. if(target.getVersion()=SnmpConstants.version3)119. (ScopedPDU)pdu).setContextEngineID(contextEngineId);120. 121. returnpdu;122. 123. 124. import java.io.IOException;import java.util.List;import java.util.Vector;import org.snmp4j.PDU;import org.snmp4j.ScopedPDU;import org.snmp4j.Snmp;import org.snmp4j.Target;import org.snmp4j.UserTarget;import org.snmp4j.event.ResponseEvent;import org.snmp4j.mp.MPv3;import org.snmp4j.mp.SnmpConstants;import org.snmp4j.security.AuthMD5;import org.snmp4j.security.PrivDES;import org.snmp4j.security.SecurityLevel;import org.snmp4j.security.SecurityModels;import org.snmp4j.security.SecurityProtocols;import org.snmp4j.security.USM;import org.snmp4j.security.UsmUser;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 org.snmp4j.util.DefaultPDUFactory;import org.snmp4j.util.TableEvent;import org.snmp4j.util.TableUtils;public class SNMPv3Test public static void main(String args) throws IOException, InterruptedException Snmp snmp = new Snmp(new DefaultUdpTransportMapping();USM usm = new USM(SecurityProtocols.getInstance(), new OctetString(MPv3.createLocalEngineID(), 0);SecurityModels.getInstance().addSecurityModel(usm);snmp.listen();/ Add UserUsmUser user = new UsmUser(new OctetString(nmsAdmin),AuthMD5.ID, new OctetString(nmsAuthKey),PrivDES.ID, new OctetString(nmsPrivKey);/If the specified SNMP engine id is specified, this user can only be used with the specified engine ID/So if its not correct, will get an error that cant find a user from the user table./snmp.getUSM().addUser(new OctetString(nmsAdmin), new OctetString(0002651100), user);snmp.getUSM().addUser(new OctetString(nmsAdmin), user);UserTarget target = new UserTarget();target.setVersion(SnmpConstants.version3);target.setAddress(new UdpAddress(00/161);target.setSecurityLevel(SecurityLevel.AUTH_PRIV);target.setSecurityName(new OctetString(nmsAdmin);target.setTimeout(3000);/3starget.setRetries(0);OctetString contextEngineId = new OctetString(000265110002);sendRequest(snmp, createGetPdu(contextEngineId), target);snmpWalk(snmp, target, contextEngineId);private static PDU createGetPdu(OctetString contextEngineId) ScopedPDU pdu = new ScopedPDU();pdu.setType(PDU.GET);pdu.setContextEngineID(contextEngineId);/if not set, will be SNMP engine id/pdu.setContextName(contextName); /must be same as SNMP agentpdu.add(new VariableBinding(new OID(..0);/sysUpTimepdu.add(new VariableBinding(new OID(..0);/sysNamepdu.add(new VariableBinding(new OID(.);/expect an no_such_instance errorreturn pdu;private static v
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- GB/T 12823.3-2025摄影和图形技术密度测量第3部分:光谱条件
- 森林里的绅士课件
- 棋类社团招新课件
- 桥梁资料填写范例课件
- 2025年航空业空乘人员面试与笔试题目集及答案
- 2025年主管护师考试试题及答案
- 2025年机械制图高级人才选拔面试题及答案详解
- 2025年乒乓球裁判证考试试题及答案
- 2025年金融投资策略与风险控制培训教程及答案
- 2026届黑龙江省齐齐哈尔市龙江县二中化学高三上期末质量检测试题含解析
- 课堂观察-走向专业的听评课-崔允漷
- 眼科检查 视野检查 视野概述
- 鹤壁中泰矿业有限公司新副井工程环境影响报告
- 颈椎病中医护理查房
- GB/T 20245.1-2006电化学分析器性能表示第1部分:总则
- GB/T 20001.7-2017标准编写规则第7部分:指南标准
- 医用高等数学-课件
- 《展示设计》课程教案
- 市政道路雨污水管道工程施工技术详细课件
- 村集体经济组织财务及会计知识讲座课件
- 热集成-4.夹点技术基础理论
评论
0/150
提交评论