用JAVA和SNMP实现流量统计.doc_第1页
用JAVA和SNMP实现流量统计.doc_第2页
用JAVA和SNMP实现流量统计.doc_第3页
用JAVA和SNMP实现流量统计.doc_第4页
用JAVA和SNMP实现流量统计.doc_第5页
免费预览已结束,剩余2页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

用JAVA和SNMP实现流量统计(二)计算流量统计的思路是:采集两次设备数据,用流量值的差值,除以时间的差值,即是当前的流量值,时间间隔我用的是5秒。这里需要注意的是,时间间隔不能太长。我们可以计算一下:232*23/(1024*1024*1024)=32OID采集的是字节,要换成bit也就是说,OID值最多累积到32Gbit就会归零。对于一般的千兆级的网络设备来说,5秒的时间,最多也就累积56.25Gbit的流量,但对于万兆级的设备来说,5秒的时间,可能累积超过50Gbit的流量,这将导致OID值发生一次或两次归零,这就情况下,就要缩短间隔时间了,3秒就更适合一些。其实采集数据的间隔时间越短,就越容易采集到峰值,时间越长,计算出来的数据就越平均。由于我们还没有哪个设备的端口流量能在5秒内超过32Gbit,选5秒做为时间间隔还是很适合的。采集OID值的代码如下:importjava.io.IOException;.InetAddress;importjava.text.SimpleDateFormat;importjava.util.ArrayList;importjava.util.Calendar;importjava.util.Vector;importorg.snmp4j.AbstractTarget;importorg.snmp4j.CommunityTarget;importorg.snmp4j.PDU;importorg.snmp4j.Snmp;importorg.snmp4j.TransportMapping;importorg.snmp4j.event.ResponseEvent;importorg.snmp4j.mp.SnmpConstants;importorg.snmp4j.smi.Address;importorg.snmp4j.smi.GenericAddress;importorg.snmp4j.smi.OID;importorg.snmp4j.smi.OctetString;importorg.snmp4j.smi.UdpAddress;importorg.snmp4j.smi.VariableBinding;importorg.snmp4j.transport.DefaultUdpTransportMapping;/统计流量的类,取时间与流量publicclassFlowfinalStringOCTER_STRING=admin;/共同体finalStringTIME_OID=...0;/时间OID,所有设备一样StringIpAddress;/设备IP地址ArrayListFlowOidGroup;/流量OID,可能有多个privateStringNowTime;/端口流量的采集时间privatelongFlowValue;/端口流量的值publicbooleanisSuccess=true;/构造器:IP地址和流量OID组(因为可能需要多个端口的流量加在一起)publicFlow(StringIpAddress,ArrayListFlowOidGroup)this.IpAddress=IpAddress;this.FlowOidGroup=FlowOidGroup;this.calc();/取当前时间publicStringgetNowTime()returnNowTime;/取端口流量publiclonggetFlowValue()returnFlowValue;/计算端口流量SuppressWarnings(unchecked)privatevoidcalc()trySnmpsnmp;TransportMappingtransport;AddresstargetAddress=GenericAddress.parse(udp:+IpAddress+/161);transport=newDefaultUdpTransportMapping();snmp=newSnmp(transport);transport.listen();/监听CommunityTargettarget=newCommunityTarget();target.setCommunity(newOctetString(OCTER_STRING);/设置共同体名target.setAddress(targetAddress);/设置目标Agent地址target.setRetries(2);/重试次数target.setTimeout(3000);/超时设置target.setVersion(1);/版本PDUrequest=newPDU();request.setType(PDU.GET);/操作类型GETrequest.add(newVariableBinding(newOID(TIME_OID);/OID_sysUpTimefor(StringFlowOid:FlowOidGroup)request.add(newVariableBinding(newOID(FlowOid);/取两次数据,间隔10秒,算差值longtime=newlong2;longflow=newlong2FlowOidGroup.size();for(intcount=0;count2;count+)ResponseEventrespEvt=snmp.send(request,target);/发送请求if(respEvt!=null&respEvt.getResponse()!=null)/从目的设备取值,得到VectorVectorrevBindings=(Vector)respEvt.getResponse().getVariableBindings();StringTimeTicks=revBindings.elementAt(0).getVariable().toString().trim();StringTimeString=TimeTicks.split();/得到时间字符串数组/取时间186days,21:26:15.24,也有可能没有day,就是不到一天if(TimeTicks.contains(day)timecount=Long.parseLong(TimeString0)*24*3600+Long.parseLong(TimeString2.split(:)0)*3600+Long.parseLong(TimeString2.split(:)1)*60+Math.round(Double.parseDouble(TimeString2.split(:)2);elsetimecount=Long.parseLong(TimeString0.split(:)0)*3600+Long.parseLong(TimeString0.split(:)1)*60+Math.round(Double.parseDouble(TimeString0.split(:)2);/取端口流量for(inti=0;iFlowOidGroup.size();i+)flowcounti=Long.parseLong(revBindings.elementAt(i+1).getVariable().toString();isSuccess=true;elseisSuccess=false;if(count=0)Thread.sleep(5000);/延时5秒后,第二次取值snmp.close();transport.close();/计算并为时间和最终流量赋值Calendarc=Calendar.getInstance();SimpleDateFormatsdf=newSimpleDateFormat(yyyy-MM-ddHH:mm);NowTime=sdf.format(c.getTime();/当前时间longAllSubValue=0;for(inti=0;iFlowOidGroup.size();i+)longsub=flow1i-flow0i;/*端口流量值为无符号32位,超出后就归0,所以如果两次取值差值为负,*必然出现一次归0的情况,由于单个端口的流量不可能超过每5秒1*232字节*/if(sub0)/因为端口流量为无符号32位,所以最大值是有符号32位的两倍sub+=2L*Integer.MAX_VALUE;AllSubValue+=sub;if(time1-time0!=0)/字节换算成兆比特才是最终流量FlowValue=(long)(AllSubValue/1024.0/1024*8/(time1-time0);isSuccess=true;elseSystem.out.println(地址:+IpAddress+数据采集失败!);isSuccess=false;catch(IOException|InterruptedExceptione)e.printStackTrace();程序的完善以上只是单个设备的一次流量采集,接下来编写代码读取之前写好的配置文件,并根据文件内容生成Flow对象,再将采集到的数据插入到数据库,采集部分的工作就完成了。我写的代码采集周期是5分钟,与CACTI一样,共采集40多个设备。可以写成控制台程序,也可以写成界面方式,用以显示设备的连接状态。控制台程序如下:界面程序如下:还可以把界面程序隐藏到右下角:报表程序报表程序可以写成C/S架构,也可以写成B/S架构,它们各自的优势就不用说了。用Delphi写的曲线图表用Jav

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论