两天内尝试了n种方法,分别在windows和ubuntu下安装了2.27 2.29 2.35ns2,之后又在各个版本ns2上安装了mit和mannaSim的leach,纯手工编译和修改历史遗留bug,真是生命不息折腾不止呀!
刚开始同时安装这么多种方法是抱着侥幸心理希望在各个环境下安装各种版本,并行的安装,看哪种成功了就用哪种,最后造成的结果是全都有bug,make比较耗费时间,于是就边修A的bug边重新make B了,也不知道哪个版本先成功,结果是修bug成功上瘾了。。。积累了一些经验分享分享吧,以免其他同学走弯路了。
方法一:
1.安装cygwin
选择这些包安装:
gcc
gcc-g++
gnuplot
make
patch
perl
tar
X-startup-scripts
xorg-x11-base
xorg-x11-bin
xorg-x11-devel
xorg-x11-bin-dlls
xorg-x11-bin-lndir
xorg-x11-etc
xorg-x11-fenc
xorg-x11-fnts
xorg-x11-libs-data
xorg-x11-xwin
2.在这个地方下载http://www.mannasim.dcc.ufmg.br/download.htm
3.按照上面网页的步骤来就ok了,就是中间会遇到一些问题。
如:list和vector的头文件把h去掉。||构造函数的调用不用加前面的类限制。||大端小端定义不用#ifndef和#endif,注释掉。
之后make clean ,重新make。
重新make是需要很多时间,但是如果不重新make的话,编译完执行链接就会提示offset不对了。所以不要总是懒省事。。。
4.这个时候设置好ns的环境变量。在.bashrc文件里添加相应的内容。
export NS_HOME="/home/Administrator/ns-allinone-2.29"
export PATH="$NS_HOME/nam-1.11:$NS_HOME/ns-2.29:$NS_HOME/tcl8.4.11/unix:$NS_HOME/tk8.4.11/unix:$NS_HOME/bin:$PATH"
export LD_LIBRARY_PATH="$NS_HOME/tcl8.4.11/unix:$NS_HOME/tk8.4.11/unix:$NS_HOME/otcl-1.11:$NS_HOME/lib:$LD_LIBRARY_PATH"
export TCL_LIBRARY="$NS_HOME/tcl8.4.11/library"
5.安装好了之后,命令行输入ns是有反应的。
ns test.tcl试一下,看test.tcl同目录下是否有tr文件生成,这个trace就是脚本执行后得到的数据了,用awk分析和计算得到你需要的数据,最后用gnuplot画图。
这种办法修改的内容不多,相对来说较容易安装。如果你debug经验少,建议安装这种。
=============================================================
方法二:安装mit版的leach在2.29上
按照mit官方的说明配置makefile文件。
安装的过程中会遇到各种各样的问题,究其原因就是mit版的leach内容太少了,如果不在2.27上安装建议不要按照步骤来覆盖那么多文件,因为虽然按照我一下的步骤可以顺利make出ns,但是因为根据diff显示函数少了好多,之后扩展或者什么的一定会遇到好多问题。因为骑虎难下,所以我还是硬着头皮修了n个bug成功安装了leach。
问题集锦:
(1)list和vector的问题
把h去掉。
(2)pt_xcp的问题
ns-2.9commompacket.h 文件中,
enum packet_t下添加 PT_XCP,接着在p_info()里添加name_[PT_XCP]="xcp";
(3)channel.cc文件中 WirelessPhy *wifp = (WirelessPhy *)tifp;之后加入:
distCST_ = wifp->getDist(wifp->getCSThresh(), wifp->getPt(), 1.0, 1.0,highestZ , highestZ, wifp->getL(),wifp->getLambda());
ns-2.29mac下面的wireless-phy.h文件中 WirelessPhy()下添加double getDist(double Pr, double Pt, double Gt, double Gr,double hr, double ht, double L, double lambda);
然后在wireless-phy.cc的最后添加double WirelessPhy::getDist(double Pr, double Pt, double Gt, double Gr,double hr, double ht, double L, double lambda)
{
if (propagation_) {
return propagation_->getDist(Pr, Pt, Gt, Gr, hr, ht, L,lambda);
}
return 0;
}
(4)mac/mac-802_11.cc:txRate没有定义?
在packet.h中inline int& fecsize() {return fecsize_; } 之后加入:
// start of 80211MultiRate --------------------------
double txRate_; // packet transmission rate over wireless channel
inline double& txRate() { return(txRate_); }
// end of 80211MultiRate ----------------------------
(5)mac/mac-802_11.cc:DROP_MAC_COLLISION
在cmu-trace.h文件中#define DROP_MAC_COLLISION "COL"之后加入
// BUGFIX UKA: capture
// packet drop in case of a packet capture
#define DROP_MAC_CAPTURE "CAP"
// BUGFIX UKA END: capture
(6)mac/mac-tdma.cc:node_sleep没有定义(说明leach函数少了好多呀,从原来的ns里找到函数,复制过来)
wireless-phy.cc里添加这两个函数。
同时在wireless-phy.h文件中void node_off(); 之后加入 void node_wakeup(); void node_sleep() ;
(7)comm/mobilenode.cc:POSITION_UPDATE_INTERVAL没有定义
mobilenode.h中加入#define POSITION_UPDATE_INTERVAL 30.0
(8)mac/wireless-phy.cc中SLEEP、P_sleep_、P_transition_ 、T_transition_ 及没有定义:
在wireless-phy.h中修改enum ChannelStatus {SLEEP, IDLE, RECV, SEND };
在double P_idle_; 之后加入 double P_sleep_ ; double P_transition_;
double T_transition_ ;
(8)satellite/sat-hdlc.h:'HDR_HDLC'没有定义?
在packet.h中加入
#define HDR_HDLC(p) ((hdr_hdlc*)hdr_ll::access(p))
enum packet_t 中加入PT_HDLC
class p_info {public:中加入name_[PT_HDLC]="HDLC";
(9)大端小端的问题
注释掉#ifndef和#endif。
看吧,改了n个bug。如果你的版本和我不同,也许还会有别的bug。不过我总结了一下根据提示来改不是这缺失了,就是大小写和原来版本不一致了,比如有个很小的bug我没写上就是min函数应该改成MIN函数。。。还有个是前面加了个NM_的常量。就是改了个写法或者少了个函数或者定义的,不难改,就是每次编译都好久,烦躁!
这个时候基本按照完成了。
设置环境变量在/home/yourname文件夹下打开.bashrc文件,在最后添加如下内容:
【ns和nam等工具的环境变量】
export NS_HOME=/mit/ns-allinone-2.29
export PATH=$NS_HOME/nam-1.11:$NS_HOME/tcl8.4.11/unix:$NS_HOME/tk8.4.11/unix:$NS_HOME/bin:$PATH
export LD_LIBRARY_PATH=$NS_HOME/tcl8.4.11/unix:$NS_HOME/tk8.4.11/unix:$NS_HOME/otcl-1.11:$NS_HOME/lib:$LD_LIBRARY_PATH
export TCL_LIBRARY=$NS_HOME/tcl8.4.11/library
【leach库】
export RCA_LIBRARY=$NS_HOME/ns-2.29/mit/rca
export uAMPS_LIBRARY=$NS_HOME/ns-2.29/mit/uAMPS
source ~/.bashrc刷新一下环境变量,立即生效。免得下面出各种各样环境设置的问题找不到解决方法。
这个时候在ns目录下运行:
./test
可能会提示找不到leach-test文件。
修改test文件如下顺序:
cd ../../
./leach_test
就是把5、6两行的位置调换一下即可。
最后有一个运行leach的实例,不过这个实例少了些东西,现在补充一下:
1.在cd到mit/uAMPS/sims文件夹下,里面有一个名为genscen文件,该文件是用来生成节点的场景文件。c运行ns genscen便可以生成一个new100nodes.txt文件。这个txt文件里是随机生成的100个节点的位置信息。
2.cd到ns-2.27文件夹下。编写脚本,给脚本随便一个名字,比如zz,脚本内容如下:
#!/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 \
各个选项的作用可以见附件1的8~10页。
在命令行下输入: chmod 777 zz 回车
然后 ./zz回车就能运行了
注意:这里如果直接去目录下执行wireless.tcl一定会报错,因为路径是相对路径,所以从ns**目录下执行较好,不然修改一下脚本。
运行需要一段时间,如果开始滚屏说明你的安装正确了,congratulations!实验数据分析见下一篇文章!
这种方法如果是在2.27上安装也许不会想我这么复杂,不过很奇怪的是2.27在ubuntu和window下都从未成功安装过,cygwin需要的XFree86都下载不到,对X11和Xorg还不识别,我的版本的diff也检测不到,可能是版本太老了,sourceForge上可供下载的最旧版ns2-2.29都已经是06年的产品了。
不过用这种方法的人很多,教程也多一点。而且调试bug有了强迫症,总想最终make通过。。。
=================================================================
方法三:Ubuntu安装
首先参照我上篇文章来配置ubuntu gcc
1.安装这些包
sudo apt-get install libx11-dev kde-devel libxmu-dev tk8.4-dev xgraph tcl perl
2.解压ns2到一个目录下
tar -xzvf ns.......
3.安装ns2
./install
如果顺利安装,添加leach时修改bug的方法参考上面。
如果连ns2都安装不了,奉劝你检查一下是不是依赖的包没有安装,如果都安装了还是不行就换个ns2版本吧。
续:
此事未完,到了这里还需要验证一下nam是否可用。
$ nam:
[code omitted because of length]
: no event type or button # or keysym
while executing
"bind Listbox <MouseWheel> {
%W yview scroll [expr {- (%D / 120) * 4}] units
}"
invoked from within
"if {[string equal [tk windowingsystem] "classic"]
|| [string equal [tk windowingsystem] "aqua"]} {
bind Listbox <MouseWheel> {
%W yview scroll [expr {..."
如果报错如上所示。
需要打个补丁。手动修改亦可:
找到tk8.4.11/generic/tkBind.c这个文件(tk别的版本也有这种和nam不兼容的问题。)
588行左右,修改如下:
/* ColormapNotify */COLORMAP,
/* ClientMessage */ 0,
/* MappingNotify */ 0,
+#ifdef GenericEvent
+ /* GenericEvent */ 0,
+#endif
/* VirtualEvent */ VIRTUAL,
/* Activate */ ACTIVATE,
/* Deactivate */ ACTIVATE,
高亮部分是需要添加上的内容。
之后只重新编译ns是不行的,需要再整个目录下./install
或者采用这种方法
自动打补丁的patch如下:(自己新建一个tk.patch放在ns-all-in-one目录下)
--- tk8.4.11-orig/generic/tkBind.c2006-07-21 08:26:54.000000000 +0200
+++ tk8.4.11/generic/tkBind.c 2008-07-05 12:17:10.000000000 +0200
@@ -586,6 +586,9 @@
/* ColormapNotify */ COLORMAP,
/* ClientMessage */ 0,
/* MappingNotify */ 0,
+#ifdef GenericEvent
+ /* GenericEvent */ 0,
+#endif
/* VirtualEvent */ VIRTUAL,
/* Activate */ ACTIVATE,
/* Deactivate */ ACTIVATE,
版本号修改成自己的。
在同级目录下执行命令:
$patch -p0<tk.patch
执行成功后重新编译。
以上两种方法复杂度差不多,自己选择吧。
之后再修改ns的Makefile文件,因为install的时候已经发生变化,好复杂@@