最新用JAVA和SNMP实现流量统计

用JAVA和SNMP实现流量统计

用JAVA和SNMP实现流量统计(二)
计算流量统计的思路是:采集两次设备数据,用流量值的差值,除以时间的差值,即是当前的流量值,时间间隔我用的是5秒。这里需要注意的是,时间间隔不能太长。我们可以计算一下:
2^32*2^3/(1024*1024*1024)=32   OID采集的是字节,要换成bit
也就是说,OID值最多累积到32Gbit就会归零。对于一般的千兆级的网络设备来说,5秒的时间,最多也就累积5~6.25Gbit的流量,但对于万兆级的设备来说,5秒的时间,可能累积超过50Gbit的流量,这将导致OID值发生一次或两次归零,这就情况下,就要缩短间隔时间了,3秒就更适合一些。其实采集数据的间隔时间越短,就越容易采集到峰值,时间越长,计算出来的数据就越平均。由于我们还没有哪个设备的端口流量能在5秒内超过32Gbit,选5秒做为时间间隔还是很适合的。采集OID值的代码如下:
import java.io.IOException;
import java.net.InetAddress;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Vector;
import org.snmp4j.AbstractTarget;
import org.snmp4j.CommunityTarget;
import org.snmp4j.PDU;
import org.snmp4j.Snmp;
import org.snmp4j.TransportMapping;
import org.snmp4j.event.ResponseEvent;
import org.snmp4j.mp.SnmpConstants;
import org.snmp4j.smi.Address;
import org.snmp4j.smi.GenericAddress;
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;
//统计流量的类,取时间与流量
public铅封号 class Flow {
鹤嘴锤
final String OCTER_STRING = "admin";// 共同体
final String TIME_OID = ".1.3.6.1.2.1.1.3.0";// 时间OID,所有设备一样
String IpAddress;// 设备IP地址
ArrayList<String> FlowOidGroup;// 流量OID,可能有多个
private String NowTime;// 端口流量的采集时间
private long FlowValue;// 端口流量的值
public boolean isSuccess = true;
// 构造器:IP地址和流量OID组(因为可能需要多个端口的流量加在一起)
public Flow(String IpAddress, ArrayList<String> FlowOidGroup) {
this.IpAddress = IpAddress;
this.FlowOidGroup = FlowOidGroup;
this.calc();
}
// 取当前时间
public String getNowTime() {
return NowTime;
}
// 取端口流量
public long getFlowValue() {
return FlowValue;
}
组合式桥架
// 计算端口流量
@SuppressWarnings("unchecked")
private void calc() {
try {
Snmp snmp;
TransportMapping transport;
Address targetAddress = GenericAddress.parse("udp:" + IpAddress
+ "/161");
transport = new DefaultUdpTransportMapping();
snmp = new Snmp(电子散热扇transport);
transport.listen();// 监听
CommunityTarget target = new CommunityTarget();
target.setCommunity(new OctetString(OCTER_STRING));// 设置共同体名
target.setAddress(targetAddress);// 设置目标Agent地址
target.setRetries(2);// 重试次数
target.setTimeout(3000);// 超时设置
target.setVersion(1);// 版本
PDU request = new PDU();
request.setType(PDU.GET);// 操作类型GET
request.add(new VariableBinding(new OID(TIME_OID)));// OID_sysUpTime
for (String FlowOid : FlowOidGroup) {
request.add(new VariableBinding(new OID(FlowOid)));
}牧一征
// 取两次数据,间隔10秒,算差值
long[] time 摆度= new long[2];
long[][] flow = new long[2][FlowOidGroup.size()];

本文发布于:2024-09-25 22:23:50,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/4/221100.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:流量   时间   采集   端口   设置   间隔
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议