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