李 梅,韓秀玲,陳 光
(東華大學(xué)信息科學(xué)與技術(shù)學(xué)院,上海 201620)
Virtools是一套具備豐富互動(dòng)行為模塊的實(shí)時(shí)3D環(huán)境虛擬實(shí)景編輯軟件[1]。該軟件包括一個(gè)創(chuàng)作應(yīng)用程序、一個(gè)動(dòng)作引擎、一個(gè)渲染引擎、一個(gè)Web播放器及一個(gè)軟件開(kāi)發(fā)工具包(SDK)[2]。其中SDK(Software Development Kit)用于開(kāi)發(fā)新的行為交互模塊以及新的硬件驅(qū)動(dòng)[3]。Virtools本身自帶了許多BB(Building Block)模塊,使用這些模塊可以輕松地開(kāi)發(fā)出出色的作品[4]。然而,對(duì)于某些特殊用途,如本課題中的交互型虛擬設(shè)備,僅靠Virtools自身的BB還不能滿足需求,這時(shí)就需要使用合適的工具(如Virtools SDK)來(lái)開(kāi)發(fā)出新的適用于特殊需求的BB模塊。目前,在教育領(lǐng)域針對(duì)Virtools SDK的應(yīng)用研究還較少[5-7]。
本文針對(duì)計(jì)算機(jī)網(wǎng)絡(luò)虛擬實(shí)驗(yàn)室中虛擬網(wǎng)絡(luò)設(shè)備功能復(fù)雜及交互性要求較高的特點(diǎn),自主開(kāi)發(fā)了特定功能的BB模塊,基于這些模塊實(shí)現(xiàn)的虛擬實(shí)驗(yàn)室不僅開(kāi)發(fā)的工作量小,而且功能也更加完善,交互性更強(qiáng)。
Virtools SDK處于Virtools的最底層,提供 Virtools軟件的所有底層函數(shù)。雖然Virtools中內(nèi)嵌的VSL(Virtools Script Language)語(yǔ)言也可以用來(lái)在一定程度上彌補(bǔ)BB模塊功能的不足[8],但VSL語(yǔ)言只是從SDK中綁定了一些常用的類、全局方法以及常量,而SDK則針對(duì)C++語(yǔ)言,具有C++面向?qū)ο笳Z(yǔ)言的所有特點(diǎn)。相比較而言,VSL語(yǔ)言開(kāi)發(fā)的靈活度也就不及 SDK[9]。
通過(guò)SDK程序員能夠方便地訪問(wèn)所有Virtools中的函數(shù),并可直接使用這些功能函數(shù)編寫(xiě)相關(guān)組件,如:利用基于這些函數(shù)的Virtools引擎開(kāi)發(fā)一些自定義的應(yīng)用程序,還可擴(kuò)展Virtools引擎。Virtools引擎是以模塊化的架構(gòu)組織起來(lái)的,組織架構(gòu)如圖1所示。其中,引擎關(guān)鍵部分為行為庫(kù)和數(shù)學(xué)庫(kù)。數(shù)學(xué)庫(kù)提供底層的函數(shù),行為庫(kù)提供SDK開(kāi)發(fā)時(shí)的基本規(guī)范以及組織和管理其它引擎模塊。
圖1 Virtools引擎組織架構(gòu)圖
Virtools SDK不同版本對(duì)不同編譯環(huán)境有不同的要求。本文以Virtools 5.0的SDK為開(kāi)發(fā)工具,并在VS2005中搭建了SDK 5.0開(kāi)發(fā)環(huán)境,搭建過(guò)程在此不再贅述。
軟件系統(tǒng)是網(wǎng)絡(luò)設(shè)備的核心。對(duì)于虛擬設(shè)備,其功能的實(shí)現(xiàn)也是通過(guò)軟件系統(tǒng)體現(xiàn)出來(lái)的,如:設(shè)備啟動(dòng)時(shí)的初始化、配置命令的激活等。但網(wǎng)絡(luò)設(shè)備命令上百甚至上千條,且命令之間有一定的邏輯關(guān)系,利用Virtools中現(xiàn)有的BB模塊來(lái)實(shí)現(xiàn)需要很大的工作量且比較繁瑣,實(shí)現(xiàn)后的靈活性也會(huì)受到限制。除此之外,由于目前計(jì)算機(jī)網(wǎng)絡(luò)虛擬實(shí)驗(yàn)室的組網(wǎng)實(shí)驗(yàn)只能實(shí)現(xiàn)路由器間單一路由協(xié)議的配置,無(wú)法實(shí)現(xiàn)不同路由協(xié)議的自由組網(wǎng)功能,這也使得組網(wǎng)的靈活性受到很大限制。而這些問(wèn)題的解決就需要借助于Virtools SDK。
在計(jì)算機(jī)網(wǎng)絡(luò)中,交換機(jī)、路由器分別工作在OSI模型中的數(shù)據(jù)鏈路層和網(wǎng)絡(luò)層。交換機(jī)是根據(jù)自己自學(xué)習(xí)建立和維護(hù)的Mac地址與設(shè)備端口映射表(即交換表)來(lái)判斷數(shù)據(jù)幀轉(zhuǎn)發(fā)的端口;路由器則是通過(guò)路由選擇協(xié)議學(xué)習(xí)得到的路由表來(lái)確定數(shù)據(jù)分組的轉(zhuǎn)發(fā)路徑。因此,對(duì)于交換機(jī)和路由器,交換表與路由表是網(wǎng)絡(luò)數(shù)據(jù)得以通信成功的基本保障,交換表與路由表的建立是軟件部分要實(shí)現(xiàn)的關(guān)鍵內(nèi)容[10-11]。
由此可知,必須編寫(xiě)兩個(gè)重要的BB模塊以實(shí)現(xiàn)如下功能:(1)自動(dòng)獲取用戶輸入配置命令中的關(guān)鍵參數(shù),如:由網(wǎng)絡(luò)IP地址獲得所在的網(wǎng)段;(2)自動(dòng)將用戶輸入的參數(shù)處理后組成路由條目以實(shí)現(xiàn)路由表的實(shí)時(shí)更新。
對(duì)于交換機(jī)、路由器等虛擬設(shè)備的硬件系統(tǒng)部分,通過(guò)三維建模軟件3DS Max進(jìn)行仿真;而對(duì)于抽象的軟件系統(tǒng)部分以及對(duì)設(shè)備外部操作的交互部分則通過(guò)BB編寫(xiě)Script腳本來(lái)實(shí)現(xiàn)。對(duì)于編寫(xiě)的Get_NetID和Routing_Info模塊,在實(shí)現(xiàn)方法上,主要利用SDK提供的行為庫(kù)和數(shù)學(xué)庫(kù)實(shí)現(xiàn)Virtools Dev當(dāng)前元素的訪問(wèn)和操作。同時(shí),編寫(xiě)自己的功能實(shí)現(xiàn)函數(shù),如函數(shù)Get_NetID()和Routing_Info()。功能實(shí)現(xiàn)函數(shù)通過(guò)控制語(yǔ)句及底層函數(shù)的調(diào)用來(lái)實(shí)現(xiàn)所需的功能[12]。編寫(xiě)的BB模塊最終以動(dòng)態(tài)鏈接庫(kù)(DLL)插件的形式擴(kuò)展到Virtools中供開(kāi)發(fā)者應(yīng)用。
2.3.1 Get_NetID 模塊的實(shí)現(xiàn)
在源文件及資源文件的基礎(chǔ)上,主要從兩方面完成模塊的開(kāi)發(fā)。一方面,在插件描述文件中定義開(kāi)發(fā)模塊的實(shí)現(xiàn)插件數(shù)目及插件具體信息。另一方面,在BB實(shí)現(xiàn)文件中進(jìn)行模塊外部特征及功能的開(kāi)發(fā)。
(1)插件部分。
本文Get_NetID模塊主要用作網(wǎng)段的獲取,因此,只需定義一個(gè)插件即可。這里通過(guò)宏定義語(yǔ)句define PLUGIN_COUNT 1定義插件的數(shù)目為1,CKPluginInfo g_PluginInfo[PLUGIN_COUNT]語(yǔ)句定義插件信息類的結(jié)構(gòu)數(shù)組。最后,由 CKGetPluginInfo-Count函數(shù)中return PLUGIN_COUNT語(yǔ)句返回插件數(shù)目。
為了更好地?cái)U(kuò)展到Virtools中,需對(duì)每個(gè)插件進(jìn)行詳細(xì)的描述,如插件的ID號(hào)、類型、摘要等信息,部分語(yǔ)句如下:
當(dāng)然,僅有插件的外在信息是不夠的,還需將該插件所包含的BB注冊(cè)進(jìn)來(lái),實(shí)現(xiàn)插件部分與BB模塊部分的緊密連接。這里起關(guān)鍵橋梁作用的語(yǔ)句由RegisterBehavior(reg,F(xiàn)illBehaviorGet_NetIDDecl)實(shí)現(xiàn)。此處,參數(shù)FillBehaviorGet_NetIDDecl為下述實(shí)現(xiàn)文件中的模塊聲明函數(shù),通過(guò)調(diào)用此函數(shù)實(shí)現(xiàn)具體的注冊(cè)。
(2)模塊具體實(shí)現(xiàn)。
為使開(kāi)發(fā)者能夠方便地查找和使用該模塊,這里對(duì)該模塊名稱、作用等信息進(jìn)行了描述,并將模塊直接歸到合適的行為模塊類中。實(shí)現(xiàn)代碼如下:
通常一個(gè)BB模塊由流程輸入、輸出端及參數(shù)輸入、輸出端組成。流程端用于實(shí)現(xiàn)Script腳本編寫(xiě)時(shí)程序的邏輯鏈接,參數(shù)端用于實(shí)現(xiàn)參數(shù)的獲取及處理后參數(shù)的輸出。Get_NetID模塊即由兩個(gè)流程輸入端、一個(gè)流程輸出端及3個(gè)參數(shù)輸入端、一個(gè)參數(shù)輸出端組成。所有這些BB的外部特征信息均在外部特征生成函數(shù)中聲明。
CKBehaviorPrototype*proto=CreateCKBehaviorPrototype("Get_NetID");//創(chuàng)建一個(gè)描述BB特征的行為對(duì)象,將該BB的名稱以字符串變量的形式傳入
該模塊在功能的具體實(shí)現(xiàn)上首先獲取和遍歷用戶輸入的正確的路由器配置命令,由于配置命令是確定的,只是用戶配置的IP地址不確定,因此,命令中IP地址的起始位置可知。實(shí)際上一般的機(jī)構(gòu)、公司都采用內(nèi)部網(wǎng)絡(luò)的形式即專用IP地址,這時(shí)的地址為標(biāo)準(zhǔn)IP地址。本實(shí)驗(yàn)室系統(tǒng)也是如此,采用C類專用地址,子網(wǎng)掩碼為 255.255.255.0。因此,截取IP地址的前24位長(zhǎng)度并加以補(bǔ)全就可得到路由器所在的網(wǎng)段。關(guān)鍵代碼如下:
2.3.2 Routing_Info 模塊的實(shí)現(xiàn)
實(shí)時(shí)完善路由表?xiàng)l目的Routing_Info模塊開(kāi)發(fā)過(guò)程及使用的相關(guān)類及函數(shù)與Get_NetID模塊基本相同,不同之處在于其功能實(shí)現(xiàn)函數(shù)Routing_Info()的函數(shù)體的實(shí)現(xiàn)。模塊實(shí)現(xiàn)了自動(dòng)添加掩碼長(zhǎng)度及根據(jù)路由協(xié)議設(shè)定優(yōu)先級(jí)后將所有輸入?yún)?shù)整合成完整路由條目的功能。部分實(shí)現(xiàn)代碼如下:
當(dāng)用戶為路由器接口配置192.168.2.1的IP地址、子網(wǎng)掩碼為255.255.255.0 時(shí),如圖 2 所示,該模塊參數(shù)輸出端輸出結(jié)果為192.168.2.0的網(wǎng)絡(luò)地址。
圖2 Get_NetID模塊實(shí)現(xiàn)效果圖
由于本實(shí)驗(yàn)室系統(tǒng)采用華三通信技術(shù)有限公司的設(shè)備,華三路由表包含的路由信息如圖3所示,即每一條路由條目都包含了“目的地址、路由協(xié)議、優(yōu)先級(jí)”等信息,其中,路由條目會(huì)根據(jù)用戶配置的更新而更新。
圖3 路由器路由表信息圖
當(dāng)用戶配置命令中啟用的路由協(xié)議為ospf,該路由器所在網(wǎng)絡(luò)號(hào)為192.168.3.0,在已知下一跳地址及接口時(shí),輸出參數(shù)如圖4所示。
圖4 Routing_Info模塊實(shí)現(xiàn)效果圖
通過(guò)以上兩個(gè)模塊再結(jié)合其它BB模塊,如專門(mén)用于陣列獲取參數(shù)的get cell模塊、向陣列設(shè)置參數(shù)的set cell模塊及text display模塊等,將路由信息在二維幀下實(shí)時(shí)顯示出來(lái),從而實(shí)現(xiàn)最大限度地模擬再現(xiàn)真實(shí)設(shè)備功能的效果[13-14]。
本文在VS2005環(huán)境下,利用Virtools SDK開(kāi)發(fā)了適用于計(jì)算機(jī)網(wǎng)絡(luò)虛擬實(shí)驗(yàn)室系統(tǒng)的BB模塊,實(shí)現(xiàn)了網(wǎng)絡(luò)地址的自動(dòng)獲取以及路由條目的完善及實(shí)時(shí)更新。這一技術(shù)不但解決了本虛擬實(shí)驗(yàn)室開(kāi)發(fā)過(guò)程中由于Virtools現(xiàn)有BB模塊功能性不足帶來(lái)的技術(shù)難題,同時(shí)也擴(kuò)展了系統(tǒng)的功能,減少了系統(tǒng)開(kāi)發(fā)設(shè)計(jì)中的工作量,這對(duì)其它基于Virtools SDK應(yīng)用的開(kāi)發(fā)具有一定的指導(dǎo)意義。
[1]徐英欣,王丹東,胥林.三維游戲設(shè)計(jì)師寶典[M].重慶:電腦報(bào)電子音像出版社,2009:2-3.
[2]方利偉.基于Virtools的三維虛擬實(shí)驗(yàn)室研究與實(shí)現(xiàn)[J].實(shí)驗(yàn)技術(shù)與管理,2010,27(5):83-86.
[3]羅建勤,張明.交互式漫游動(dòng)畫(huà)——Virtools+3DS Max虛擬技術(shù)整合[M].北京:中國(guó)科學(xué)技術(shù)出版社,2010:19-29.
[4]Virtools中國(guó)網(wǎng).高互動(dòng)3D應(yīng)用的研發(fā)平臺(tái)——Virtools4介紹[EB/OL].http://www.virtools.com.cn/about/200705/215.html,2011-08-25.
[5]張?jiān)ツ?,郭文濤,田鵬,等.VC對(duì)Virtools二次開(kāi)發(fā)實(shí)現(xiàn)網(wǎng)絡(luò)監(jiān)控的研究[J].電腦編程技巧與維護(hù),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的交互式操作模型系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)算機(jī)應(yīng)用,2009,29(z2):308-310,313.
[8]李兆歆,張大坤.基于VSL語(yǔ)言的三維動(dòng)態(tài)交互移動(dòng)實(shí)現(xiàn)及其應(yīng)用[J].計(jì)算機(jī)工程與設(shè)計(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]郭放,陳光.現(xiàn)代通信網(wǎng)絡(luò)應(yīng)用實(shí)踐[M].北京:中國(guó)水利水電出版社,2009:57-61.
[11]謝希仁.計(jì)算機(jī)網(wǎng)絡(luò)[M].北京:電子工業(yè)出版社,2003:189-219.
[12]羅斌,等.Visual C++編程技巧精選500例[M].北京:中國(guó)水利水電出版社,2005.
[13]李昌國(guó),朱福全,譚良,等.基于3D和Virtools技術(shù)的虛擬實(shí)驗(yàn)開(kāi)發(fā)方法研究[J].計(jì)算機(jī)工程與應(yīng)用,2006,42(31):84-86,96.
[14]劉明昆.就是要做3D游戲-Virtools秘笈篇[M].北京:中國(guó)青年電子出版社,2010:223-360.