`
sudalyl
  • 浏览: 100523 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

NS分裂对象模型--转载

    博客分类:
  • NS2
阅读更多

 开始投入紧张的项目工作中,主要方向是改进的蜂窝网的仿真,差不多是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语言得到一个它的对象,我们需要的就是:

NS分裂对象模型--转载 - sudalyl - sudalyl的博客
     用MyAgentClass继承一下TclClass,并在其中的create()函数中返回一个MyAgent()的对象。这样我们在OTcl语言中写下"new Agent/MyAgentOtcl"时,NS2就会找到C++类MyAgentClass,执行其中的create()函数,而这个函数返回一个MyAgent类的对象,于是就在OTcl语言中生成了一个C++类的影子对象(shadow object),完成了映射。

2,C++类与OTcl类的变量绑定

     在仿真过程中经常需要设定对象的参数,如node的配置、agent的速率等,这些对OTcl对象的参数设定需要被映射到C++对象才算是真正起到了作用。这种绑定是通过在类的构造函数中使用bind()函数实现的:
NS分裂对象模型--转载 - sudalyl - sudalyl的博客
     第一个形参就是OTcl对象中将要使用的变量名,第二个形参是C++类中的变量名。这就完成了my_var和my_var_otcl之间的绑定。

3,C++类的操作到OTcl对象的操作的映射

     OTcl对象进行的操作是通过对应的C++类中实现的command()函数定义的,比如:
NS分裂对象模型--转载 - sudalyl - sudalyl的博客
     这样在OTcl中写出
     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类给出的一些操作,如:
NS分裂对象模型--转载 - sudalyl - sudalyl的博客
     就是在MyAgent类中生成了一个Tcl对象tcl,并调用了tcl的几个函数打印一些信息。通过将MyAgent类映射到OTcl类,在仿真中我们就可以看到NS2打印出的提示信息。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics