用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()];