您的位置:首页 > 编程语言 > Go语言

NS2中GOD的使用

2016-02-25 19:55 357 查看


NS2 中 GOD

转自:http://hi.baidu.com/karashun/blog/item/994e3700d86250037aec2c70.html ,很好的一个个人博客

/article/7804528.html

我想在NS2的DSR 路由上做一些工作。他的路由发现机制, 跟AOMDV 类似, 都是通过在全网广播RREQ,目的节点dst 会返回RREQ的传播路径给src。只不过DSR限制更多一点, 比如中间节点只处理第一次到达的RREQ。

但问题是, 我想让源节点src知道全网拓扑,这一点很难保证。即便去掉处理RREQ的限制条件,RREQ也不能保证遍历了网络中所有可能的路径, 尤其是这些RREQ可能因为冲突而丢失。AOMDV 的route discovery 我想也是一样 。

比如, 在如下的简单拓扑中(4个节点的线性拓扑)

如果节点1~4的位置是(0,150, 250, 300 ) ,纵坐标相同。 则 只能发现 link1-2, 2-4.

如果节点位置是(0,150,280, 300),则能发现 1-2, 2-3, 3-4.

更严重的问题是, link(1,3)总是不能发现,即便我设置为(0,150,160,300)。这对我研究的MORE协议应该是很重要的link 。

头大之余,我依稀记得GOD好像可以记录网络中所有的节点信息和邻居信息。 但是一时找不到 介绍God 详细用法的资料。 不知道你有没有什么好的建议或者资料,如何方便地让源节点获得全网的全部拓扑图呢?

我不太想用 link state routing 的方法

二、 God 简介

(./mobile/god.h, god.cc)

GOD, called general operations director, is an object which is aware of the

whole mobile wireless network topology during the period of simulation.

在无线网络模拟中,借助God可以获得整个网络的一些全局性信息。在有些情况下,这些信息非常必要,比如要判断两个相邻无线节点是否在传输范围之类。

GOD is used to store global information about the states of the simulated mobile

wireless network, i. e. , GoD is an omniscient observer, but the global

information GOD owns should not be totally available to any nodes in the

simulation, a node can obtain its partial information when needed.

Currently, GOD is only used to store an array of the shortest number of hops

required to reach from one node to another. GOD does not calculate them

on the fly during the simulation, since it can be quite time consuming.

The information is loaded into GOD from the movement pattern file where

the lines similar to

$ns_ at 666.66 "$god_ set-dist 10 20 2"

are used to load GOD with the information that the shortest path

between node 10 and node 20 is changed to 2 hops at time 666.66.

三、 如何使用God

四、 如何使用 God

2010-08-22,修改。God 成功帮我解决了拓扑发现的问题。 在C++代码中,可以直接利用God来获得网络全局信息

4.1 God 类的基本成员和方法

NS2对God的支持在C++空间中主要是God类,该类分别声明和实现在ns-2.30/mobile/god.h文件和ns-2.30/mobile/god.cc文件中(我使用的是ns-2.30版)。

4.2 使能 GOD

4.2.1 方法一: 开启能量模型

这是普遍介绍的方法,但不知道为何我总是设置出问题。 所谓能量模型, 就是要设置节点的初始能量, 每次发送消耗的能量等等, 我想在sensor (传感器网络)中比较重要。 Mesh 中的路由器应该无关紧要。

需要开启能量模型, 主要是因为在God::IsNeighbor(int i, int j)函数中, 有一段是检查每个节点的能量是否是足够。如果不开启能量模型,God认为所有节点不相邻, 那么接下来什么工作也不能做。

如果在仿真脚本里使用God,需要以下几个基本设置:

在node-config命令的选项中要开启能量模型,如果不开启能量模型,God将认为所有的节点之间都不相邻,其他信息也无从获得,这显然不是我们想要的。

$ns_ node-config -...... \

-energyModel $opt(engmodel) \

-initialEnergy $opt(initeng) \

-txPower $opt(txPower) \

-rxPower $opt(rxPower) \

-idlePower $opt(idlePower) \

-......
当然前面设置好上面这些参数的值:(以下为常用的典型值)

set opt(engmodel) EnergyModel

set opt(initeng) 10000.0

set opt(txPower) 0.660

set opt(rxPower) 0.395

set opt(idlePower) 0.035
4.2.2 方法二: 注释掉God中中关于能量检查的代码。

我倾向于这种方法, 简单。

bool God::IsNeighbor(int i, int j) {
assert(i
//注释掉
}
vector a(mb_node[i]->X(), mb_node[i]->Y(), mb_node[i]->Z());
vector b(mb_node[j]->X(), mb_node[j]->Y(), mb_node[j]->Z());
vector d = a - b;
if (d.length() < RANGE) return true;
else return false;
}

4.3 tcl 脚本中God 的创建:

以上设置完毕,下面创建God对象:

set god_ [create-god $opt(nn)]

$god_ on

#这里还可以加一些其他设置,比如

#$god_ allow_to_stop


其中create-god $opt(nn) ,主要是对路由协议性能评价,存储了节点的总数,节点间最短路径等信息,节点MAC对象会调用God对象,因此即便不使用,也要建立此对象。
上面的变量$opt(nn)是网络中节点的数量,也许要提前赋值,例如:

创建God对象后,C++空间的God对象也被创建,并且C++空间的God对象里的mb_node数组被分配,每个数组元素是一个 MobileNode对象的指针,数组大小就是网络节点的数量大小。但现在这些指针的值都还为NULL,不指向任何MobileNode对象 (MobileNode类是对应无线网络节点的类)。为了给这些指针赋值,在Tcl脚本里需要添加一些代码,具体的位置是在NS创建节点后,将这些节点与
God联系起来:

for {set i 0} {$i < $opt(nn)} {incr i} {

set node_($i) [$ns_ node]

$node_($i) random-motion 0

$god_ new_node $node_($i)

}
这样这些节点对应的MobileNode对象的指针被填充到上面提到的mb_node数组中,在C++代码中可以随时随地通过God来获得当前网络的全局情况。

【1】比如判断两个节点是否邻节点,可以调用:

God::instance()->IsNeighbor(i,j) //其中i,j是网络节点的地址

【2】Get the number of nodes in the network ,当需要获得节点的个数时,
#include

God::instance()->nodes();

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: