李 梅,韩秀玲,陈 光
(东华大学信息科学与技术学院,上海 201620)
Virtools是一套具备丰富互动行为模块的实时3D环境虚拟实景编辑软件[1]。该软件包括一个创作应用程序、一个动作引擎、一个渲染引擎、一个Web播放器及一个软件开发工具包(SDK)[2]。其中SDK(Software Development Kit)用于开发新的行为交互模块以及新的硬件驱动[3]。Virtools本身自带了许多BB(Building Block)模块,使用这些模块可以轻松地开发出出色的作品[4]。然而,对于某些特殊用途,如本课题中的交互型虚拟设备,仅靠Virtools自身的BB还不能满足需求,这时就需要使用合适的工具(如Virtools SDK)来开发出新的适用于特殊需求的BB模块。目前,在教育领域针对Virtools SDK的应用研究还较少[5-7]。
本文针对计算机网络虚拟实验室中虚拟网络设备功能复杂及交互性要求较高的特点,自主开发了特定功能的BB模块,基于这些模块实现的虚拟实验室不仅开发的工作量小,而且功能也更加完善,交互性更强。
Virtools SDK处于Virtools的最底层,提供 Virtools软件的所有底层函数。虽然Virtools中内嵌的VSL(Virtools Script Language)语言也可以用来在一定程度上弥补BB模块功能的不足[8],但VSL语言只是从SDK中绑定了一些常用的类、全局方法以及常量,而SDK则针对C++语言,具有C++面向对象语言的所有特点。相比较而言,VSL语言开发的灵活度也就不及 SDK[9]。
通过SDK程序员能够方便地访问所有Virtools中的函数,并可直接使用这些功能函数编写相关组件,如:利用基于这些函数的Virtools引擎开发一些自定义的应用程序,还可扩展Virtools引擎。Virtools引擎是以模块化的架构组织起来的,组织架构如图1所示。其中,引擎关键部分为行为库和数学库。数学库提供底层的函数,行为库提供SDK开发时的基本规范以及组织和管理其它引擎模块。
图1 Virtools引擎组织架构图
Virtools SDK不同版本对不同编译环境有不同的要求。本文以Virtools 5.0的SDK为开发工具,并在VS2005中搭建了SDK 5.0开发环境,搭建过程在此不再赘述。
软件系统是网络设备的核心。对于虚拟设备,其功能的实现也是通过软件系统体现出来的,如:设备启动时的初始化、配置命令的激活等。但网络设备命令上百甚至上千条,且命令之间有一定的逻辑关系,利用Virtools中现有的BB模块来实现需要很大的工作量且比较繁琐,实现后的灵活性也会受到限制。除此之外,由于目前计算机网络虚拟实验室的组网实验只能实现路由器间单一路由协议的配置,无法实现不同路由协议的自由组网功能,这也使得组网的灵活性受到很大限制。而这些问题的解决就需要借助于Virtools SDK。
在计算机网络中,交换机、路由器分别工作在OSI模型中的数据链路层和网络层。交换机是根据自己自学习建立和维护的Mac地址与设备端口映射表(即交换表)来判断数据帧转发的端口;路由器则是通过路由选择协议学习得到的路由表来确定数据分组的转发路径。因此,对于交换机和路由器,交换表与路由表是网络数据得以通信成功的基本保障,交换表与路由表的建立是软件部分要实现的关键内容[10-11]。
由此可知,必须编写两个重要的BB模块以实现如下功能:(1)自动获取用户输入配置命令中的关键参数,如:由网络IP地址获得所在的网段;(2)自动将用户输入的参数处理后组成路由条目以实现路由表的实时更新。
对于交换机、路由器等虚拟设备的硬件系统部分,通过三维建模软件3DS Max进行仿真;而对于抽象的软件系统部分以及对设备外部操作的交互部分则通过BB编写Script脚本来实现。对于编写的Get_NetID和Routing_Info模块,在实现方法上,主要利用SDK提供的行为库和数学库实现Virtools Dev当前元素的访问和操作。同时,编写自己的功能实现函数,如函数Get_NetID()和Routing_Info()。功能实现函数通过控制语句及底层函数的调用来实现所需的功能[12]。编写的BB模块最终以动态链接库(DLL)插件的形式扩展到Virtools中供开发者应用。
2.3.1 Get_NetID 模块的实现
在源文件及资源文件的基础上,主要从两方面完成模块的开发。一方面,在插件描述文件中定义开发模块的实现插件数目及插件具体信息。另一方面,在BB实现文件中进行模块外部特征及功能的开发。
(1)插件部分。
本文Get_NetID模块主要用作网段的获取,因此,只需定义一个插件即可。这里通过宏定义语句define PLUGIN_COUNT 1定义插件的数目为1,CKPluginInfo g_PluginInfo[PLUGIN_COUNT]语句定义插件信息类的结构数组。最后,由 CKGetPluginInfo-Count函数中return PLUGIN_COUNT语句返回插件数目。
为了更好地扩展到Virtools中,需对每个插件进行详细的描述,如插件的ID号、类型、摘要等信息,部分语句如下:
当然,仅有插件的外在信息是不够的,还需将该插件所包含的BB注册进来,实现插件部分与BB模块部分的紧密连接。这里起关键桥梁作用的语句由RegisterBehavior(reg,FillBehaviorGet_NetIDDecl)实现。此处,参数FillBehaviorGet_NetIDDecl为下述实现文件中的模块声明函数,通过调用此函数实现具体的注册。
(2)模块具体实现。
为使开发者能够方便地查找和使用该模块,这里对该模块名称、作用等信息进行了描述,并将模块直接归到合适的行为模块类中。实现代码如下:
通常一个BB模块由流程输入、输出端及参数输入、输出端组成。流程端用于实现Script脚本编写时程序的逻辑链接,参数端用于实现参数的获取及处理后参数的输出。Get_NetID模块即由两个流程输入端、一个流程输出端及3个参数输入端、一个参数输出端组成。所有这些BB的外部特征信息均在外部特征生成函数中声明。
CKBehaviorPrototype*proto=CreateCKBehaviorPrototype("Get_NetID");//创建一个描述BB特征的行为对象,将该BB的名称以字符串变量的形式传入
该模块在功能的具体实现上首先获取和遍历用户输入的正确的路由器配置命令,由于配置命令是确定的,只是用户配置的IP地址不确定,因此,命令中IP地址的起始位置可知。实际上一般的机构、公司都采用内部网络的形式即专用IP地址,这时的地址为标准IP地址。本实验室系统也是如此,采用C类专用地址,子网掩码为 255.255.255.0。因此,截取IP地址的前24位长度并加以补全就可得到路由器所在的网段。关键代码如下:
2.3.2 Routing_Info 模块的实现
实时完善路由表条目的Routing_Info模块开发过程及使用的相关类及函数与Get_NetID模块基本相同,不同之处在于其功能实现函数Routing_Info()的函数体的实现。模块实现了自动添加掩码长度及根据路由协议设定优先级后将所有输入参数整合成完整路由条目的功能。部分实现代码如下:
当用户为路由器接口配置192.168.2.1的IP地址、子网掩码为255.255.255.0 时,如图 2 所示,该模块参数输出端输出结果为192.168.2.0的网络地址。
图2 Get_NetID模块实现效果图
由于本实验室系统采用华三通信技术有限公司的设备,华三路由表包含的路由信息如图3所示,即每一条路由条目都包含了“目的地址、路由协议、优先级”等信息,其中,路由条目会根据用户配置的更新而更新。
图3 路由器路由表信息图
当用户配置命令中启用的路由协议为ospf,该路由器所在网络号为192.168.3.0,在已知下一跳地址及接口时,输出参数如图4所示。
图4 Routing_Info模块实现效果图
通过以上两个模块再结合其它BB模块,如专门用于阵列获取参数的get cell模块、向阵列设置参数的set cell模块及text display模块等,将路由信息在二维帧下实时显示出来,从而实现最大限度地模拟再现真实设备功能的效果[13-14]。
本文在VS2005环境下,利用Virtools SDK开发了适用于计算机网络虚拟实验室系统的BB模块,实现了网络地址的自动获取以及路由条目的完善及实时更新。这一技术不但解决了本虚拟实验室开发过程中由于Virtools现有BB模块功能性不足带来的技术难题,同时也扩展了系统的功能,减少了系统开发设计中的工作量,这对其它基于Virtools SDK应用的开发具有一定的指导意义。
[1]徐英欣,王丹东,胥林.三维游戏设计师宝典[M].重庆:电脑报电子音像出版社,2009:2-3.
[2]方利伟.基于Virtools的三维虚拟实验室研究与实现[J].实验技术与管理,2010,27(5):83-86.
[3]罗建勤,张明.交互式漫游动画——Virtools+3DS Max虚拟技术整合[M].北京:中国科学技术出版社,2010:19-29.
[4]Virtools中国网.高互动3D应用的研发平台——Virtools4介绍[EB/OL].http://www.virtools.com.cn/about/200705/215.html,2011-08-25.
[5]张豫南,郭文涛,田鹏,等.VC对Virtools二次开发实现网络监控的研究[J].电脑编程技巧与维护,2010(20):118-120.
[6]Harri Mahonen.Implementing Behavior Plugins with Virtools SDK[EB/OL].http://www.virtools.com/events/VTT-Virtools-2008/2008-02-01% 20Implementing%20behavior%20plugins%20with%20Virtools.pdf,2008-02-01.
[7]盖龙涛,陈月华.基于Virtools的交互式操作模型系统的设计与实现[J].计算机应用,2009,29(z2):308-310,313.
[8]李兆歆,张大坤.基于VSL语言的三维动态交互移动实现及其应用[J].计算机工程与设计,2010,31(2):455-458.
[9]Dongil Shin,En Sup Yoon,Kyung Yong Lee,et al.A web-based,interactive virtual laboratory system for unit operations and process systems engineering education:Issues,design and implementation[J].Computers and Chemical Engineering,2002,26(2):319-330.
[10]郭放,陈光.现代通信网络应用实践[M].北京:中国水利水电出版社,2009:57-61.
[11]谢希仁.计算机网络[M].北京:电子工业出版社,2003:189-219.
[12]罗斌,等.Visual C++编程技巧精选500例[M].北京:中国水利水电出版社,2005.
[13]李昌国,朱福全,谭良,等.基于3D和Virtools技术的虚拟实验开发方法研究[J].计算机工程与应用,2006,42(31):84-86,96.
[14]刘明昆.就是要做3D游戏-Virtools秘笈篇[M].北京:中国青年电子出版社,2010:223-360.