- 浏览: 896634 次
- 性别:
- 来自: 太原
文章分类
- 全部博客 (198)
- Linux/Unix (38)
- TinyOS / NS-2 for『WSN』 (44)
- 思想的拼图 (5)
- 开源 OpenSource (2)
- Framework 开发框架 (0)
- Software Engineering 软件工程 (2)
- IT项目管理 (6)
- Networking 网络技术 (2)
- Java (6)
- C语言 ANSI C (22)
- .NET / C# (9)
- C++ (12)
- Web 语言 Html/Xml (5)
- Groovy on Grails (1)
- Algorithm 算法 (1)
- Database 数据库技术 (5)
- Tools (21)
- VM 虚拟机 (3)
- WSN (wireless sensor network) (2)
- Linux 命令专辑 (3)
- PHP (0)
- 办公软件 (3)
最新评论
-
cfczdws:
感谢楼主,查了半天终于发现居然是htmlentities()做 ...
htmlentities()函数把中文转成了乱码 -
decoxiaohan:
这本书的名字 有谁知道????~~~
OMNeT++中文用户手册(完全版) -
huonie:
怎么下载啊
OMNeT++中文用户手册(完全版) -
huonie:
没有内容啊
OMNeT++中文用户手册(完全版) -
kyx0413:
谢谢先 先看看
OMNeT++中文用户手册(完全版)
OTcl Linkage 联接
添加新的基础网络对象去扩展NS,通常需要从C++代码中得到OTcl linkage(联接), 对象的类用C++来编写由于它的高效性。 本节介绍了NS中C++/OTcl联接, 并给出新建一个简单的名叫"MyAgent"代理的示例,"MyAgent"代理没有任何行为(i.e. no packet creation and transmission). Figures 18 到 21 列出了C++ source file for "MyAgent"。 本节最后是一个OTcl脚本用来测试"MyAgent"是否被实现。
假设用C++新建了一个网络对象的类"MyAgent",它是从"Agent"类衍生出来, 然后他能够建立一个OTcl对象的实例。为了实现这个功能我们必须定义一个联接对象"MyAgentClass", 它从"TclClass"衍生得来。 这个联接对象创建了一个有指定命名的OTcl对象(这个例子名为是"Agent/MyAgentOtcl"), 并建立一个联接在OTcl对象和C++对象("MyAgent")之间, 它的实例运行"create"成员函数中指定的程序。Figure 18 表示"MyAgent类"和联接类的定义。
Figure 18. Example C++ Network Component and The Linkage Object
当NS开始运行, 它运行静态变量(static variable) "class_my_agent"的构造函数, 这样一来"MyAgentClass"的实例被建立了。 在这个处理过程中, "Agent/MyAgentOtcl"类和他的方法method(成员函数)也在OTcl的空间内被建立。 无论何时用户在OTcl空间内建立一个对象的实例就会使用命令"new Agent/MyAgentOtcl", 它调用"MyAgentClass::create"去建立"MyAgent"对象并返回它的地址。 这里要当心, 从OTcl中建立一个C++对象的实例并不意味着能够从OTcl调用C++对象实例的成员函数或访问它的成员变量。
假设C++对象"MyAgent"有两个参数变量"my_var1"和"my_var2", 并且我们想轻松的在OTcl中使用模拟脚本来配置(改变)它们 。这需要使用对每个想要输出的C++类的变量的绑定函数(binding function)。 一个绑定函数建立一个给出名字的新成员变量(绑定函数的第一个变量)在对应的OTcl对象类("Agent/MyAgentOtcl")中, 并建立一个双向绑定在OTcl类的变量和C++变量(第二个变量指定的地址)之间。 Figure 19表明如何给Figure 18中"my_var1" 和"my_var2" 建立绑定。
Figure 19. Variable Binding Creation Example
绑定函数位于"MyAgent"的构造函数中,这样在建立对象的实例时就建立了绑定。NS 支持4种不同的绑定函数对应5种变量类型:
- bind(): real or integer variables - bind_time(): time variable - bind_bw(): bandwidth variable - bind_bool(): boolean variable |
以这种方式就可以设计和运行一个模拟并且能使用OTcl脚本去改变或访问C++实现的网络组件的配置参数(或变量的值) 。 无论何时导出一个C++变量, 建议还要去设置这个变量的默认值在"ns-2/tcl/lib/ns-lib.tcl"文件中。 否则在建立新对象的实例时将收到警告信息。
给C++对象("MyAgent")定义一个"command"成员函数作为OTcl命令的解释器。 事实上对于用户来说, 在一个C++对象的"command"成员函数中定义的OTcl命令, 和对应的OTcl对象中的成员函数看起来是一样的。Figure 20给出Figure 18中"MyAgent"对象定义的一个"command"成员函数的例子。
Figure 20. Example OTcl command interpreter
当一个OTcl影像的实例匹配上在OTcl空间中建立的"MyAgent"对象(i.e. set myagent [new Agent/MyAgentOtcl]), 并且用户调用这个对象的一个成员函数(i.e. $myagent call-my-priv-func), OTcl搜索这个已给的成员函数在OTcl对象中。 如果这个成员函数的名字找不到, 则调用"MyAgent::command"传递已调用的OTcl成员函数名和参数以argc(参数个数)/argv(参数值)的格式。 如果有为OTcl成员函数定义的行为(action)在"command"成员函数中, 则运行它并返回结果。 如果没有, 则递归地调用父类、祖类的"command"函数直到找到为止。 如果在父类、祖类中都找不到的话, 则返回一个错误信息(error message)给OTcl对象, 然后OTcl对象提示错误信息(error message)给用户。 这样,OTcl空间中的用户不能控制C++对象的行为。
当用C++实现一个新网络对象时, 可能需要运行OTcl命令在C++对象中。 Figure 21 示例了Figure 18中"MyAgent"的成员函数"MyPrivFunc"的实现, 它让OTcl解释器打印出私有的成员变量"my_var1"和"my_var2"的值。
Figure 21. Execute OTcl command from a C++ Object
从C++中运行OTcl命令, 必须先得到以静态成员函数形式声明的"Tcl::instance()" 的一个参照(reference), 通过它可以传递OTcl命令到解释器(the first line of "MyPrivFunc" does this)。 这个例子演示了2中方式去传递OTcl命令到解释器。 完整的OTcl命令传值函数(OTcl command passing functions)的列表请参考NS文档。
通过运行和测试"MyAgent"例子去更好的理解NS提供的OTcl联接机制。
- 下载"ex-linkage.cc" 文件, 并保存在"ns-2"文件夹下。
- 打开"Makefile", 在object file list结尾加入add "ex-linkage.o"。
- 用"make"命令重新编译NS。
- 下载"ex-linkage.tcl"文件, 它包含了"MyAgent"测试OTcl命令。 (见Figure 22 for the input script and the result)
- 运行OTcl script 通过命令"ns ex-linkage.tcl"。
Figure 22. Test OTcl Script and The Result
MyAgent C++ (ex-linkage.cc)源代码
#include <stdio.h> #include <string.h> #include "agent.h" class MyAgent : public Agent { public: MyAgent(); protected: int command(int argc, const char*const* argv); private: int my_var1; double my_var2; void MyPrivFunc(void); }; static class MyAgentClass : public TclClass { public: MyAgentClass() : TclClass("Agent/MyAgentOtcl") {} TclObject* create(int, const char*const*) { return(new MyAgent()); } } class_my_agent; MyAgent::MyAgent() : Agent(PT_UDP) { bind("my_var1_otcl", &my_var1); bind("my_var2_otcl", &my_var2); } int MyAgent::command(int argc, const char*const* argv) { if(argc == 2) { if(strcmp(argv[1], "call-my-priv-func") == 0) { MyPrivFunc(); return(TCL_OK); } } return(Agent::command(argc, argv)); } void MyAgent::MyPrivFunc(void) { Tcl& tcl = Tcl::instance(); tcl.eval("puts \"Message From MyPrivFunc\""); tcl.evalf("puts \" my_var1 = %d\"", my_var1); tcl.evalf("puts \" my_var2 = %f\"", my_var2); }
发表评论
-
几种用于WSN的仿真工具
2009-12-09 15:26 4241为评价无线传感器网络协议算法的性能,仅通过实验是无法实现的,特 ... -
OMNeT++中文用户手册(完全版)
2009-11-18 22:36 16647http://www.netforum.com.cn/view ... -
改变Telos 系列节点Serial baud rate
2009-08-21 18:50 2198如果节点与PC通信时出现非正常丢包或者serial不稳定当收包 ... -
TinyOS编译问题
2009-08-18 20:47 13241. 有时候编译提示找不到某个文件时, 可能是由于在linux ... -
改变节点transmission power, radio power level (tx_power)
2009-08-11 20:03 4317使用 CC2420Packet 中 setPower 来改变每 ... -
Tcl/tk 小记
2009-07-22 23:43 15331. 检查variable变量是否声明 在使用Tcl时候会经常 ... -
NS无线仿真中无法设置节点颜色的解决方案
2009-07-22 18:57 1935NS中提供了配置节点与 ... -
awk: malloc(): memory corruption 错误
2009-07-09 21:56 7250问题如下: *** glibc detected *** aw ... -
ns2 对无线网络模拟
2009-07-06 19:52 2663在模拟无线网络时需要对tcl模拟脚本文件的参数进行设置,比如P ... -
使用Gnuplot 绘制ns2模拟结果图
2009-06-25 17:48 8215Gnuplot(command-driven inter ... -
ns2模拟无线网络的NAM动画
2009-06-24 22:26 5010无线的各个参数 ####################### ... -
ns2 模拟WSN协议之手记
2009-06-23 23:55 2958ns2中模拟WSN,用Timestamp时间戳计算点对点Del ... -
ns2 中得到Agent的实例
2009-06-16 21:02 2914下面代码说明了如何访问其他节点的Agent,以AODV协议为例 ... -
TinyOS使用MIG时报错!
2009-04-06 01:30 1829在Makefile中加入启用MIG的选项后,编译出现一下错误: ... -
Tinyos 2.0 笔记小结(1)
2009-03-16 20:11 23661. configure组件注意事项 一般在confi ... -
Tinyos 2.0使用笔记
2009-03-06 19:48 27931.编译与安装程序到节点 引用 $ make mica2 ... -
Tinyos 中常用术语
2009-03-05 03:32 1095EOFF 关断能量损耗 用于 device off, stop ... -
什么是 nx_ type
2009-03-01 03:29 1515nx_ types 是在nesC 1.2,tinyos中用到的 ... -
TinyOS 下安装 JNI 的问题
2009-02-25 00:05 32261. "java not found, not i ... -
『TinyOS』学习笔记 #11?
2009-02-20 01:09 3811Lesson 11 TOSSIM Compiling ...
相关推荐
NS2学习笔记-tcl与otcl TCL语言是:NS2仿真软件中的一种脚本语言,主要用于网络仿真和模拟。TCL语言具有解释性语言的特点,可以使用命令行或者脚本的方式运行。TCL语言的注释符号为#和;#,其中#只能在行首注释,;#...
### ns2学习:从《ns by example》理解网络模拟器 #### 概览与基础知识 《ns by example》是一份详尽的指南,专为希望深入理解ns2(一种事件驱动的网络模拟器)的初学者设计。不同于繁杂的技术手册,这份资料以...
### NS2基础知识与实践指南 ...通过上述介绍,我们不仅了解了NS2的基本结构和使用方法,还学会了如何利用《NS by Example》这一宝贵资源来提升自己的NS2技能。希望每位读者都能从中受益,快速成为NS2的专家级用户。
### NS2中OTcl与C++的连接机制详解 #### 概述 网络模拟器NS2(Network Simulator 2)是一种面向对象的网络仿真工具,主要用于研究和开发各种网络协议和算法。它由两种编程语言构成:OTcl作为前端用户界面部分,而...
《NS2中的OTcl-tclCL详解》 在计算机网络模拟领域,NS2(Network Simulator 2)是一款广泛使用的开源工具,它允许研究人员和工程师模拟和分析各种网络协议和拓扑结构。OTcl(Object-Tcl)和tclCL(Tcl Command ...
### 理解NS2中的OTcl&tclCL #### 引言 本文旨在深入探讨NS2中的OTcl(Object Tcl)与tclCL的概念及其重要性。通过解析这两个概念,我们将更好地理解NS2框架的核心机制。NS2是一款强大的网络仿真工具,广泛应用于...
### NS2学习笔记知识点概述 #### 1. 在FreeBSD下NS的安装 - **FreeBSD的安装**:这是在Windows环境下通过虚拟机技术搭建FreeBSD操作系统的基础步骤。选择FreeBSD作为NS2运行环境是因为其良好的稳定性和对NS2的支持...
总体而言,“ns-by-example”项目不仅是一份详尽的NS使用指南,更是一个宝贵的学习资源库,它通过实例教学的方式降低了NS的入门难度,使更多研究人员和学生能够迅速掌握这款强大的网络模拟工具,开展深入的网络科学...
### NS2学习笔记知识点概述 #### 1. 在FreeBSD下NS的安装 - **FreeBSD的安装**:首先需要安装一个支持NS2的操作环境,这里选择了FreeBSD 4.10版本。FreeBSD作为类Unix系统之一,提供了稳定且高性能的基础平台。 - ...
### ns2中otcl语言语法总结 #### 一、Otcl简介 Otcl(Object Tcl)是一种基于Tcl(Tool Command Language)的面向对象扩展语言。Tcl是一种强大的脚本语言,广泛应用于快速应用程序开发、原型制作、脚本编写、图形...
在简化版的用户视角下,NS2是一个面向对象的Tcl(OTcl)脚本解释器,其内部包含了事件调度器和网络组件对象库,以及网络搭建(plumbing)模块库。换句话说,要使用NS2,用户需要使用OTcl脚本语言编程。为了设置并...
### NS2学习笔记知识点概述 #### 一、NS2简介及其安装配置 - **NS2**(Network Simulator 2)是一种广泛使用的网络仿真工具,主要用于研究网络协议的行为和性能。 - **安装步骤**: - **FreeBSD安装**:NS2通常在...