开始投入紧张的项目工作中,主要方向是改进的蜂窝网的仿真,差不多是3GPP LTE和802.16j的结合。虽然项目里使用的是OPNET,但出于对自由软件天生的好感,空闲下来我还是不由自主地要碰碰NS2。就先随便写一点吧,希望最后能做到OPNET和NS2并驾齐驱。
NS2的入门必修就是它的OTcl & C++分裂对象模型,具体的概念就不多说了,直接进入主题,也就是C++对象和OTcl对象的映射关系,这是NS2工作原理的核心。分为四个问题,为方便叙述,我们把用C++语言实现协议称为设计过程;用OTcl语言架设网络进行仿真称为仿真过程。
1, C++类到OTcl类的映射
C++类到OTcl类的映射是指在用Tcl语言进行仿真时,使用诸如"new Agent/MyAgentOtcl"命令生成OTcl对象,NS2将要生成的对应的C++对象。这个"new Agent/MyAgentOtcl"对应的是解释类(interpreted classes),而它对应的C++类称为编译类(compiled classes)。
这种类的映射是通过在C++程序中继承纯虚类TclClass实现的。设我们用C++设计一个MyAgent类,那么为了在仿真时用OTcl语言得到一个它的对象,我们需要的就是:

2,C++类与OTcl类的变量绑定
在仿真过程中经常需要设定对象的参数,如node的配置、agent的速率等,这些对OTcl对象的参数设定需要被映射到C++对象才算是真正起到了作用。这种绑定是通过在类的构造函数中使用bind()函数实现的:

第一个形参就是OTcl对象中将要使用的变量名,第二个形参是C++类中的变量名。这就完成了my_var和my_var_otcl之间的绑定。
3,C++类的操作到OTcl对象的操作的映射
OTcl对象进行的操作是通过对应的C++类中实现的command()函数定义的,比如:

set myagent [new Agent/MyAgentOtcl]
$myagent call-my-priv-func
第一条命令是通过1中讲过的类的映射实现的,生成了一个MyAgent对象myagent;第二条命令调用了MyAgent类的command()函数中对应"call-my-priv-func"字段部分的操作。这就实现了C++类中的操作到OTcl对象的映射。
4,OTcl类的操作到C++类的操作的映射
在C++设计中也会用到OTcl类给出的一些操作,如:
