ImageVerifierCode 换一换
格式:DOCX , 页数:22 ,大小:66.77KB ,
资源ID:3321510      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/3321510.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(Java进行SNMP通信的指南.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

Java进行SNMP通信的指南.docx

1、Java进行SNMP通信的指南Java进行SNMP通信的指南1. 概述在网络通信中,我们会经常遇到支持SNMP协议的网络设备打交道,支持SNMP协议的网络设备有很多,如各种带操作系统的服务器、路由器、交换机等,装有UNIX操作系统中的服务器一般都会支持SNMP协议,Windows操作系统的服务器也可以通过”控制面板-添加/删除程序-添加/删除Windows组件-管理和监视工具”中安装SNMP组件,如下图所示。图 1-1本文的目的不在于讲解SNMP的原理,关于SNMP的原理及其信息组织结构MIB的详细资料,网上的资料很多,本文的目的就是针对在Java环境下解决如何实现SNMP客户端的调用操作以及

2、如何实现SNMP服务器的简单模拟,把笔者的一些经验分享给大家。2. 实现过程我们知道,SNMP协议是基于UDP协议的,RFC-1157就是SNMP协议详细规范,SNMP协议经历了3个版本,分别是SNMPV1、SNMPV2和SNMPV3。SNMPV1 是一种简单的请求 / 响应协议,网络管理系统发出一个请求,管理器则返回一个响应,支持GET 、 GETNEXT 、 SET 和 TRAP这4种操作;SNMPV2 在SNMPV1的基础上还新增了两种新操作,GET BULK 和 INFORM;SNMPV3 中增加了安全管理方式及远程控制。由于SNMPV3的安全控制设置起来比较麻烦,所以一些被管设备不支

3、持SNMPV3,而SNMPV1对于大数据量处理有缺陷,所以大部分被管设备都支持SNMPV2,应用得比较多的也是SNMPV2。JDK提供了对于UDP的编程的支持,分别是数据报套接字(DatagramSocket)和数据包(DatagramPacket),直接采用这些类可以实现对SNMP协议的操作调用,但是正如西方国家一句谚语“不要重复发明轮子(Dont Reinvent the Wheel)”,我们没有必要从头开始在设计如何通过Java来实现SNMP,开源源代码的阵营里有好多工具包已经帮我们做掉这件事情了,其中比较出名的有joeSNMP、SNMP4J、iReasoning Java SNMP A

4、PI等,笔者采用的是SNMP4J,利用SNMP4J可以实现多种SNMP的应用,如客户端调用、Trap的收发、服务端模拟,下面我们就详细讲解如何通过SNMP4J来实现客户端及模拟器(服务端)的应用。2.1. SNMP4J介绍我们用到了SNMP4J的几个基础类:org.snmp4j.TransportMapping;org.snmp4j.Snmp;org.snmp4j.smi.Address;org.snmp4j.Target;TransportMapping类是对传输层的封装,对UDP封装为DefaultUdpTransportMapping,TCP封装为DefaultTcpTransportM

5、apping,TransportMapping只定义传输的接口,由于SNMP默认采用UDP作为传输协议,所以笔者感觉DefaultTcpTransportMapping不会被用到。Snmp类是SNMP4J的核心,它提供了发送和接收SNMP PDUs的方法,所有的SNMP PDU 类型都可以采用同步或者异步的方式被发送。PDU.java implements BERSerializable /SNMPv2的报文,提供了编码时需要的信息(个人觉得编码信息可以由工具类提供,对用户会混淆)。报文结构参见 ScopedPDU(v3)。AddressIP地址和端口(和的不同), 常用实现是UdpAddre

6、ss。Target发送的时候要用到,包含Address,超时、重试次数、SNMP的版本,常用实现是ComunityTarget,可以指定read community及write community。2.2. 实现客户端2.2.1. 初始化首先定义类变量,DATATYPE常量的定义是在SET操作里用到的,代码如下:代码:/* TransportMapping */private TransportMapping transport;/* */private Snmp protocol;/* DateType定義*/* Counter32 */public static final int DAT

7、ATYPE_COUNTER32 = 0;/* Counter64 */public static final int DATATYPE_COUNTER64 = 1;/* Gauge32 */public static final int DATATYPE_GAUGE32 = 2;/* GenericAddress */public static final int DATATYPE_GENERICADDRESS = 3;/* Integer32 */public static final int DATATYPE_INTEGER32 = 4;/* IpAddress */public stat

8、ic final int DATATYPE_IPADDRESS = 5;/* OctetString */public static final int DATATYPE_OCTETSTRING = 6;/* TimeTicks */public static final int DATATYPE_TIMETICKS = 7;/* UnsignedInteger32 */public static final int DATATYPE_UNSIGNEDINTEGER32 = 8;代码段 2.2.1 -1初始化,代码如下:代码:/* * 初期化 * * throws SmsTerminalExc

9、eption * */ private void init() throws SmsTerminalException try transport = new DefaultUdpTransportMapping(); protocol = new Snmp(transport); catch (IOException ex) throw new SmsTerminalException(init error, Constants.EXIT_CODE_NORMAL, ex); 代码段 2.2.1-22.2.2. GET/GETNEXT操作SnmpVO是一个简单的JavaBean,包含了以下属性

10、 ipAddress(目标机器IP地址); port(端口); retry(重试次数); timeout(超时时间); oid(要获取属性的OID); type(操作类型,默认是GET); communityGet(GET操作的团体字符串); communitySet(SET操作的团体字符串);GET/GETNEXT操作的代码如下:代码:/* * MIB情報取得 * * param snmpVo * SNMP相関情報 * return outValue * SNMP取得結果 * * throws SmsTerminalException * */ public String getSnmpVa

11、lue(SnmpVO snmpVo) throws SmsTerminalException log.debug(getSnmpValue start); String outValue = ; try CommunityTarget myTarget = setTarget(snmpVo, false); transport.listen(); PDU request = setRequest(snmpVo); PDU response = null; / PDU response ResponseEvent responseEvent = protocol.send(request, my

12、Target); if (snmpSendReceiveListener != null) snmpSendReceiveListener.beforeReceive(); / SNMP受信 response = responseEvent.getResponse(); if (response != null) if (response.getErrorIndex() = PDU.noError & response.getErrorStatus() = PDU.noError) / 正常場合 VariableBinding vb = response.get(0); if (vb.isEx

13、ception() throw new SmsTerminalException(vb.getVariable().toString(), Constants.EXIT_CODE_NORMAL, responseEvent.getError(); outValue = vb.getVariable().toString(); else / 発生 throw new SmsTerminalException(responseEvent.getError().getMessage(), Constants.EXIT_CODE_NORMAL, responseEvent.getError(); el

14、se / throw new SmsTerminalTimeoutException(SNMP受信); catch (IOException ex) throw new SmsTerminalException(getSnmpValue IO error, Constants.EXIT_CODE_NORMAL, ex); finally try if (protocol != null) protocol.close(); if (transport != null & transport.isListening() transport.close(); catch (IOException

15、ex) throw new SmsTerminalException(close protocol or transport error, Constants.EXIT_CODE_NORMAL, ex); log.debug(getSnmpValue end); return outValue; 代码段 2.2.2-1其中用到了setTarget方法,采用ComunityTarget设置目标设备IP和端口、Community、SNMP版本、重试次数、超时时间,代码如下:代码:/* * CommunityTarget設定 * * param snmpVo * SNMP相関情報 * param i

16、sSetOperation SET操作 * return myTarget * 設定CommunityTarget * */private CommunityTarget setTarget(SnmpVO snmpVo, boolean isSetOperation) CommunityTarget myTarget = new CommunityTarget(); Address deviceAdd; deviceAdd = GenericAddress.parse(snmpVo.getIpAddress() + / + snmpVo.getPort(); myTarget.setAddre

17、ss(deviceAdd); / address if (isSetOperation) if (StringConverter.nullCheckString(snmpVo.getCommunitySet() myTarget.setCommunity(new OctetString(snmpVo.getCommunitySet(); / communitySet else if (StringConverter.nullCheckString(snmpVo.getCommunityGet() myTarget.setCommunity(new OctetString(snmpVo.getC

18、ommunityGet(); / communityGet if (snmpVo.getRetry() != 0) myTarget.setRetries(snmpVo.getRetry(); / retries if (snmpVo.getTimeout() != 0) myTarget.setTimeout(snmpVo.getTimeout(); / timeout / int version = SnmpConstants.ver; if (StringConverter.nullCheckString(snmpVo.getCommunityGet() & (2c.equals(snm

19、pVo.getVer() | 1.equals(snmpVo.getVer() myTarget.setVersion(SnmpConstants.version2c);/ org.snmp4j.mp.* return myTarget;代码段 2.2.2-2还有setRequest方法,代码如下:代码:/* * OID設定 * * param snmpVo * SNMP相関情報 * return outValue * 設定VariableBinding * */private PDU setRequest(SnmpVO snmpVo) PDU request = new PDU(); Var

20、iableBinding var; / oid設定 var = new VariableBinding(new OID(snmpVo.getOid(); request.add(var); / 情報取得方式設定 request.setType(snmpVo.getType(); if (snmpVo.getType() = 0) request.setType(PDU.GET); /Default PDU type is GET. return request;代码段 2.2.2-32.2.3. SET操作Set操作的代码如下:代码:/* * MIB情報設定 * author honghui

21、* param snmpVo * SNMP相関情報 * param value * SNMP設定内容 * param dataType * throws SmsTerminalException * */public void setSnmpValue(SnmpVO snmpVo, String value, int dataType) throws SmsTerminalException log.debug(setSnmpValue start); try CommunityTarget myTarget = setTarget(snmpVo, true); transport.liste

22、n(); PDU request = new PDU(); OID oid = new OID(snmpVo.getOid(); Variable variable = getDataTypeVariable(value, dataType); if (variable = null) throw new SmsTerminalException(Invalid dataType : + dataType, Constants.EXIT_CODE_NORMAL, null); request.add(new VariableBinding(oid, variable); request.set

23、Type(PDU.SET); PDU response = null; / PDU response ResponseEvent responseEvent = protocol.send(request, myTarget); if (snmpSendReceiveListener != null) snmpSendReceiveListener.beforeReceive(); / SNMP受信 response = responseEvent.getResponse(); if (response != null) if (response.getErrorIndex() = PDU.n

24、oError & response.getErrorStatus() = PDU.noError) / 正常場合 else / 発生 throw new SmsTerminalException(responseEvent.getError().getMessage(), Constants.EXIT_CODE_NORMAL, responseEvent.getError(); else / throw new SmsTerminalTimeoutException(SNMP受信); catch (IOException ex) throw new SmsTerminalException(s

25、etSnmpValue IO error, Constants.EXIT_CODE_NORMAL, ex); finally try if (protocol != null) protocol.close(); if (transport != null & transport.isListening() transport.close(); catch (IOException ex) throw new SmsTerminalException(close protocol or transport error, Constants.EXIT_CODE_NORMAL, ex); 代码段

26、2.2.3-1Set操作调用到了getDataTypeVariable方法,需要把传入的dataType转换成SNMP4J的Variable,代码如下:代码:/* * Variable変換 * author honghui * param value SNMP設定内容 * param dataType * return Variable */private Variable getDataTypeVariable(String value, int dataType) switch (dataType) case DATATYPE_COUNTER32: return new Counter32

27、(Long.parseLong(value); case DATATYPE_COUNTER64: return new Counter64(Long.parseLong(value); case DATATYPE_GAUGE32: return new Gauge32(Long.parseLong(value); case DATATYPE_GENERICADDRESS: return new GenericAddress(); case DATATYPE_INTEGER32: return new Integer32(Integer.parseInt(value); case DATATYP

28、E_IPADDRESS: return new IpAddress(value); case DATATYPE_OCTETSTRING: return new OctetString(value); case DATATYPE_TIMETICKS: return new TimeTicks(Long.parseLong(value); case DATATYPE_UNSIGNEDINTEGER32: return new UnsignedInteger32(Long.parseLong(value); return null;代码段 2.2.3-22.3. 实现模拟器模拟器(或者说是服务端)的

29、作用很明显,就是在服务器上开启一个监听SNMP的服务,当有客户端的请求时,返回一些结果。如果模拟器做的很完美的话,客户端连接某个服务器获取或设置SNMP信息时,并没有觉察服务器是真实的还是模拟出来的。在我们的运用中,只是简单的模拟了GET、GETNEXT和SET这3个操作,对于GET/GETNEXT操作来说,请求后返回的数据也是从数据文件里读取到的,数据文件就是一个普通的CSV文件,内容如下:数据文件(CSV):OID,MIB情報1.3.6.1.2.1.1.6.0,Beijing20081.3.6.1.2.1.1.7.0,Olympic代码段 2.3-1由于我们只是简单的模拟,所以GET和GETNEXT操作返回的结果是相同的(如果要做成不同的,就要对OID进行排序处理)。对于SET操作来说,没有返回,如果SET出错,就会抛出异常。模拟器的代码不多,处理类的全部代码如下:代码:/* * CMTS_SNMP処理

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1