一、Trace Sources探究
以下将围绕以下几个问题进行分析:
- 怎样才能找到可以使用的跟踪源呢?
- 找到了跟踪源,在连接它时该如何找出要使用的配置路径呢?
- 找到了跟踪源和配置路径,如何确定回调函数的返回类型和形式参数呢?
1.1 如何找到可以使用的跟踪源
可以在 ns-3 API 文档中找到。ns-3: All TraceSources (nsnam.org)
third.cc中用到的ns3::MobilityModel也可以在这里找到。
1.2 配置路径
点击进入想要跟踪的Trace source(本文以ns3::MobilityModel为例) ,进入后点击第一行中的more,如下:
点击后出现如下画面
在third.cc中我们一开始使用的是ns3::RandomWalk2dMobilityModel,它属于MobilityModel的基类。正常情况下我们使用RandomWalk2dMobilityModel类的属性时需要配置的属性如下:
"/NodeList/[i]/$ns3::MobilityModel/$ns3::RandomWalk2dMobilityMode
但由于CourseChange是在父类MobilityModel中定义的跟踪源,所以无需调用子类。因此third.cc中调用路径为:
"/NodeList/[i]/$ns3::MobilityModel"
1.3 确定回调函数 Callback signature
该函数的确定也是在上述页面中,即下图中的Callback signature
点击可得:
typedef是定义类型,third.cc中为static,确保 CourseChangeCallback 函数只在本地文件中可见。官方教程中,回调函数有两个参数,上下文context与移动模型MobilityMode。
但我在文档里只看到了一个参数,没有context参数,怀疑是不是该函数修改成默认为Config::ConnectWithoutContext了,但在third.cc中又出现了context参数和MobilityModel参数,不是很明白。anyway,用两个参数也没问题,使用Config::Connect也可以直观的查看配置路径。
二、在终端查找文件的方法
find . -name '*.h' | xargs grep TracedCallback
'*.h'是你要查找文件的统一标准,xargs grep后面输入所要文件的内容,若需要多个条件,则 ' | 所需的条件'。
在终端输入上述内容,即查找有TracedCallback内容的.h文件。
三、Trace Sinks探究
在third.cc中,使用了一段 TracedValue<int32_t> 的简单代码,我们只是简单介绍了 TracedValue 的真正含义,以及如何查找回调的返回类型和形式参数。
正如之前所说,traced-value.h 文件提供了跟踪符合值语义的数据所需的声明。一般来说,值语义只意味着可以传递对象本身,而不是传递对象的地址。我们将这一要求扩展到包括全套赋值式操作符,这些操作符是为plain-old-data(POD)类型预定义的:
通过这些操作符, 可以将所做的所有更改追踪到一个具有值语义的 C++ 对象。但是具体怎么使用这些操作符,文档里并没有举例,等后续有实例后再补充。