5.13. 在代码中增加logging
首先在first.cc这个code中,我们一开始(在main函数之前)就已经定义了一个logging component,即:
NS_LOG_COMPONENT_DEFINE("FirstScriptExample");
我们可以通过设定NS_LOG environment variable不同层次来记录信息。
现在我们来修改一下logging component
1) 打开 scratch/myfirst.cc实际上此时我们运行看不到有什么变化,那是因为相关的logging
在终端中输入命令:gedit scratch/myfirst.cc2) 添加
NS_LOG_INFO(“creating Topology");到命令:
NodeContainer nodes;nodes.Create (2);之前
3) ./waf
export NS_LOG= //这一步是清除之前设定的NS_LOG变量./waf --run scratch/myfirst
component(FirstScriptExample)还没有被激活。为了激活它,在运行前
在终端中输入:
export NS_LOG=FirstScriptExample=info
//因为在代码中设定的level是info所以此处想要显示,这里的level必须要大于等于info
再次运行脚本文件,就能看到我们刚才在code中加入的信息就能显示在屏幕上
5.2使用命令行参数
5.2.1 覆盖默认属性
另一种不用编辑和重新build就能更改NS-3脚本文件的方法
1.
1) 在脚本文件中要实现加入命令行解析器(command line parser)
这两行简单的命令激活了ns-3 global variable and Atrribute system
2) Build 然后运行
这个命令会命令Waf运行myfirst这个脚本,并且传递命令行参数 --PrintHelp 给脚本文件双引号用来区分那个程序得到那个参数。命令行解析器会接收到--PrintHelp,然后对
它做出响应
高亮的良好没有显示,原因不明。
2. 接下来看属性系统Attribute system,比如PointToPointNetDevice的属性DataRate,Delay.
根据PrintHelp的提示,我们需要提供一个TypeId给PrintAttribute
./waf --run "scratch/myfirst --PrintAttributes=ns3::PointToPointNetDevice"
系统会显示出这个网络设备的属性,其中有一条
这里显示的都是系统的默认属性。默认属性会被我们的设定的属性覆盖。
3. 在code中删除设定属性,观察默认属性
4. ./waf
export 'NS_LOG=UdpEchoServerApplication=level_all|prefix_time
./waf --run scratch/first
之前自定义属性的时候接收到数据的时间是2.00369s
现在用默认的Dtatrate接收到数据的时间是2.25732s
5. 在命令行中修改DateRate
./waf --run "scratch/myfirst --ns3::PointToPointNetDevice::DataRate=5Mbps"
设定delay
1) 显示Delay属性
./waf --run "scratch/myfirst --PrintAttributes=ns3::PointToPointChannel"2) 我们可以同时设定多个属性
./waf --run"scratch/myfirst --ns3::PointToPointNetDevice::DataRate=5Mbps --ns3::PointTopointChannel::Delay=2ms"
设定 MaxPackets
1) 将代码中设定MaxPackets的语句变成注释(如过代码中已经设定了属性,命令行是无法覆盖的)
2) ./waf //rebuild the script3) ./waf --run"scratch/myfirst --ns3::PointToPointNetDevice::DataRate=5Mbps --ns3::PointTopointChannel::Delay=2ms --ns3::UdpEchoClient::MaxPackets=2"
5.2.2关联自定义值
你可以增加你自己的hooks到命令行系统。通过对命令行解析器(command line parser)使用AddValue method. 我们可以用这个功能实现另一种设定pakets值的方法。
1. 增加一个变量nPackets在main函数中,初始化为1
调用AddValue
2. 找到设定MaxPackets属性的命令,将其改为
这是如果你在用 --PrintHelp 你会看到新增加的user argument
3. ./waf --run "scratch/myfirst--nPackets=2"
现在,code中的设定的属性就可以被命令行参数覆盖了
结论: 我们可以用命令行参数系统来控制全局变量和属性。
5.3使用追踪系统(tracingsystem)
模拟的意义在于产生输出结果便于以后的进一步研究。
概念:tracing sources,tracing sinks
Trace sources:entities that can signal events that heppen in a simulation and
Provide access tointeresting underlying data.
Trace sinks: areconsumers of the events and data provided by the trace sources
1. ASCII Tracing
1). 在code中添加
添加到Simulator::Run()之前
第一行用一个 helper object创建 ASCII traces
第二行,括号里创建一个文件"myfirst.rt"并把它传递给NS3
括号外,EnalbeAsciiAll()告诉helper你想要激活所有point-to-point
的ASCII tracing, 你想要trace sinks以ASCII format 输出packet movement的信息
2). ./waf --run scratch/myfirst
3). 当你运行这个程序的时候,一个文件"myfirst.tr"已经被创建
并保存在local diractory
可以用 --cwd 来告诉Waf保存目录
解析 Ascii Traces
打开myfirst.tr,文件中的每一行代表了一个trace event
我们在transmit queue上追踪事件
Transmit queue is aqueue thorugh which every packet destined
For apoint-to-point channel must pass
每一行以一个单个字符开头
现在将一个事件分成几行来解析
00 代表operation, 加号对应 enqueue operation on transmit queue
01 simulation timein seconds
02 表明这个事件是从哪里开始的。 NodeList代表管理NS-3 core code的 container,
它包含了所有在这个脚本中创建的nodes。 /NodeList/0 代表第0个node
ns3::PointToPointNetDevice表明在第0个node中有什么设备
TxQueue/Enque对应00行的加号
03-04 表明packet被封装在point-to-point 协议中
05-06 表明这个packet的header,它起源于IP10.1.1.1, 目的地是10.1.1.2
08-09 表明这个packet有一个UDP header
10表明the payload isexpected 1024 bytes
第三行表明packet被有网络设备的node (echo server)所接收
02 trace sourcenamespace entry已经改变,表明这个事件起源于node 1
以及trace source 接收的packet(/MacRx)
2. PCAP Tracing
NS-3 device helpers也可以以 .pcap的形式生成trace files。
Pcap 代表packet capture
最流行的程序:Wireshark
这里使用的分析程序是tcpdump
i. 激活pcap tracing
pointToPoint.EnablePcapAll("myfirst");
注意,括号内不需要拓展名
将这行代码写入脚本文件中
生成的文件会以前缀,node number, devicenumber 和 , .pcap组成
会有两个文件生成"myfirst-0-0.pcap"和"myfirst-1-0.pcap"
ii. ./waf --run scratch/myfirst
生成的文件会在当前的操作目录下
iii. 用tcpdum读取输出文件
iv. 用Wireshark读取输出文件