ns-3中的数据跟踪与采集——Tracing系统综述及fourth脚本

ns-3的跟踪与采集技术除了直接将执行过程显示在命令行中Logging系统,还有一种更为常用的将采集到的数据直接存放在一个文件中以便后期处理与分析Tracing系统

ns-3的Tracing系统大体分为3个部分:Tracing SourcesTracing Sinks,以及将Tracing Sources和Tracing Sinks关联起来的方法

Tracing Sources是一个实体,它可以用来标记仿真中发生的时间,也可以提供一个访问底层数据的方法。例如,当一个网络设备或者网卡收到一个网络分组时,Tracing Sources可以指示并提供一个途经将分组的内容传递给对该分组感兴趣的Tracing Sinks。此外,Tracing Sources还可以在感兴趣的状态发生变化时给出相应的指示。例如,TCP 网络协议模块中的拥塞窗口发生改变时,Tracing Sources会给出指示。

Tracing Sources提供信息,而Tracing Sinks消费信息。Tracing Sources本身不起任何作用,只有当它和一段有实际功能的代码相关联时才有意义,这段代码就是使用Tracing Sources提供的信息来做相关事物的。使用(或消费)Tracing Sources提供信息的实体称为Tracing Sink。

一个Tracing Sources产生的信息可以没有Tracing Sink消费,也可以有一个或者多个Tracing Sink消费。它们之间是一对多的关系。

下面通过最简单的跟踪示例 fourth.cc 来说明Tracing Sources,Tracing Sinks,以及它们之间是如何关联起来的。代码如下:

#include "ns3/object.h"
#include "ns3/uinteger.h"
#include "ns3/traced-value.h"
#include "ns3/trace-source-accessor.h"#include <iostream>using namespace ns3;

首先要定义自己的类,该类的父类为Object,因此要引入头文件 #include “ns3/object.h”。

再引入ns-3自定义的无符号整形所声明的头文件 #include “ns3/uinteger.h”。

#include "ns3/traced-value.h"头文件中引入了要跟踪数据的类型,即TracedValue。

#include "ns3/trace-source-accessor.h"头文件中包含了本程序要使用的能把自定义数据转换为Trace Sources的函数。

#include是指包含后面所跟的内容,iostream 库的基础是两种命名为 istream 和 ostream 的类型,分别表示输入流和输出流。所以#include定义的就是你要输入和输出的内容。

class MyObject : public Object
{
public:/*** Register this type.* \return The TypeId.*/static TypeId GetTypeId (void){static TypeId tid = TypeId ("MyObject").SetParent<Object> ().SetGroupName ("Tutorial").AddConstructor<MyObject> ().AddTraceSource ("MyInteger","An integer value to trace.",MakeTraceSourceAccessor (&MyObject::m_myInt),"ns3::TracedValueCallback::Int32");return tid;}MyObject () {}TracedValue<int32_t> m_myInt;//创建的成员变量为int32_t类型的TraceValue模板类//因此要在开头添加#include "ns3/uinteger.h"和#include "ns3/traced-value.h"
};

因为Tracing系统和属性系统有很大关联,而属性系统和对象相关联,所以,每一个要追踪的数据都必须属于一个特定的类,这里这个类定义为MyObject要追踪的数据为m_myInt

GetTypeId()函数定义了一个关于MyObject的元数据集,并返回标识类TypeId。
ns-3中所有由Object类派生的类都可以包含在一个叫TypeId的元数据类,该类用来记录关于类的元信息,以便在对象聚合以及构建管理中使用,TypeId 类中设计了用唯一的字符串来标识一个类、子类的基类以及子类中可以访问的构造函数。

SetParent()函数的作用是表明该类和父类的关系,避免在向上或向下类型转换时发生不必要的错误。

AddConstructor()函数的作用是在用户使用对象工厂机制时,不用考虑类的具体细节就可以创建对象。

AddTraceSource()函数的作用是提供一个“挂钩”,把自定义的名为“MyInterger”的Trace Source与系统外相关联。

MakeTraceSourceAccessor()函数的作用是使MyObject类的成员变量m_myInt成为一个可存取的Trace Sources。

void
IntTrace (int32_t oldValue, int32_t newValue)
{std::cout << "Traced " << oldValue << " to " << newValue << std::endl;
}

上述代码就是定义的回调函数,就是Tracing系统中的Trace Sink。
函数的行为就是输出Trace Source改变前后的值。

int
main (int argc, char *argv[])
{Ptr<MyObject> myObject = CreateObject<MyObject> ();myObject->TraceConnectWithoutContext ("MyInteger", MakeCallback (&IntTrace));myObject->m_myInt = 1234;
}

主函数中首先定义了一个类对象实例,这个实例中包含了一个TraceSource。

下面一个函数TraceConnectWithoutContext非常重要,它将Trace Sources和Trace Sink相关联。只要调用了这个函数,当Trace Sources数据m_myInt发生改变时,IntTrace函数才会被调用。

最后一行代码可以看作是把常量1234赋值给m_myInt,这四系统会识别这一行为,并将m_myInt赋值前和赋值后的两个值作为形参传递给Trace Sink的回调函数IntTrace。

运行这个例子的结果如下所示:

ns-3中的数据跟踪与采集——Tracing系统综述及fourth脚本相关推荐

  1. ns-3中的数据跟踪与采集——Tracing系统的配置

    ns-3中的数据跟踪与采集--Tracing系统的配置 在文章ns-3中的数据跟踪与采集--Tracing系统综述及fourth脚本中学习的函数TraceConnectWithoutContext在实 ...

  2. SAP MM学习笔记13-SAP系统中的数据种类-(1)系统数据

    SAP中有三种数据, 1,系统数据 2,配置数据(Customizing Data) 3,应用数据(Application Data) 1,系统数据 ABAP数据字典,程序集(Program Libr ...

  3. linux中对数据怎么降序,Linux系统sort排序命令怎么使用

    sort命令的功能是对文件中的各行进行排序.sort命令有许多非常实用的选项,这些选项最初是用来对数据库格式的文件内容进行各种排序操作的.那么Linux系统sort排序命令怎么使用呢?小编为大家分享了 ...

  4. 博图如何读取mysql数据_博途使用小结:从SQL中读取数据并给变量赋值

    1.建立内部变量TON_Report,VF01_Runtime,JC01_Runtime,VF05_Runtime,数据类型为Real,长度为2 2.建立查询按钮,点击查询按钮时读取SQL中的数据并赋 ...

  5. 如何创建最简单的 ABAP 数据库表,以及编码从数据库表中读取数据 (下)

    在本文的前续篇章:如何创建最简单的 ABAP 数据库表,以及编码从数据库表中读取数据 (上) 我们已经在系统里创建了两张数据库表 ZPERSON 和 ZMYORDERS, 并插入了对应的记录: 文章的 ...

  6. 重装Ubuntu时如何保留/home分区中的数据

    转自:https://www.cnblogs.com/maowang1991/p/3270441.html 重装Ubuntu时如何保留/home分区中的数据 作者:maowang Windows系统可 ...

  7. Pico示波器高速脉冲信号采集测试系统NSAT-4000

    *测试仪器:Pico示波器 *被测信号:终端高速重复信号的波形与数据的实时采集 1.系统优势 >>实现对Pico示波器多路信号同时实时采集. >>采集模块各个通道时延可进行独立 ...

  8. 前嗅教你大数据:批量采集/下载网页中的图片数据

    l 采集网站 [场景描述]采集revisionvillage网页中所有真题图片的数据. [源网站介绍]revisionvillage,国外知名IB真题网站,每道题都有视频讲解的IB数学刷题网站. [使 ...

  9. 使用kettle采集excel表格中的数据

    使用kettle采集excel表格中的数据 一.任务描述 二.任务目标 三.任务环境 四.任务分析 五. 任务实施 步骤1.环境准备 步骤2.创建Transformmations 申明: 未经许可,禁 ...

最新文章

  1. MariaDB/MySQL防止重复插入相同记录:INSERT IGNORE或者REPLACE
  2. edge新版 能够正则式_Python爬虫七 数据提取之正则
  3. OLAP与OLTP介绍
  4. MyEclipse编码设置,中文乱码解决方法,UTF-8,GBK(转)
  5. Java 正则表达式使用详解
  6. 高斯拟合原理_解读 | 得见的高斯过程
  7. 【Python】Jupyter Notebook的十大隐藏技巧--如何大大加速算法的迭代
  8. Java FilePermission暗含()方法与示例
  9. c++工程模式+配置文件+动态调用类
  10. PIM SM建立SPT树过程与实验
  11. python学习笔记之读取配置文件【转自https://my.oschina.net/u/3041656/blog/793467】
  12. charset参数 sqluldr2_利用sqluldr2导出数据和sqlldr导入数据的方法
  13. linux虚拟机简单部署以及安装可视化界面
  14. 谷歌搜索、谷歌学术、Github的镜像网站
  15. 2018 11.2 PION模拟赛
  16. 全球疫情形势动态地图展示(超帅超好玩的python动图)
  17. 如何使用ssh来连接windows
  18. 收费企业邮箱哪个好用?怎么购买外贸邮箱?企业邮箱服务有哪些呢?
  19. 社工,定位聊天对象的真实地址
  20. 开机点用户名登录显示rfc服务器不可用,rpc服务器不可用怎么办(修复RPC服务器不可用方法)...

热门文章

  1. VM3009:212 Component pages/index/index does not have a method handleClick to handle event tap.
  2. 树莓派wukong-robot智能音箱(一)-- docker安装方式实现智能语音聊天
  3. JAVA Eclipse常用快捷键
  4. php设置浏览次数,【php】集思广益,关于有效浏览次数的计算,大家都是如何来做呢?...
  5. windows下启动nginx闪退
  6. rename命令和批量重命名
  7. Lua 公历转农历算法(1921~2040)
  8. 2019湖南大学计算机考研分数线,湖南大学2019年考研分数线湖大复试过线多少分...
  9. cesium实现开场动画效果
  10. 信用卡数字识别OpenCV实现(含代码)【DataWhale项目】