首页 > 代码库 > 6、ns-3数据跟踪

6、ns-3数据跟踪

两类跟踪技术:一类是直接将执行过程显示在命令行中,有助于调试仿真脚本,ns-3用Logging系统。另一类是更为常用的将采集到的数据直接存放在一个文件中,以便后期的处理与分析,ns-3使用的是Tracing系统。

1、Logging系统

v 有7个等级,有低到高,高的包含低的消息:

LOG_ERROR——记录错误信息

LOG_WARN——记录警告信息

LOG_DEBUG——记录一些调试信息

LOG_INFO——记录一些程序相关的信息

LOG_FUNCTION——当有函数被调用时,该调用信息就被记录

LOG_LOGIC——对于整体逻辑的描述

LOG_ALL——包含上述的所有信息

LOG_TYPE和LOG_LEVEL_TYPE功能一样。

v 通过cc文件程序里面添加记录信息

First文件中的两个激活记录信息的语句:

LogComponentEnable ("UdpEchoClientApplication", LOG_LEVEL_INFO);

LogComponentEnable ("UdpEchoServerApplication", LOG_LEVEL_INFO);

所以会有结果:

clip_image002

v 通过环境变量修改记录系统等级

可以在编译脚本前使用export命令修改NS_LOG的值,比如针对first.cc这个例子,就可以这样做:

在终端输入:

export ‘NS_LOG=UdpEchoClientApplication=level_all:UdpEchoServerApplication=level_all‘

注意等号的右边是小写字符,和在程序中改不同。

截图:

clip_image004

然后再在终端运行

#./waf --run first

注意三点:1、要在root用户下,2、run前面是两个杆,3、运行目录在ns-3的源码目录

截图如下:

clip_image006

v 添加函数前缀

只要在脚本的语句中改为:

export ‘NS_LOG=UdpEchoClientApplication=level_all|prefix_func:UdpEchoServerApplication=level_all|prefix_func‘

如果要添加函数调用时间,那么就是添加语句

export ‘NS_LOG=UdpEchoClientApplication=level_all|prefix_func|prefix_time:UdpEchoServerApplication=level_all|prefix_func|prefix_time‘

v 自定义Logging代码

在main函数前面添加语句:

NS_LOG_COMPONENT_DEFINE ("FirstScriptExample");//这个可以自己取

在main函数开始时,注册:

LogComponentEnable ("FirstScriptExample", LOG_LEVEL_INFO);//可以用环境变量来export NS_LOG=FirstScriptExample=level_info

然后在函数里面用类似的语句来输出信息:

NS_LOG_INFO("Create Topology");

文件的语句:

NS_LOG_COMPONENT_DEFINE ("FirstScriptExample");

int

main (int argc, char *argv[])

{

Time::SetResolution (Time::NS);

LogComponentEnable ("UdpEchoClientApplication", LOG_LEVEL_INFO);

LogComponentEnable ("UdpEchoServerApplication", LOG_LEVEL_INFO);

LogComponentEnable ("FirstScriptExample", LOG_LEVEL_INFO);

NS_LOG_INFO("Create Topology");

……

}

结果截图:

clip_image008

v 命令行参数

在main函数里面可以调用函数Parse。

int

main (int argc, char *argv[])

{

……

CommandLine cmd;

cmd.Parse(argc,argv);

……

}

其中CommandLine类写着:

--PrintHelp:打印帮助信息

--PrintGroups:打印住列表

--PrintTypeIds:打印所有TypeIds

--PrintGroup=[group]:打印所有TypeIds of group

--PrintAttributes=[typeid]:打印所有属性

--PrintGlobals:打印全局列表

然后运行

./waf --run "first --PrintAttributes=ns3::PointToPointNetDevice"

可以看到属性的结果:

clip_image010

v 挂钩自己的变量

用户可以添加自己的变量,修改first.cc代码:

int

main (int argc, char *argv[])

{

……

uint32_t nPackets=1;

CommandLine cmd;

cmd.AddValue("nPackets","Number of packet to echo", nPackets);//使得变量nPackets可以在命令行修改的。参数、帮助、值

cmd.Parse(argc,argv);//一定在上面三个函数之后

……

//echoClient.SetAttribute ("MaxPackets", UintegerValue (1));

echoClient.SetAttribute ("MaxPackets", UintegerValue (nPackets));

……

}

输入./waf --run "first --PrintHelp"可以看到用户定义的参数:--nPackets: Number of packet to echo [1]

clip_image012

执行下面命令:./waf --run "first --nPackets=2"

可以看到发送两个包。

clip_image014

2、Tracing系统

该系统用于存储大量信息。包含三个基本概念:Tracing Sources、Tracing Sink以及将前面二者连接在一起的机制。下面两种是封装好的Helper类:

v ASCII Tracing

它是以ASCII格式的信息输出的。在Simulator::Run()代码前添加如下代码就可以:

AsciiTraceHelper ascii;

pointToPoint.EnableAsciiAll(ascii.CreateFileStream("myfirst.tr"));

Simulator::Run ();

v PCAP Tracing

它是以PCAP格式的信息输出的。在Simulator::Run()代码前添加如下代码就可以:

pointToPoint.EnablePcapAll("myfirst");

Simulator::Run ();