《用JAVA和SNMP实现流量统计.doc》由会员分享,可在线阅读,更多相关《用JAVA和SNMP实现流量统计.doc(6页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、如有侵权,请联系网站删除,仅供学习与交流用JAVA和SNMP实现流量统计【精品文档】第 6 页用JAVA和SNMP实现流量统计(二)计算流量统计的思路是:采集两次设备数据,用流量值的差值,除以时间的差值,即是当前的流量值,时间间隔我用的是5秒。这里需要注意的是,时间间隔不能太长。我们可以计算一下:232*23/(1024*1024*1024)=32OID采集的是字节,要换成bit也就是说,OID值最多累积到32Gbit就会归零。对于一般的千兆级的网络设备来说,5秒的时间,最多也就累积56.25Gbit的流量,但对于万兆级的设备来说,5秒的时间,可能累积超过50Gbit的流量,这将导致OID值发
2、生一次或两次归零,这就情况下,就要缩短间隔时间了,3秒就更适合一些。其实采集数据的间隔时间越短,就越容易采集到峰值,时间越长,计算出来的数据就越平均。由于我们还没有哪个设备的端口流量能在5秒内超过32Gbit,选5秒做为时间间隔还是很适合的。采集OID值的代码如下:importjava.io.IOException;import.InetAddress;importjava.text.SimpleDateFormat;importjava.util.ArrayList;importjava.util.Calendar;importjava.util.Vector;importorg.snmp4
3、j.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.sn
4、mp4j.smi.OctetString;importorg.snmp4j.smi.UdpAddress;importorg.snmp4j.smi.VariableBinding;importorg.snmp4j.transport.DefaultUdpTransportMapping;/统计流量的类,取时间与流量publicclassFlowfinalStringOCTER_STRING=admin;/共同体finalStringTIME_OID=.1.3.6.1.2.1.1.3.0;/时间OID,所有设备一样StringIpAddress;/设备IP地址ArrayListFlowOidGr
5、oup;/流量OID,可能有多个privateStringNowTime;/端口流量的采集时间privatelongFlowValue;/端口流量的值publicbooleanisSuccess=true;/构造器:IP地址和流量OID组(因为可能需要多个端口的流量加在一起)publicFlow(StringIpAddress,ArrayListFlowOidGroup)this.IpAddress=IpAddress;this.FlowOidGroup=FlowOidGroup;this.calc();/取当前时间publicStringgetNowTime()returnNowTime;/
6、取端口流量publiclonggetFlowValue()returnFlowValue;/计算端口流量SuppressWarnings(unchecked)privatevoidcalc()trySnmpsnmp;TransportMappingtransport;AddresstargetAddress=GenericAddress.parse(udp:+IpAddress+/161);transport=newDefaultUdpTransportMapping();snmp=newSnmp(transport);transport.listen();/监听CommunityTarget
7、target=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(T
8、IME_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)/从
9、目的设备取值,得到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(TimeSt
10、ring0)*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(:)
11、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=new
12、SimpleDateFormat(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(
13、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对象,再将采集到的数据插入到数据库,采集部分的
14、工作就完成了。我写的代码采集周期是5分钟,与CACTI一样,共采集40多个设备。可以写成控制台程序,也可以写成界面方式,用以显示设备的连接状态。控制台程序如下:界面程序如下:还可以把界面程序隐藏到右下角:报表程序报表程序可以写成C/S架构,也可以写成B/S架构,它们各自的优势就不用说了。用Delphi写的曲线图表用JavaEE+JBoss+JFreeChart写的报表和图表PS:由于本人对JavaEE的学习尚浅,所以Web程序的开发是我的一个同事个人完成的,他可是专业的。至此,一个流量统计系统就完成了。在这个系统程序编写的过程中,我学到了很多知识,也思考并解决了不少以前不曾想过或遇过的问题。作为一名业余的编程爱好者,用自己的编程知识解决工作中的实际问题,不但更增加了自己的学习动力,也为自己和同事节省出更多的时间,真是一件让人快乐的事!