天天看點

leach協定在NS2.33上的安裝

轉自: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!

這樣就成功了。恭喜你!

繼續閱讀