Ns2.34上leach协议的完美移植经过几天的不断实验,以及网上各位前辈的帮助,终于成功将leach协议完美移植到ns2.34上,下面是我的安装笔记。
Step1在ns-2.34的目录下新建一个leach文件夹,将leach.tar.gz放入这个文件夹Step2在终端中进入这个目录下,键入tar zxf leach.tar.gzStep3①将leach/mit整个目录复制到ns-allinone-2.34/ns-2.34中②将leach/mac目录下的, mac-sensor.h, , mac-sensor-timers.h四个文件复制到ns-allinone-2.34/ns-2.34/mac中③将leach/tcl/mobility目录下的四个文件复制到ns-allinone-2.34/ns-2.34/tcl/mobility中④将ns-allinone-2.34/ns-2.34/tcl/ex目录下的wireless.tcl重命名为wireless_1.tcl,再将leach/tcl/ex目录下的wireless.tcl复制到ns-allinone-2.34/ns-2.34/tcl/ex中⑤将leach目录下的test,leach_test,package_up三个文件复制到ns-allinone-2.34/ ns-2.34中Step3 修改文件①需要修改的文件有:ns-allinone-2.34/ns-2.34/apps/,app.hns-allinone-2.34/ns-2.34/trace/,cmu-trace.hns-allinone-2.34/ns-2.34/common/,,packet.hns-allinone-2.34/ns-2.34/mac/,ll.h,,,phy.h,wireless-phy.c c,wireless-phy.h②修改方法:对于leach目录下相应的文件(即刚才未复制的文件),将代码中以“#ifdef MIT_uAMPS”开始,并以“#endif”结束的部分复制到以上文件对应的位置这个过此要小心核对修改,否则前功尽弃③特殊情况<1> ns-allinone-2.34/ns-2.34/common/packet.h中大约185行,根据其他变量的格式将代码更改为#ifdef MIT_uAMPSstatic const packet_t PT_RCA = 61;#endif并将最后一个枚举值改为62这个过程可以随情况改变,还要注意的是packet.h文件并不是只改这一部分,前面的修改依然要。
<2> ns-allinone-2.34/ns-2.34/mac/wireless-phy.h,给类WirelessPhy添加public变量,大约105行#ifdef MIT_uAMPSMobileNode * node_;#endif或者将文件中的第150行,本来注释掉的// MobileNode * node_; 取消注释,注意这两个只能选一个对于Antenna *ant_;和Propagation *propagation_;之间的那部分代码,应将其置于public声明的最后(private之前), 即Propagation变量必须保持为public,也就是说将下面的关键字Private注释掉#ifdef MIT_uAMPSEnergyResource *energy_; // Energy resourceint alive_; // 0 = dead, 1 = alive//endif//ifdef MIT_uAMPS_tempdouble Efriss_amp_; // Xmit amp energy (J/bit/m^2)double Etwo_ray_amp_; // Xmit amp energy (J/bit/m^4)double EXcvr_; // Xcvr energy (J/bit)double Pfriss_amp_; // Friss base transmission power (W/m^2)double Ptwo_ray_amp_; // Two-ray base transmission power (W/m^4)double PXcvr_; // Xcvr Power (W)int sleep_; // 0 = awake, 1 = asleepint ss_; // amount of spreadingdouble time_finish_rcv_;double dist_; // approx. distance to transmitterprivate: //将其注释掉double pktEnergy(double pt, double pxcvr, int nbytes);#endif<3> ns-allinone-2.34/ns-2.34/mac/(大约235行), (大约132行),将代码中的node_ = (Node *)obj;改为#ifdef MIT_uAMPSnode_ = (MobileNode *)obj;#elsenode_ = (Node *)obj;#endif④修改ns-allinone-2.34/ns-2.34/mit/uAMPS/ns-leach.tcl将set dst_ $mac_dsc改为set dsc_addr $mac_dsc⑤修改ns-allinone-2.34/ns-2.34目录下的Makefile文件在DEFINE行的最后添加-DMIT_uAMPS 在INCLUDE行的中间添加-I./mit/rca -I./mit/uAMPS \在代码gaf/gaf.o \之前添加mit/rca/energy.o mit/rca/rcagent.o \mit/rca/rca-ll.o mit/rca/resource.o \mac/mac-sensor-timers.o mac/mac-sensor.o mit/uAMPS/bsagent.o \Step4这时,直接输入./test,估计肯定会有Line3和Line5行的提示错误,要处理这个问题,只需打开test文件,将里面的代码改为(注意红色部分位置):#!/bin/bashcd tcl/exns wireless-demo-csci694.tclsleep 2cd ../.././leach_test即可。
这个时候如果去输入./test测试,会出现很多警告,其实也不用担心的,协议是可以正常运行的,也可以通过如下操作消除警告:在tcl/lib下的ns_default.tcl文件第692行加入7个初始值,具体的初始值应该对照 mac 文件下的 值输入,如下所示在tcl/lib下的ns_default.tcl文件第692行加入7个初始值,具体的初始值应该对照 mac 文件下的 值输入,如下所示:Phy/WirelessPhy set alive_ 1;Phy/WirelessPhy set Efriss_amp_ 100*1e-12;Phy set Etwo_ray_amp_ 0.013*1e-12;Phy/WirelessPhy set EXcvr_ 50*1e-9;Phy/WirelessPhy set sleep_ 0;Phy/WirelessPhy set ss_ 1;Phy/WirelessPhy set dist_ 0;PS:上面的方法我是在网上查到的,但是在我这里,却不好使,甚至导致NS命令不能用了,所以我并没有添加这些值,我说过,这些警告并没有影响到leach的使用Step5 给.bashrc添加环境变量在终端键入sudo gedit .bashrc(相信装完ns2.34都懂)export RCA_LIBRARY=/安装目录/ns-allinone-2.33/ns-2.33/mit/rcaexport uAMPS_LIBRARY=/安装目录/ns-allinone-2.33/ns-2.3/mit/uAMPSStep6 测试在终端键入./test出现如下画面[root@localhost ns-2.34]# ./testnum_nodes is set 3warning: Please use -channel as shown in tcl/ex/wireless-mitf.tclINITIALIZE THE LIST xListHeadLoading connection pattern...the file:../mobility/scene/cbr-3-testLoading scenario file...Starting Simulation...:sendUp - Calc highestAntennaZ_ and distCST_highestAntennaZ_ = 1.5, distCST_ = 89771.2SORTING LISTS ...DONE!NS EXITING...这时再运行./test应该没有问题了,反正我的安装是没有问题了。
再次打开leach.err文件,里面出现代码:INITIALIZE THE LIST xListHeadSORTING LISTS ...DONE!leach.out文件大小也随时间增加,同时产生leach.alive,leach.data等文件,这样就成功了。
恭喜你,you make it。