前言
事实上ns3的官方手册很全,相关书籍也是有的,官网先贴在这里:
ns-3.35_wifi-he-network.cc_ns-3网络仿真工具wifi脚本解析_wifi脚本网络拓扑_ns-3wifi6吞吐脚本关键注释_吞吐部分_基础ns-3_ns3.35-优快云博客
ns-3-model-library wifi 浅析_ns-3wifi部分解析_ns-3网络模拟器wifi部分文档分析_Part1_ns3 wifiphy物理层冲突-优快云博客
ns-3-model-library wifi 浅析_ns-3wifi部分解析_ns-3网络模拟器wifi部分文档分析_Part2_yansphy-优快云博客
不过现有的要么版本老旧,要么过于现象化,不够本质,正好我最近分析了下官方手册,在这里分享给大家——需要更加完整的内容,可以直接去官网。
Animation动画
动画是网络仿真的重要工具。虽然 ns-3 不包含默认的图形动画工具,但我们目前有两种方式来提供动画,即使用 PyViz 方法或 NetAnim 方法。PyViz 方法在 http://www.nsnam.org/wiki/PyViz 中进行了介绍。
我们将在此处简要描述 NetAnim 方法。
NetAnim
NetAnim 是一个独立的、基于 Qt5 的软件可执行文件,它使用 ns-3 模拟期间生成的跟踪文件来显示拓扑并动画化节点之间的数据包流。
此外,NetAnim 还提供了有用的功能,例如用于显示数据包元数据的表格,如下图所示
一种可视化移动节点轨迹的方法
一种显示多个节点在不同时间点的路由表的方法
将与多个节点关联的计数器显示为图表或表格的方法
一种查看数据包传输和接收事件时间线的方法
Methodology方法
在注册一个AnimationInterface anim("wireless-animation.xml"); // Mandatory的时候,会初始化StartAnimation();里面会ConnectCallbacks();,这里面有大量的connect,比如Config::ConnectFailSafe("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Mac/MacTx",MakeCallback(&AnimationInterface::WifiMacTxTrace, this));这里面的tracing sink WifiMacTxTrace在每次$ns3::WifiNetDevice/Mac/MacTx这个tracing source触发之后就给对应node 的计数器++,最后记录到anim文件里面
类 ns3::AnimationInterface 负责创建跟踪 XML 文件。AnimationInterface 使用tracing infrastructure来跟踪节点之间的数据包流。在模拟开始之前,AnimationInterface 将自身注册为 tx 和 rx 事件的 trace hook。当调度数据包进行传输或接收时,将调用 AnimationInterface 中相应的 tx 和 rx trace hooks 。调用 rx 钩子时,AnimationInterface 将知道数据包在这两个端点之间流动,并以 XML 格式将此信息与相应的 tx 和 rx 时间戳一起添加到跟踪文件中。XML 格式将在后面的部分中讨论。请务必注意,仅当调用 rx 跟踪钩子时,AnimationInterface 才会记录数据包。每个 tx 事件都必须与 rx 事件匹配。
下载 NetAnim
构建 NetAnim
构建 NetAnim 需要 Qt5(5.4 及更高版本)。要构建 NetAnim,请使用以下命令
$ cd netanim $ make clean $ qmake NetAnim.pro $ make
注意:在某些系统中,qmake 可以是 “qmake-qt5” 这应该会在同一目录中创建一个名为 “NetAnim” 的可执行文件:
$ ls -l NetAnim -rwxr-xr-x 1 john john 390395 2012-05-22 08:32 NetAnim
用法
使用 NetAnim 是一个两步过程,第 1 步:使用 ns-3 代码库中的 “ns3::AnimationInterface” 在模拟期间生成动画 XML 跟踪文件。第 2 步:使用名为 NetAnim 的基于 Qt 的离线动画器加载第 1 步中生成的 XML 跟踪文件。
第 1 步:生成 XML 动画跟踪文件
“src/netanim”下的类“AnimationInterface”使用底层 ns-3 跟踪源以 XML 格式构建带时间戳的 ASCII 文件。示例位于 src/netanim/examples 示例下:
$ ./ns3 configure -d debug --enable-examples $ ./ns3 run "dumbbell-animation"
上面将创建一个 XML 文件dumbbell-animation.xml
Mandatory
确保程序的 CMakeLists.txt 包含 “netanim” 模块。此类CMakeLists.txt的示例位于 src/netanim/examples/CMakeLists.txt。在测试程序中包含标头 [#include “ns3/netanim-module.h”],添加语句:
AnimationInterface anim("animation.xml"); // where "animation.xml" is any arbitrary filename
[对于 NS-3.13 之前的版本,您还必须使用“Anim.SetXMLOutput() 设置 XML 模式,并使用 anim。StartAnimation();]
Optional
以下是可选但有用的步骤:
// Step 1
anim.SetMobilityPollInterval(Seconds(1));
AnimationInterface 默认每 250 ms 记录一次所有节点的位置。上面的语句设置 AnimationInterface 记录所有节点位置的周期性间隔。如果预计节点移动的次数非常少,则设置较高的移动轮询间隔以避免大型 XML 文件非常有用。
// Step 2
anim.SetConstantPosition(Ptr< Node > n, double x, double y);
AnimationInterface 要求设置所有节点的位置。在 ns-3 中,这是通过设置关联的 MobilityModel 来完成的。“SetConstantPosition” 是设置静止节点的 x-y 坐标的快速方法。
// Step 3
anim.SetStartTime(Seconds(150)); and anim.SetStopTime(Seconds(150));
AnimationInterface 可以生成大型 XML 文件。上述语句限制了 AnimationInterface 执行跟踪的窗口。限制窗口有助于仅关注模拟的相关部分,并创建易于管理的小 XML 文件
// Step 4
AnimationInterface anim("animation.xml", 50000);
使用上述构造函数可确保每个动画 XML 跟踪文件只有 50000 个数据包。例如,如果 AnimationInterface 捕获了 150000 个数据包,则使用上述构造函数将捕获拆分为 3 个文件
- animation.xml - containing the packet range 1-50000
animation.xml - 包含数据包范围 1-50000 - animation.xml-1 - containing the packet range 50001-100000
animation.xml-1 - 包含数据包范围 50001-100000 - animation.xml-2 - containing the packet range 100001-150000
animation.xml-2 - 包含数据包范围 100001-150000
// Step 5
anim.EnablePacketMetadata(true);
通过上述语句,AnimationInterface 将每个数据包的元数据记录在 xml 跟踪文件中。NetAnim可以使用元数据来提供更好的统计数据和过滤,同时在数据包动画期间提供有关数据包的一些简要信息,如TCP序列号或源和目标IP地址。注意:启用此功能将导致 XML 跟踪文件变大。请不要在使用 Wimax 链接时启用此功能。
// Step 6
anim.UpdateNodeDescription(5, "Access-point");
通过上述语句,AnimationInterface 将文本 “Access-point” 分配给节点 5。
// Step 7
anim.UpdateNodeSize(6, 1.5, 1.5);
使用上述语句,AnimationInterface 将节点大小设置为按 1.5 缩放。NetAnim 会自动缩放图形视图以适应拓扑的边界。这意味着 NetAnim 可以异常地将节点的大小缩放得太高或太低。使用 AnimationInterface::UpdateNodeSize 可以覆盖 NetAnim 中的默认缩放比例,并使用自己的自定义缩放比例。
// Step 8
anim.UpdateNodeCounter(89, 7, 3.4);
看起来是用于把anim统计的某一个node里面某一个触发的触发次数(比如Node 0 的 Phy tx发生了多少次)打印到xml里面,上面的用法是直接把3.4这个值存到xml的ID 89、node7里面去。
使用上述语句,AnimationInterface 将计数器设置为 Id == 89,与 Node 7 with the value 3.4相关联。ID 为 89 的计数器是使用 AnimationInterface::AddNodeCounter 获取的。一个示例用法在 src/netanim/examples/resource-counters.cc 中。
第 2 步:在 NetAnim 中加载 XML
假设已构建 NetAnim,请使用命令 “./NetAnim” 启动 NetAnim。如果 NetAnim 不可用,请查看“构建 NetAnim”部分,打开 NetAnim 后,单击 文件打开 左上角的按钮,选择在步骤 1 中生成的 XML 文件。点击绿色的播放按钮开始动画