在无线网络模拟中,借助God可以获得整个网络的一些全局性信息。在有些情况下,这些信息非常必要,比如要判断两个相邻无线节点是否在传输范围之类。
NS2对God的支持在C++空间中主要是God类,该类分别声明和实现在ns-2.30/mobile/god.h文件和ns-2.30/mobile/god.cc文件中(我使用的是ns-2.30版)。
如果在仿真脚本里使用God,需要以下几个基本设置:
- 在node-config命令的选项中要开启能量模型,如果不开启能量模型,God将认为所有的节点之间都不相邻,其他信息也无从获得,这显然不是我们想要的。
$ns_ node-config -...... /
|
- 当然前面设置好上面这些参数的值:(以下为常用的典型值)
set opt(engmodel) EnergyModel
|
- 以上设置完毕,下面创建God对象:
set god_ [create-god $opt(nn)]
|
- 上面的变量$opt(nn)是网络中节点的数量,也许要提前赋值,例如:
set opt(nn) 10
|
- 创建God对象后,C++空间的God对象也被创建,并且C++空间的God对象里的mb_node数组被分配,每个数组元素是一个MobileNode对象的指针,数组大小就是网络节点的数量大小。但现在这些指针的值都还为NULL,不指向任何MobileNode对象(MobileNode类是对应无线网络节点的类)。为了给这些指针赋值,在Tcl脚本里需要添加一些代码,具体的位置是在NS创建节点后,将这些节点与God联系起来:
for {set i 0} {$i < $opt(nn)} {incr i} {
|
- 这样这些节点对应的MobileNode对象的指针被填充到上面提到的mb_node数组中,在C++代码中可以随时随地通过God来获得当前网络的全局情况。比如判断两个节点是否邻节点,可以调用:
God::instance().IsNeighbor(i,j) //其中i,j是网络节点的地址
|