转自:http://julysaquarius.blogbus.com/logs/56634215.html
当初装leach的时候,装了好几遍,网上搜到的资料十分少,不过还是有位大侠分享的他的经验,我在他的经验基础了,再加上自己实践出的经验,写下这篇文章。
直接在2.33中安装leach的话,会把原来的相关文件给覆盖,这样2.33上新添加的的协议将不能运行。所以这种方法行不通。为了解决这个问题,既不让其覆盖我们2.33上的文件,也使得leach协议能够运行,那么这种方法就比较复杂了,需要的人工劳动多了一点。
首先我们先找个目录把mit.tar.gz文件解压开来,用 gunzip mit.tar.gz和 tar –xvf mit.tar 解压,但是不直接解压到目录/ns-allinone-2.33/ns-2.33下,而是在/ns-allinone-2.33/ns-2.33 /leach 这个目录下,其中的leacn文件夹是自己新建的。
将解压出来的文件A一一的对应我们/ns-allinone-2.33/ns-2.33目录下的文件B进行修改,将A中与B内容不同的地方,添加进B去,切记,不是完全复制,是添加进去 ,而B中多出来的内容,不要删掉。 B中没有的文件,可以直接添加的B里去。这里有个规律,leach协议新添加进去的代码都是以#ifdef MIT_uAMPS开始,#endif为结束的 。因此可以快速的进行修改。
注意一点,leach协议解压出来的文件里的tcl/mobility里有4个快捷方式,为了以后运行的方便,我们在给2.33中添加的时候,可以直接把这4个快捷方式所指的文件放进来,而不需要放快捷方式了。
需要额外修改的地方:
1、将common/packet.h 里添加的
#ifdef MIT_uAMPS
PT_RCA,
#endif
修改为:
#ifdef MIT_uAMPS
static const packet_t PT_RCA = 61;
#endif
同理,将最后一个包的值改为62。即 static packet_t PT_NTYPE = 62
2、将mac/wireless-phy.h 文件中,添加进去的
#ifdef MIT_uAMPS
EnergyResource *energy_; // Energy resource
int alive_; // 0 = dead, 1 = alive
//endif
//ifdef MIT_uAMPS_temp
double 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 = asleep
int ss_; // amount of spreading
double time_finish_rcv_; double dist_; // approx. distance to transmitter
private:
double pktEnergy(double pt, double pxcvr, int nbytes);
#endif
中的private注释掉 ,即为:
#ifdef MIT_uAMPS
EnergyResource *energy_; // Energy resource
int alive_; // 0 = dead, 1 = alive
//endif
//ifdef MIT_uAMPS_temp
double 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 = asleep
int ss_; // amount of spreading
double time_finish_rcv_; double dist_; // approx. distance to transmitter
//private:
double pktEnergy(double pt, double pxcvr, int nbytes);
#endif
3、将mac/wireless-phy.h 文件中的第150行,本来注释掉的// MobileNode * node_; 取消注释 。
4、将mac/wireless-phy.cc 文件中,int WirelessPhy::command(int argc, const char*const* argv)
这个函数里的node_ = (Node *)obj; 修改为node_ = (MobileNode *)obj;大约在添加好的2.33文件里的238行。
5、由于第4步的修改影响到了其他文件,所以我还需要将mac/wireless-phyExt.cc 里的第133行,node_ = (Node *)obj; 同样改为node_ = (MobileNode *)obj;(在int WirelessPhyExt::command(int argc, const char*const* argv)函数里)。
修改MakeFile文件,按照下面三步来进行:
(1)将DMIT_uAMPS添加到DEFINE行的最后,即为
DEFINE = -DTCP_DELAY_BIND_ALL …… -Drng_test -DMIT_uAMPS
(2)将I./mit/rca I./mit/uAMPS 添加到 INCLUDE列的后面,即为
INCLUDES = /
……
-I./diffusion3/lib/main -I./diffusion3/lib /
-I./diffusion3/lib/nr -I./diffusion3/ns /
-I./diffusion3/filter_core -I./asim/ -I./qs /
-I./mit/rca -I./mit/uAMPS /
……
(3)将代码
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 /
添加到代码gaf/gaf.o /之前
这样,文件我们就都修改完了,下面就是编译了,即需要make了。
进入到/ns-allinone-2.33/ns-2.33目录下,输入make clean
如果没有出错,输入make,这时就需要较长时间的等待了。(如果你改的文件是makefile.in,那么应该有提示说你的makefile.in文件比make文件新,需要重新configure,这时输入./configure即可。)
make成功后,我们就要测试一下我们的Leach文件是否能够运行了。
这时,直接输入./test,估计肯定会有Line3和Line5行的提示错误,要处理这个问题,只需打开test文件,将里面的代码改为:
#!/bin/bash
cd tcl/exns wireless-demo-csci694.tcl
sleep 2
cd ../../
./leach_test
即可。
重新运行,应该就会得到结果了,显示如下:
num_nodes is set 3
node-configwarning: Please use -channel as shown in tcl/ex/wireless-mitf.tcl
create-wireless-node
DSDV
INITIALIZE THE LIST xListHead
create-wireless-node
DSDV
create-wireless-node
DSDV
Loading connection pattern...
Loading scenario file...
Starting Simulation...
channel.cc:sendUp - Calc highestAntennaZ_ and distCST_
highestAntennaZ_ = 1.5, distCST_ = 550.0
SORTING LISTS ...DONE!
NS EXITING...
这时,打开/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,也许你还会看到有错误,应该是说环境变量找不到等问题。这时候说明你设置的环境变量没有起作用, 那么你可以直接修改mit/uAMPS/sims/uamps.tcl文件。
将代码
source $env(RCA_LIBRARY)/ns-ranode.tcl
source $env(uAMPS_LIBRARY)/ns-bsapp.tcl
source $env(uAMPS_LIBRARY)/extras.tcl
source $env(uAMPS_LIBRARY)/stats.tcl
#Uncomment these lines to use gdb to debug the c code
#source mit/uAMPS/ns-bsapp.tcl
#source mit/uAMPS/extras.tcl
#source mit/uAMPS/stats.tcl
source $env(RCA_LIBRARY)/resources/ns-resource-manager.tcl
source $env(RCA_LIBRARY)/resources/ns-energy-resource.tcl
source $env(RCA_LIBRARY)/resources/ns-neighbor-resource.tcl
修改成代码
source mit/rca/ns-ranode.tcl
source mit/uAMPS/ns-bsapp.tcl
source mit/uAMPS/extras.tcl
source mit/uAMPS/stats.tc
lsource mit/rca/resources/ns-resource-manager.tcl
source mit/rca/resources/ns-energy-resource.tcl
source mit/rca/resources/ns-neighbor-resource.tcl即可。
这时再运行./test应该没有问题了,反正我的安装是没有问题了。
再次打开leach.err文件,里面出现代码:
INITIALIZE THE LIST xListHead
SORTING LISTS ...DONE!
这样就成功了。恭喜你!