本人也是第一次用omnetpp平台,模拟网络dsr协议,写这篇文章希望对实验代码做一些梳理和剖析。仿真网络的基础是构建网络,将节点,基站,消息,dsr网络定义好,并在初始化文件中将节点基站数量和坐标,网络半径和交流范围设置好。使用ned语言,一个特点就是模块化,便于组装和使用。初始化是写在ini文件中,节点个数过多,最好自己写个随机数生成函数自动生成节点的坐标。
节点代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
|
simple Node{
parameters:
double
tranRange;
//交流范围
double
x;
double
y;
@display
(
"p=$x,$y;i=misc/node_vs,black"
);
//坐标,图标
gates:
input in[];
//端口
output out;
}
|
这便是一个完整的节点模块,类型为simple,包含参数,门,模块和模块之间通过门进行连接。input,output可以看做是节点的端口。sink的定义代码是类似的。
DSR网络代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
network Dsr
//网络
{
parameters:
double
R;
int
node_num;
submodules:
node[node_num] : Node{
}
sink : Sink{
}
connections allowunconnected:
//允许门不连接
}
|
这是由节点和基站组成的复合模块,网络必不可少的基础设施就是节点和基站了,参数中定义了网络半径和节点数量。
在omnetpp.ini文件中将各参数初始化,运行时编译程序首先会在定义处找初始值,如果没找到则会到ini文件中查找。 这样一个基本的网络就建好了。但这网络中没有操作,没有消息,这些就是接下来需要完成的工作。在omnetpp中,定义是写在ned文件中,但具体操作是写在源文件中,为了方便使用和查看,将源文件中参数和函数声明都写在头文件中。
节点需要些什么操作呢?
节点会跟其他节点交互,需要收发消息,需要计算距离,需要根据dsr协议检查缓存,判断有无有效路径,判断收到的消息是否重复,是否是发给自己的,消息是否完整等等。但在这里我们就实现最基本的功能就好。
头文件的定义如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
|
class
Node :
public
omnetpp::cSimpleModule{
private
:
double
R;
double
x;
double
y;
double
tranRange;
int
node_num;
struct stateInfo
//存储网络拓扑信息
|