NetAnim说明:它是一个独立的、基于Qt4的离线动画演示工具,在NS_3仿真过程中生成XML格式的trace文件,仿真结束后NetAnim读取该文件显示网络拓扑和节点间数据分组流(包括有线链路和无线链路)等动画过程。
一、首先安装NetAnim
在之前讲过,参照https://blog.csdn.net/wuzhiwuweisun/article/details/79493986
二、生成XML文件
1.生成XML最基本的条件:
1)wscript 文件中包含netanim模块,需要注意的是你要编译的脚本文件要和这个wsript文件在同一目录下,以wireless-animation.cc为例,目录是ns-allinone-3.27/ns-3.27/src/netanim/examples。
PS:上边的这个目录下的wireless-animation.cc是官方提供的用于NetAnim仿真的文档。我们 这里 用的 是 目录examples/tutorial/first.cc文件,并把它复制为 scratch/myfirst.cc。可能是scratch目录是waf默认编译的目录的原因吧,这里并没有wscript文件,如下图,可是我在做的时候一样生成了first.xml文件。这里后边再看看能不能整明白,暂时放在这里。
对这第一条我再补充一下。这里用到的一本书是《NS-3网络模拟器基础与应用》(下载链接:https://pan.baidu.com/s/1HgDNSfGOqWPP4m62Hn_vXg 密码:gw49)。这本书的73页详细介绍了生成XML过程,并且从6.7节详细讲了wscript的作用。这里从书里摘取了跟示例wireless-animation.cc有关的wscript说明。
打开wscript脚本文件,大致内容和上图说的功能对应,使目录下的脚本文件包含netanim模块。以后我们在改写 wscript脚本时下面的红圈里就是格式,如下:
2)在wireless-animation.cc(只是以这个为例)脚本开头添加头文件。
#include "ns3/netanim-module.h"
3)在wireless-animation.cc(只是以这个为例)脚本末尾的Simulator::Run()命令前一行添加下面的命令:
AnimationInterface anim("文件的名字.xml");
最后运行命令 sudo ./waf --run src/netanim/examples/wireless-animation
生成wireless-animation.xml
用NetAnim打开wireless-animation.xml文件,如下:
点击运行的绿色按钮:
至此使用NetAnim的最基本用法完成。
2.生成XML的可选条件:
除了以上必须满足的三个条件外,我们可以根据需要在脚本中加入以下语句:
anim.SetMobilityPollInterval (Seconds (1));
AnimationInterface默认250ms记录一次所有节点的位置。这个方法设置了AnimationInterface记录所有节点位置的时间间隔。如果节点的位置预料每次变化非常小,那么设置高流动性轮训间隔将是非常有用的。否则,将会产生非常大的xml文件。
anim.SetConstantPosition (Ptr< Node > n, double x, double y);
AnimationInterface允许设置所有节点的位置。在ns3中,该设置与MobillityModel关联。该方法是非常快捷的方式来设置一个静止的节点位置。
这个命令在wireless-animation中具体形式是:
-
anim.SetStartTime (Seconds(
150));
-
anim.SetStopTime (Seconds(
150));
上述命令是设置动画记录内容在仿真过程中的开始和结束时间。AnimationInterface会产生比较大的xml文件。上面的方法可以限制AnimationInterface记录的时间窗口。这样可以达到只关注于与仿真相关联的部分,同时产生比较小的xml文件。
AnimationInterface anim ("animation.xml", 50000);
该构造器保证产生的xml文件只记录5000个packets。例如,如果AnimationInterface抓取到了150000个packets,使用这个构造器可以产生三个文件
• animation.xml - containing the packet range 1-50000
• animation.xml-1 - containing the packet range 50001-100000
• animation.xml-2 - containing the packet range 100001-150000
anim.EnablePacketMetadata (true);
使用该方法,则AnimationInterface会在产生的xml文件中记录每一个packet的元数据。记录了元数据之后,可以使用比较简单的与每个packet相关的信息,这样就方便NetAnim提供更好的统计和过滤,例如,TCP序列号,源IP,目的地IP等。
注意:使用这样的属性,将会导致比较大的XML文件产生。不要在使用Wimax links的时候使用该属性。
anim.UpdateNodeDescription (5, "Access-point");
使用该方法,AnimationInterface将会把节点5标记为“Access-point”文字。
anim.UpdateNodeSize (6, 1.5, 1.5);
使用该方法,AnimationInterface将会把节点大小缩放为1.5倍。NetAnim会自动缩放视图以适应拓扑的边界。这意味着,NetAnim会调整太大或者太小的节点。使用该方法允许你覆盖NetAnim默认的节点的size。
anim.UpdateNodeCounter (89, 7, 3.4);
该方法说明,AnimationInterface设置节点7的值为3.4 id==89。id=89的节点必须存在,须先使用AnimationInterface::AddNodeCounter方法设置之后,才能调用UpdateNodeCounter方法。
三、在第一个示例first.cc基础上用NetAnim分析
$ cp examples/tutorial/first.cc scratch/myfirst.cc 这里我把first.cc拷贝到scratch目录下
用vim编辑器打开myfirst.cc文件并按照上边的步骤修改。
在源代码中添加头文件:
#include “ns3/netanim-module.h”
在脚本末尾的Simulator::Run();前加一句:
AnimationInterface anim(“first.xml”);
按下ESC,退出编辑模式
按下:wq保存退出。
进到目录ns-allinone-3.27/ns-3.27,编译:
sudo ./waf --run scratch/myfirst
生成first.xml文件:
在目录ns-allinone-3.27/netanim-3.108执行命令打开NetAnim:
打开刚才的first.xml文件:
运行后:
如果感觉节点的位置什么的不大合适,可以通过上边的步骤二的语句修改。比如改位置,在脚本中加入以下语句:
-
anim.SetConstantPosition(nodes.Get(
0),
10,
10)
-
anim.SetConstantPosition(nodes.Get(
1),
50,
50)
注意命令加在输出first.xml命令后:
打开重新编译过的first.xml文件,节点位置改变(有个问题,刚开始的位置和上边的位置一样,运行0.25s后才 改变位置):
运行后:
先写到这里,分析数据的话后面有时间会写。
参考的博文:
1.https://www.jianshu.com/p/9c340c63f86a
2.https://blog.csdn.net/hdliuxl/article/details/70224300
3.https://blog.csdn.net/Mary19920410/article/details/70844487