前些日子帮老师做了个NS2仿真的小项目,现在项目做完了,写篇博客把流程记录下来。做项目时,NS2和GPSR相关的东西找了好久,总会遇到问题,希望我这篇博客能给广大同学们带来点帮助吧。
目录
NS2环境搭建
软硬件环境概述
- Windows10(x64)
- VMware Workstation Pro 12.5
- LinuxMint 18.1
- ns-allinone-2.35
环境搭建过程
首先,在官网下载ns-allinone-2.35.tar.gz压缩包(http://sourceforge.net/projects/nsnam/files/allinone/ns-allinone-2.35/ns-allinone-2.35.tar.gz/download),再下载GPSR源码,我选择的是优快云上的KeLiu版(http://download.youkuaiyun.com/download/joanna_yan/8474651)。
NS2安装
按Ctrl+Alt+T,打开终端
依次输入
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install build-essential
sudo apt-get install tcl8.5 tcl8.5-dev tk8.5 tk8.5-dev
sudo apt-get install libxmu-dev libxmu-headers
tar xvfz ns-allinone-2.35.tar.gz
cd ns-allinone-2.35
sudo ./install
在安装的时候会报个错,这是由于源码gcc版本比较老
修改只要在linkstate/ls.h文件137行
修改成
然后重新安装
如上图所示,这样就安装成功了。
然后我们需要配置环境变量,否则无法启动。
sudo gedit /home/(用户名)/.bashrc
在最后加上下面语句,用户名换成自己的即可
export PATH="$PATH:/home/(用户名)/ns-allinone-2.35/bin:/home/(用户名)/ns-allinone-2.35/tcl8.5.10/unix:/home/(用户名)/ns-allinone-2.35/tk8.5.10/unix"
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/home/(用户名)/ns-allinone-2.35/otcl-1.14:/home/(用户名)/ns-allinone-2.35/lib"
export TCL_LIBRARY="$TCL_LIBRARY:/home/(用户名)/ns-allinone-2.35/tcl8.5.10/library"
修改完毕,保存,关闭当前终端,再打开一个新的终端,输入ns,回车,如果显示一个%,就证明ns2安装成功了。
NAM安装
终端输入nam,如果能够出现nam的窗口则nam可以正常使用,如果提示nam没有安装或者是不能识别的命令,cd /home/ns-allinone-2.35/nam.1.15,ls看看是否有nam文件,如果有的话cp nam ../bin,把nam命令复制到bin中。如果没有的话,sudo ./configure,再sudo make,现在得到了nam,再把nam命令复制到bin中。 接着在终端输入nam检验是否可以运行。
开始实验
添加GPSR协议
我们搭建好了NS2仿真平台,现在就可以把我们准备好的协议源码解压,放到ns-2.35目录下,然后对ns2的代码进行修改,使我们的协议可以正常运行。
1. 进入$HOME/ns-allinone-2.30/ns-2.30/common,修改packet.h
enum packet_t{
//增加 PT_GPSR
}
class p_info {
//增加 name_[PT_GPSR]= “gpsr”
}
2. 进入$HOME/ns-allinone-2.30/ns-2.30/trace,修改 cmu-trace.cc
void CMUTrace::format(Packet* p, const char *why)
{
//增加 case PT_GPSR;
break;
}
3. 进入$HOME/ns-allinone-2.30/ns-2.30/queue,修改priqueue.cc
void PriQueue::recv(Packet *p, Handler *h)
{
//增加 case PT_GPSR:
}
4. 进入$HOME/ns-allinone-2.30/ns-2.30/tcl/lib,修改ns-packet.tcl
foreach prot{
#增加GPSR
}
5. 进入$HOME/ns-allinone-2.30/ns-2.30/ ,修改Makefile
OBJ_STL = #最后按照格式加入( gpsr前为TAB键而不是空格)
gpsr/gpsr_neighbor.o\
gpsr/gpsr_sinklist.o\
gpsr/gpsr.o
#如果需要加入调试信息,则在CCOPT = -Wall 加上 -g, 如下:
CCOPT = -g -Wall
6.重新编译,执行如下命令
cd $HOME/ns-allinone-2.30/ns-2.30/common
touch packet.cc
cd ..
sudo make clean
sudo make
修改协议源码
在仿真过程中,发现KeLiu版GPSR协议在移动场景下存在一些问题,我们进行如下修改:
1、gpsr.h文件:
90行左右:
class GPSRUpdateSinkLocTimer : publicTimerHandler {
public:
GPSRUpdateSinkLocTimer(GPSRAgent *a) : TimerHandler() {a_=a;} <---这7行
protected:
virtual void expire(Event *e);
GPSRAgent *a_;
};
class GPSRQueryTimer : public TimerHandler{
public:
GPSRQueryTimer(GPSRAgent *a) : TimerHandler() {a_=a;}
protected:
virtual