为了实现leach 协议,对ns进行扩展。在ns中增加了一个事件驱动模拟器支持模拟无线传感器网络协议。这些扩展包括MAC协议,用于计算和交互的能量分配模型和leach协议的体系结构。
网络拓扑结构可以通过简单的Nodes, Links, Agents和Applications 描述。Nodes相当于网络中的终端主机, Links 是用于Nodes交互的连接器, Agent用来实现不同网络协议,是支持分组产生和丢弃的节点。Applications用来产生数据和实现不同的应用函数。一旦网络拓扑结构建立起来后,模拟通过启动节点上的Applications运行。
为了在ns中支持无线传感器网络,在ns中增加了 mobile nodes, MAC协议和信道传播模型Channel 。
Applications类的头文件用Tcl语言写的,节点中的其他函数功能用C++语言写成的。
数据包的发送过程:
Applications创建数据包(data packets),然后发送给Agent. Agent执行协议栈中运输层和网络层的功能,将数据包发送给CMUTrace,。 CMUTrace将packets的统计数据写到trace 文件,然后将packets发至Connector。Connector将数据包传送给用于数据链路处理的链路层(LL).经过一小段时间的延迟后,数据包由LL发送给Queue缓冲队列。如果是还没有传送过的数据包,Queue将以队列进行存储。然后Queue将数据包出队列,发送到MAC层。然后开始运行MAC(媒体访问控制)协议。最终,packets被发送到网络接口层(Network Interface),网络接口层将packets加上正确的传输能量,然后将packets发送到Channel. Channel将packets进行拷贝,并发往连接信道的每一个节点。
发送过程可参考如下图1
数据包的接收过程:
数据包被节点的网络接口接收,并被向上传送至MAC层,Link-Layer, Connector, CMUTrace, 和Agent 函数. Agent 对数据包进行判定,并将数据包到达的信息通知给Application.
接收过程与发送过程传输的路径相反。
使用语言gwak, 绘图工具gnuplot. 上述场景中生成的trace文件名为:trace.tr
去掉所有以N开头的行数,该行为统计数据,得到文件trace1.tr
以节点1为例,提取所有Ni等于1的节点的时间和相应能量,存入文件1.txt.
在gawk环境中,输入代码如下:
gawk ‘$9==/1/{print $3,$17}’trace1.tr >1.txt
得到统计数据如下:
0.007580973 10.000000
0.007580973 10.000000
0.007580973 10.000000
0.007605973 10.000000
2.461346376 9.963363
2.461371376 9.963363
2.461371376 9.963363
3.536372973 9.945803
3.536372973 9.945803
3.536372973 9.945803
3.536397973 9.945803
在gnuplot环境中输入:
gnuplot ‘1.txt’ using 1:2
得到的能量变化图如下图所示:
图6 节点1能量变化图
(2) 工作节点能量统计:
从trace.tr文件中提取普通节点的数据。
gawk ‘$1~/N/ { print $3,$5,&7 }’ trace.tr >n.txt //第3列代表时间,第5列代表节点ID,第7列代表能量值
gawk ‘$2!=0 { print $1,$3}’n.txt >2.txt //去掉sink节点,sink节点ID为0
再从2.txt中进行能量统计,统计时间间隔为0.5秒
gawk ‘{ if($1<0.5) sum+=$2 };
END { print sum }’ 2.txt >3.txt
gawk ‘{ if($1<1.0) sum+=$2 };
END { print sum }’ 2.txt >>3.txt
gawk ‘{ if($1<2.5) sum+=$2 };
END { print sum }’ 2.txt >>3.txt
gawk ‘{ if($1<3.0) sum+=$2 };
END { print sum }’ 2.txt >>3.txt
gawk ‘{ if($1<3.5) sum+=$2 };
END { print sum }’ 2.txt >>3.txt
gawk ‘{ if($1<4.0) sum+=$2 };
END { print sum }’ 2.txt >>3.txt
gawk ‘{ if($1<4.5) sum+=$2 };
END { print sum }’ 2.txt >>3.txt
得到 文件3.txt的统计数据如下:
0.5 3918.84
1.0 2937.01
2.5 1395.12
3.0 4700.22
3.5 5194.79
4.0 3271.12
4.5 1132.38
全网间隔时间为0.5秒工作节点能量变化图:
图7 工作节点能量变化图
3.全网所有节点能量和变化统计
在gawk环境下输入:
gawk ‘$9!=0 { print $3,$9,$17}’trace1.tr >4.txt //提取普通节点的时间,ID,能量
将以下程序写入文件1.awk
BEGIN{
FS=" "
unit=0.5;
ftime=0;
time=0;
for(i=1;i<=50;i++)
{ e[i]=10.0;
sum+=e[i];
}
printf "%f ,%f\n",time,sum;
time+=unit;
}
{
if(ftime<$1 &&$1
{ k=$2;
e[k]=$3;
}
}
END {
sum=0
for(i=1;i<=50;i++)
sum+=e[i]
printf "%f,%f\n",time,sum;
}
在awk环境下,输入
awk –f 1.awk trace1.tr >5.txt
在5.txt文件中得到的是0到0.5秒之间全网的总能量。
再不断地将每个时间间隔为0.5秒的数据写入文件5.txt(只需在文件5.txt 中不断追加统计数据)。最后可以得到0到4.5秒之间全网在每0.5秒的时间间隔内的总能量。
最后得到的5.txt统计数据如下:
0.000000 ,500.000000
0.500000,499.757217
1.000000,499.504800
1.500000,499.504800
2.000000,499.504800
2.500000,499.172733
3.000000,498.436798
3.500000,497.875816
4.000000,497.525730
4.500000,496.948944
在gnuplot环境下,输入命令:
gnuplot ‘5.txt’ using 1:2 with lp
最后得到的全网能量变化情况如下图所示:
图8 全网能量统计图
4. 生成的簇头和簇内节点统计
设置普通节点个数50,AP节点1个,仿真时间10秒,普通节点位置随机产生。生成TCL文件,运行该TCL文件将结果输出到2.tr文件中。
在gawk环境中,输入下列命令:
gawk ‘($1==”On”)&&($7==”at”){print $0}’ 2.tr >3.tr
gawk ‘BEGIN {FS=” “}; {print $10,$11,$12,$13,$14,$15,$16}’ 3.tr > 3.txt
在3.txt文件中得到以下数据:
ClusterHead 11,ClusterNode: 47
ClusterHead 23,ClusterNode: 10 28 16 35
ClusterHead 9,ClusterNode: 33 26
ClusterHead 25,ClusterNode: 49 2 19 46
ClusterHead 24,ClusterNode: 41 29 36 7 21
ClusterHead 37,ClusterNode: 8
ClusterHead 50,ClusterNode:
ClusterHead 15,ClusterNode: 6 3 48
ClusterHead 39,ClusterNode: 45 22 34 31 5
ClusterHead 18,ClusterNode: 30
ClusterHead 40,ClusterNode: 44
ClusterHead 42,ClusterNode: 32 17 14
ClusterHead 13,ClusterNode: 38 27 4 12 20
ClusterHead 43,ClusterNode: 1
5. 生成的nam图
图9 nam图