【转】Leach协议学习(2)——简单仿真测试

来源:互联网 发布:oracle sql 优化 编辑:程序博客网 时间:2024/04/29 06:34

转自:http://hi.baidu.com/jerry_916/blog/item/5d4b59550dadb7163b293577.html

 

一、怎样判断仿真是否正确
首先熟悉下leach的文档结构
1.  modification to ns2
1.1     ns/trace: cmu-trace.cc, cmu-trace.h
1.2.1  ns/tcl/mobility:  stats-clus.tcl, mte.tcl, leach.tcl, leach-c.tcl
1.2.2  ns/tcl/ex:  wireless.tcl
1.3     ns/mac:  wireless-phy.h, wireless-phy.cc, phy.h, phy.cc, mac.cc, mac-sensor.h, mac-sensor.cc, mac-sensor-timer.h, mac-sensor-timer.cc, ll.h, channel.cc
1.3    ns/common: packet.cc, packet.h
1.4    ns/apps:  app.cc, app.h
1.5    ns:  test, package-up, leach-test
2. extesnsion to ns
2.1    ns/mit/leach-sims:  conditions.txt, leach.alive, leach.data, leach.energy, leach.err, leach.out, leach.save1, leach.save2, startup energy, TDMA Schedule.time(every 20s)
2.2    ns/rca/:  resource.cc, resource.h, rcagent.cc, rcagent.h, rca-ll.cc, rca-ll.h, energy.cc, energy.h, ns-ranode.tcl
2.2.1 ns/rca/resources: ns-resource.tcl, ns-resource-manager.tcl, ns-neighbor-resource.tcl, ne-energy-resource.tcl
2.3    ns/uamps: stats.tcl, ns-stats-cluster.tcl, ns-mte.tcl, ns-leach.tcl, ns-leach-c.tcl, ns-bsapp.tcl, bsagent.cc, bsagent.h
2.3.1 ns/uamps/sims: uamps.tcl, stat-clus.tcl, nodescen, mte.tcl,leach.tcl, leach-c.tcl, genscen, 100node.txt
      仿真结束后在leach_sims文件夹下并没有我们之前熟悉的tr文件和nam 文件,如何验证是否仿真正确?其实leach协议的仿真运行过程在leach.err和leach.out文件都有详细的记录。leach.err文件记录的是仿真过程的错误信息和提示;leach.out文件记录了数据的收发、簇的变化以及节点能量消耗等信息。所以只要在leach.err文件里看 到如下信息:
INITIALIZE THE LIST xListHead
channel.cc:sendUp - Calc highestAntennaZ_ and distCST_
highestAntennaZ_ = 1.5, distCST_ = 222.8
SORTING LISTS ...DONE!


而leach.out文件里如下记录的话(只贴出文件开头部分), 则说明leach协议运行正确。
num_nodes is set 101
Creating sensor nodes...
0 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 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 (100 == BS)
*** NOTE: no connection pattern specified.
Loading scenario file...
Node 0: (65.745973803916002,92.581722416254564)
Node 1: (21.008649990432268,92.380389195112684)
Node 2: (37.201202259027028,40.606367467253641)
Node 3: (71.218022131928251,61.297971318148988)
Node 4: (35.003944130150579,11.288995440718249)
Node 5: (34.146372151629237,98.076752432657756)
Node 6: (75.978135678906995,64.526355389750734)
Node 7: (94.45503554048716,5.7823289678349754)
Node 8: (83.602962402441989,14.98909784247591)
Node 9: (21.767438492629417,45.338745622587737)
Node 10: (8.2976788321033492,59.088131160982016)
Node 11: (94.220422624713009,62.643053551503947)
Node 12: (41.80104012684945,50.081411958710021)
Node 13: (18.290790039250062,13.30818967582108)
Node 14: (70.743881524886874,92.416788773805266)
Node 15: (48.968921345178465,20.661048414493468)
Node 16: (50.240702391714187,95.485097540302704)
Node 17: (18.034359867700545,3.486296443029445)
Node 18: (94.184317995879951,55.832556754272687)
Node 19: (77.781369061107455,71.469810032970187)
Node 20: (93.097224129874832,85.045950806255433)
Node 21: (67.295200735002382,30.438753185066748)
Node 22: (84.124781416787201,85.201271942444734)
Node 23: (77.777536668711122,7.0587910278974055)
Node 24: (37.10080587170124,53.244285682795699)
Node 25: (76.709470747369096,56.074851032381346)
Node 26: (50.021301233219582,8.0098267216281158)
Node 27: (21.157710403743067,97.638755709695985)
Node 28: (14.567212860364101,31.146544139434834)
Node 29: (79.967351481303268,11.276346264070062)
Node 30: (21.551660225517892,18.753410279170335)
Node 31: (88.566562015827074,38.207800005659372)
Node 32: (58.494695116996155,20.340831354419155)
Node 33: (68.352573722765115,1.7065585133184484)
Node 34: (82.128933343165059,40.982698575119812)
Node 35: (96.214952038701142,84.698914449987427)
Node 36: (34.655160938694685,49.28989664152725)
Node 37: (15.292854148565258,26.999674936290681)
Node 38: (83.536654237442022,0.54776868808445001)
Node 39: (6.3483406353501328,96.561058329679554)
Node 40: (1.7073469244443564,95.37975913629856)
Node 41: (47.611803769884546,11.585960449458081)
Node 42: (25.23727404197551,62.864823482402052)
Node 43: (69.088268731296182,66.532566895025113)
Node 44: (12.85180468710689,0.28137620551575732)
Node 45: (29.089886103332923,13.7157387164029)
Node 46: (20.420606583552718,9.134849770523072)
Node 47: (29.42009318127301,63.506097655513372)
Node 48: (46.98329621319813,48.259455220894637)
Node 49: (96.663897576119709,30.126561843849046)
Node 50: (37.124909570964476,58.355159199962003)
Node 51: (75.160673761349486,25.443907000796827)
Node 52: (35.744962392256113,65.582926648474725)
Node 53: (52.248180914785806,35.176634804893581)
Node 54: (13.701165846409818,75.494380609828227)
Node 55: (34.054909382972362,60.861999616428278)
Node 56: (7.6275533100718409,96.288482377439962)
Node 57: (20.523317633440399,35.399465232807891)
Node 58: (58.812167802272441,56.104252792943385)
Node 59: (44.176690999500771,77.645628609529524)
Node 60: (90.080040362700842,75.238375912997114)
Node 61: (31.383969742517902,70.379462498416885)
Node 62: (67.626210892398944,93.726468548982623)
Node 63: (60.756902750933961,41.264534947119898)
Node 64: (33.038856244198442,84.056896243270913)
Node 65: (44.255160654082502,96.485113164635891)
Node 66: (25.296958035462051,65.973702010686381)
Node 67: (20.00969360582982,2.9204331817666223)
Node 68: (83.720485951621313,90.207388899385649)
Node 69: (15.585231974527813,40.993795888961202)
Node 70: (82.727505770850698,1.1894906876559792)
Node 71: (91.769987434041681,78.17880393852424)
Node 72: (51.15779477691175,9.0568155558113084)
Node 73: (17.899046520655531,29.27487265750527)
Node 74: (22.784754691079613,43.372092975011142)
Node 75: (54.766631012208123,62.767422181911492)
Node 76: (32.064611386537841,9.9235735414193815)
Node 77: (85.500510635553155,7.082251742054825)
Node 78: (31.405028715452659,24.317620612828815)
Node 79: (6.2496398139044826,37.69635229264216)
Node 80: (62.592982436806423,0.25581540551773058)
Node 81: (99.489520536497949,20.371656920933937)
Node 82: (86.437870136666049,61.283386946322118)
Node 83: (89.884406835718266,87.225687916961363)
Node 84: (2.1368203694637962,13.539949578018836)
Node 85: (65.932557762569076,28.498315498464887)
Node 86: (71.188582699368055,66.509428278780277)
Node 87: (23.961081460100171,13.896099903572399)
Node 88: (51.751079341280779,80.390488906013999)
Node 89: (22.947043377415763,70.958044226727466)
Node 90: (91.849318608571465,11.497854260493934)
Node 91: (44.436556121537727,45.198734684474182)
Node 92: (55.133841957493615,34.481779595130021)
Node 93: (35.269655350255618,77.097471746195794)
Node 94: (77.207638312693518,28.777121439938025)
Node 95: (57.080041038375363,44.249731974792546)
Node 96: (5.2453003382521217,57.762785003410087)
Node 97: (19.127552313323857,76.771730034040161)
Node 98: (2.466682112993059,57.526273074339272)
Node 99: (44.071560420129238,10.71598111219517)
Max Distance for this Simulation is 139.0
Load complete...
Starting Simulation...
THRESH = 0.050000000000000003
0: *******************************************
THRESH = 0.050000000000000003
1: *******************************************
THRESH = 0.050000000000000003
2: *******************************************
THRESH = 0.050000000000000003
3: *******************************************
THRESH = 0.050000000000000003


这时,打开/mit/leach_sims/leach.err,也许你会看到有错误,应该是环境变量设置的问题。那么就要对环境变量进行设置,需要在.bashrc中加入环境变量 export RCA_LIBRARY=$(ns的安装目录)/mit/rca export uAMPS_LIBRARY=$(ns的安装目录)/mit/uAMPS 注意,“ns的安装目录”要改成你自己的目录。 重新运行./test,这时打开/mit/leach_sims/leach.err,也许你还会看到有错误,如:
(1)
invalid command name "Resource/Energy"
while executing
"Resource/Energy instproc setParams {args} {
$self instvar energyLevel_ alarmLevel_
set energyLevel_ [lindex $args 0]
set alarmLevel_ [lind..."
(file "mit/rca/resources/ns-energy-resource.tcl" line 11)
solution:重装即可。
(2)invalid command name "leach-create-mobile-node" (file "tcl/ex/wireless.tcl" line 245)
solution:重装即可。
(3)couldn't read file "../lib/ns-mobilenode.tcl": no such file or directory
路径的问题,直接运行tcl/ex/目录下的wireless.tcl时 将source tcl/ lib/ ns-mobilenode.tcl改成source ../ lib/ ns-mobilenode.tcl
但你是测试leach协议 应该从ns-x.xx目录下直接运行./leach_test,这时就不用改了


二、怎么得到仿真图形?

因为leach.out文件记录了节点能量等信息,所以通过分析leach.out的数据就可以得到想要的图形。举个例子,要得到leach协议中节点能量耗尽的变化曲线图,把leach.out中每隔10秒的生存节点数目用gnuplot工具画出来就可以了。总之,要等到某个参数的曲线,从leach.out中找到相应的参数记录信息,再画出来就可以了。

一个运行
leach的实例,简单介绍下:

1. 随机生成100个节点的位置信息

$ cd

$ cd ns-allinone-2.27/ns-2.27/mit/uAMPS/sims

//genscen文件是用来生成节点的场景文件,运行ns genscen便可以生成一个new100nodes.txt文件,这个txt文件就是随机生成的100个节点的位置信息。

$ ns genscen

2. 编写脚本leach_test3

$ cd

$ cd ns-allinone-2.27/ns-2.27

$ vi leach_test3

 

leach_test3

#!/bin/bash
ns tcl/ex/wireless.tcl /      
-sc mit/uAMPS/sims/nodescen /  
-rp leach /
-x 1000 /
-y 1000 /
-nn 101 /
-stop 500 /
-eq_energy 1 /
-init_energy 2 /
-filename wireless /
-dirname mit/uAMPS/sims /
-topo mit/uAMPS/sims/new100nodes.txt /
-num_clusters 5 /
-bs_x 0 /
-bs_y 0 /

“/”其实是连接符号,在一行写不下的时候或为了结构清晰而使用。

 

$ chmod 777 leach_test3

$ ./leach_test3 //模拟

 

3. 分析结果

结果文档同样在mit/uAMPS/sims文件夹下,分别为:

wireless.alive

wireless.energy

wireless.data

wireless.alive第一行是运行时间,第二行就节点ID,第三行是如果是1,表示该节点还存活,如果是0,则表示节点死亡。wireless.energy和wireless.data也是同样的结构。

 

接着用awk编写脚本提取自己需要的信息

 

leach协议剩余节点和时间关系的awk脚本leach.awk

BEGIN {

countcyl=0;
totalleft=0;

lasttime=0;
time[0]=0;
node=0;
total[0]=100;
}
{

simtime              = $1;
nodeid               = $2;
statenode            = $3;

if (simtime>lasttime ) {
countcyl++;
lasttime=simtime;
time[countcyl]=simtime;
totalleft=0;
}

if (statenode==1)
totalleft++;
total[countcyl]=totalleft;
}
END {
for(i=0;i<=countcyl;i++)
printf ( "%f %d/n",time
[i],total[i]
);
}

$ awk –f leach.awk leach.alive > live.txt

$ startxwin.bat

$ cd ns-allinone-2.27/ns-2.27/mit/uAMPS/sims

$ gnuplot //gnuplot画图

$ plot 'live.txt' with linespoints

 

4. leachleach-c仿真

Leach协议簇头应用层收到簇内节点数据的处理函数
Application/LEACH instproc recvDATA {msg} {
global ns_ opt #声明全局变量  
$self instvar TDMAschedule_ receivedFrom_ dataReceived_ #声明类成员变量

set chID [$self nodeID] #将chID赋值为本节点ID
set nodeID [lindex $msg 0] #将nodeID赋值为发送数据的节点ID
pp "CH $chID received data ($msg) from $nodeID at [$ns_ now]" #输出信息
set receivedFrom_ [lappend receivedFrom_ $nodeID] #将发送数据的节点ID添加到receivedFrom_变量中

set last_node [expr [llength $TDMAschedule_] - 1]#取TDMAschedule_中最后一个节点的索引
if {$chID == [lindex $TDMAschedule_ $last_node]} {#这个地方不明白了,难道TDMAschedule_的最后一个节点还有可能是簇头节点?
set last_node [expr $last_node - 1]
}
if {$nodeID == [lindex $TDMAschedule_ $last_node]} {   #如果发送数据的节点是一帧中的最后一个节点,则簇头进行数据融合并将数据发送给基站
pp "CH $chID must now perform comp and xmit to BS."#输出信息
set num_sigs [llength $TDMAschedule_] #记录一共收到多少个数据
set compute_energy [bf $opt(sig_size) $num_sigs] #计算融合所需能量
pp "/tcompute_energy = $compute_energy" #输出信息
[$self getER] remove $compute_energy #减去消耗的能量
set receivedFrom_ [lappend receivedFrom_ $chID] 在receivedFrom_变量中加入本节点的ID,即相当于将簇头的数据加入新的数据包
set dataReceived_ $receivedFrom_
set receivedFrom_ ""

$self SendDataToBS
}
}

ns-leach.tcl

1)tcl用于编写网络拓扑、事件触发等脚本事件,c++用于处理具体的数据包等底层网络协议;
otcl的类和c++的类是一一对应的 。
2)
Helper Functions:
    getRandomNumber {llim ulim}
node {}
nodeID {}
mac {}
getX {} getY {}
getER {}
GoToSleep {}    
WakeUp {}
setCode code
checkAlive {}
3.
Cluster Head Functions:
    isClusterHead? {} {
hasbeenClusterHead? {} {
hasnotbeenClusterHead {} {
setClusterHead {} {
unsetClusterHead {} {
4) Distributed Cluster Set-up Functions:
decideClusterHead {}
findBestCluster {}
informClusterHead {}
createSchedule {}
5) Receiving Functions:
recv {args}
recvADV_CH {msg}
recvJOIN_REQ {nodeID}
recvADV_SCH {order}
recvDATA {msg}
6) Sending Functions
sendData {}
send {mac_dst link_dst type msg data_size dist code}
send_now {mac_dst link_dst type msg / data_size dist code}
SendDataToBS {}
SendMyDataToBS {}

原创粉丝点击