借鉴自http://blog.csdn.net/xjtuse2014/article/details/53968726

1.MoniterBandwidth模块:

 package net.floodlightcontroller.qos_test;

 import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import net.floodlightcontroller.core.IFloodlightProviderService;
import net.floodlightcontroller.core.internal.IOFSwitchService;
import net.floodlightcontroller.core.module.FloodlightModuleContext;
import net.floodlightcontroller.core.module.FloodlightModuleException;
import net.floodlightcontroller.core.module.IFloodlightModule;
import net.floodlightcontroller.core.module.IFloodlightService;
import net.floodlightcontroller.core.types.NodePortTuple;
import net.floodlightcontroller.statistics.IStatisticsService;
import net.floodlightcontroller.statistics.StatisticsCollector;
import net.floodlightcontroller.statistics.SwitchPortBandwidth;
import net.floodlightcontroller.threadpool.IThreadPoolService; /**
* 带宽获取模块
* @author cq
*
*/
public class MonitorBandwidth implements IFloodlightModule, IMonitorBandwidthService { //日志工具
private static final Logger log = LoggerFactory.getLogger(StatisticsCollector.class); //Floodlight最核心的service类,其他service类需要该类提供
protected static IFloodlightProviderService floodlightProvider; //链路数据分析模块,已经由Floodlight实现了,我们只需要调用一下就可以,然后对结果稍做加工,便于我们自己使用
protected static IStatisticsService statisticsService; //Floodllight实现的线程池,当然我们也可以使用Java自带的,但推荐使用这个
private static IThreadPoolService threadPoolService; //Future类,不明白的可以百度 Java现成future,其实C++11也有这个玩意了
private static ScheduledFuture<?> portBandwidthCollector; //交换机相关的service,通过这个服务,我们可以获取所有的交换机,即DataPath
private static IOFSwitchService switchService; //存放每条俩路的带宽使用情况
private static Map<NodePortTuple,SwitchPortBandwidth> bandwidth; //搜集数据的周期
private static final int portBandwidthInterval = 4; /**
* 获取带宽使用情况,计算带宽:
* switchPortBand.getBitsPerSecondRx().getValue()/(8*1024) + switchPortBand.getBitsPerSecondTx().getValue()/(8*1024)
*/
@Override
public Map<NodePortTuple, SwitchPortBandwidth> getBandwidthMap() {
bandwidth = statisticsService.getBandwidthConsumption();
Iterator<Entry<NodePortTuple, SwitchPortBandwidth>> iter = bandwidth.entrySet().iterator();
while(iter.hasNext()) {
Entry<NodePortTuple,SwitchPortBandwidth> entry = iter.next();
NodePortTuple tuple = entry.getKey();
SwitchPortBandwidth switchPortBand = entry.getValue();
System.out.print("节点id以及端口号:" + tuple.getNodeId()+","+tuple.getPortId().getPortNumber()+",");
System.out.println("端口带宽:" + switchPortBand.getBitsPerSecondRx().getValue()/(8*1024) + switchPortBand.getBitsPerSecondTx().getValue()/(8*1024));
}
return bandwidth;
} /**
* 告诉FL,我们添加了一个模块,提供了IMonitorBandwidthService
*/
@Override
public Collection<Class<? extends IFloodlightService>> getModuleServices() {
Collection<Class<? extends IFloodlightService>> l = new ArrayList<Class<? extends IFloodlightService>>();
l.add(IMonitorBandwidthService.class);
return l;
} /**
* 我们前面声明了几个需要使用的service,在这里说明一下实现类
*/
@Override
public Map<Class<? extends IFloodlightService>, IFloodlightService> getServiceImpls() {
Map<Class<? extends IFloodlightService>, IFloodlightService> m = new HashMap<Class<? extends IFloodlightService>, IFloodlightService>();
m.put(IMonitorBandwidthService.class, this);
return m;
} /**
* 告诉FL我们依赖哪些服务,以便于加载
*/
@Override
public Collection<Class<? extends IFloodlightService>> getModuleDependencies() {
Collection<Class<? extends IFloodlightService>> l = new ArrayList<Class<? extends IFloodlightService>>();
l.add(IFloodlightProviderService.class);
l.add(IStatisticsService.class);
l.add(IOFSwitchService.class);
l.add(IThreadPoolService.class);
return l;
} /**
* 初始化这些service
*/
@Override
public void init(FloodlightModuleContext context) throws FloodlightModuleException {
floodlightProvider = context.getServiceImpl(IFloodlightProviderService.class);
statisticsService = context.getServiceImpl(IStatisticsService.class);
switchService = context.getServiceImpl(IOFSwitchService.class);
threadPoolService = context.getServiceImpl(IThreadPoolService.class);
} /**
* 启动
*/
@Override
public void startUp(FloodlightModuleContext context) throws FloodlightModuleException {
startCollectBandwidth();
}
//自定义的开始收集数据的方法,使用了线程池,定周期的执行
private synchronized void startCollectBandwidth(){
portBandwidthCollector = threadPoolService.getScheduledExecutor().scheduleAtFixedRate(new GetBandwidthThread(), portBandwidthInterval, portBandwidthInterval, TimeUnit.SECONDS);
log.warn("Statistics collection thread(s) started");
}
//自定义的线程类,在上面的方法中实例化,并被调用
private class GetBandwidthThread extends Thread implements Runnable {
private Map<NodePortTuple,SwitchPortBandwidth> bandwidth; public Map<NodePortTuple, SwitchPortBandwidth> getBandwidth() {
return bandwidth;
} @Override
public void run() {
System.out.println("GetBandwidthThread run()....");
bandwidth =getBandwidthMap();
System.out.println("bandwidth.size():"+bandwidth.size());
}
}
}

2.IMonitorBandwidthService类:

 package net.floodlightcontroller.qos_test;

 import java.util.Map;

 import net.floodlightcontroller.core.module.IFloodlightService;
import net.floodlightcontroller.core.types.NodePortTuple;
import net.floodlightcontroller.statistics.SwitchPortBandwidth; public interface IMonitorBandwidthService extends IFloodlightService{ //带宽使用情况
public Map<NodePortTuple, SwitchPortBandwidth> getBandwidthMap();
}

在ubuntu命令行,需执行

curl -X POST http://192.168.161.1:8080//wm/statistics/config/enable/json

才能获取到带宽,结果如下所示:

前提是执行了iperf h1 h2命令后才能看到,否则带宽一直显示是0

新建module---获取带宽信息的更多相关文章

  1. tp框架获取常量信息、方法、命名空间

    获取系统常量信息: public function ShowInFo() { var_dump(get_defined_constants(true)); //如果参数为true,则分类显示 } 在这 ...

  2. C#调用WebService获取天气信息

    概述 本文使用C#开发Winform应用程序,通过调用<WebXml/>(URL:http://www.webxml.com.cn)的WebService服务WeatherWS来获取天气预 ...

  3. python基础——获取对象信息

    python基础——获取对象信息 当我们拿到一个对象的引用时,如何知道这个对象是什么类型.有哪些方法呢? 使用type() 首先,我们来判断对象类型,使用type()函数: 基本类型都可以用type( ...

  4. JavaWeb学习之Servlet(四)----ServletConfig获取配置信息、ServletContext的应用

    [声明] 欢迎转载,但请保留文章原始出处→_→ 文章来源:http://www.cnblogs.com/smyhvae/p/4140877.html [正文] 一.ServletConfig:代表当前 ...

  5. c#反射机制学习和利用反射获取类型信息

    反射(Reflection)是.NET中的重要机制,通过放射,可以在运行时获得.NET中每一个类型(包括类.结构.委托.接口和枚举等)的成员,包括方法.属性.事件,以及构造函数等.还可以获得每个成员的 ...

  6. python 获取对象信息

    当我们拿到一个对象的引用时,如何知道这个对象是什么类型.有哪些方法呢? 使用type() 首先,我们来判断对象类型,使用type()函数: 基本类型都可以用type()判断: >>> ...

  7. python获取对象信息

    获取对象信息 拿到一个变量,除了用 isinstance() 判断它是否是某种类型的实例外,还有没有别的方法获取到更多的信息呢? 例如,已有定义: class Person(object): def ...

  8. PowerShell_零基础自学课程_6_PS中获取帮助信息详解、管道、格式化输

    前些文章陆续的说了一些关于这些主题,但是讨论的都不够深入,今天我们深入的了解一下获取帮助信息.管道以及格式化输出的内容. 一.获取帮助信息 在PS中获取帮助信息,最常用的有: -? .get-comm ...

  9. c#实现Google账号登入授权(OAuth 2.0)并获取个人信息

    c#实现Google账号登入授权(OAuth 2.0)并获取个人信息   此博主要介绍通过google 账号(gmail)实现登入,授权方式OAuth2.0,下面我们开始介绍. 1.去google官网 ...

随机推荐

  1. (洛谷)P2709 小B的询问

    题目描述 小B有一个序列,包含N个1~K之间的整数.他一共有M个询问,每个询问给定一个区间[L..R],求Sigma(c(i)^2)的值,其中i的值从1到K,其中c(i)表示数字i在[L..R]中的重 ...

  2. Java设置模式

    单例模式 装饰者模式 代理模式

  3. 笔记-docker-3 使用

    笔记-docker-3 使用 1.      镜像 image是docker最重要的概念,docker运行容器前需要本地存在对应的镜像,如果没有,会尝试从默认镜像库下载. 1.1.    镜像获取 查 ...

  4. Matplotlib库介绍

    pyplot的plot()函数 pyplot的中文显示 pyplot的文本显示 pyplot的子绘图区域

  5. Hive环境搭建及基本操作

    伪分布式 一.安装及配置Hive 1.配置HADOOP_HOME和Hive conf 目录hive-env.sh # Set HADOOP_HOME to point to a specific ha ...

  6. 世界未解之谜之----------Android Gradle

    今天运行项目,运行的debug出来的包竟然是命名过的,但是我的buildTypes里面的debug 并没有执行重命名操作.很奇怪,我的猜测是: 执行buildTypes的时候,虽然是assermdeb ...

  7. atomic integer 实现

    public final int getAndAddInt(Object o, long offset, int delta) { int v; do { v = getIntVolatile(o, ...

  8. 《Cracking the Coding Interview》——第6章:智力题——题目3

    2014-03-20 00:48 题目:有3升的瓶子和5升的瓶子,只允许倒满.倒到满为止.或是泼光三种操作,怎么搞出4升水呢? 解法:如果A和B是互质的两个正整数,且A<B,令X=B-A,则(X ...

  9. global js库

    var GLOBAL = {}; GLOBAL.namespace = function(str) { var arr = str.split("."), o = GLOBAL,i ...

  10. 你的第一个自动化测试:Appium 自动化测试

    前言: 这是让你掌握 App 自动化的文章 一.前期准备 本文版权归作者和博客园共有,原创作者:http://www.cnblogs.com/BenLam,未经作者同意必须在文章页面给出原文连接. 1 ...