Virtools与VisualC++信息交互技术研究

2017-08-12 12:22:06
计算机应用与软件 2017年8期
关键词:调用串口消息

周 杰

(海军潜艇学院 山东 青岛 266042)



Virtools与VisualC++信息交互技术研究

周 杰

(海军潜艇学院 山东 青岛 266042)

为弥补虚拟开发平台Virtools通信模式的缺陷,丰富Virtools与其他软件平台的通信手段,拓展应用范围,针对Virtools与VC的通信机制,提出通过开发UDP通信模块、串口通信模块以及利用Virtools消息机制和Virtools阵列输出机制完成两种软件平台之间数据交互的方法。充分发挥VC开发平台良好的兼容性,为Virtools与其他不同软件平台间进行信息交互提供可行途径。

Virtools VC 通信

0 引 言

虚拟现实技术(VR),通过综合利用图片、视频、三维动画和声音等多媒体素材,营造出具有沉浸性、交互性、构想性的软件操作环境[1]。虚拟现实技术通过构建三维模型,营造多种视角,提供具有沉浸性和交互性的操作环境,操作者可以亲身漫游虚拟世界,多角度观察操作方法,身临其境参与交互,给操作者强烈的临场感和逼真感。这种深层的自然的人机交互,使操作人员改变以往被动的知识接受模式,变为主动探究,积极寻求新知识,形成潜在技能,可以为实际操作技能的最终形成奠定基础。将虚拟现实技术融合到模拟训练系统中,如运输工具驾驶、武器装备操作等训练平台,可以有效解决传统模拟操作中临场感弱、操作训练不充分、难以形成有效技能的问题。通过逼真的操作平台、工具模型和高度还原的操作过程,调动操作者的主动性,提升知识技能构建的效率。在保证设备和人员安全的前提下,实践所学知识,加速知识到技能的转换过程。

虚拟现实技术已经广泛应用于设计测试、模拟训练、游戏娱乐和教学科研等多个领域。随着VR头戴设备、应力反馈设备等各种终端设备的大量使用,VR技术的应用广度和深度逐年提升,涌现出许多成熟的开发平台,如Quest3D、Virtools和Unity3D等。其中Virtools是法国达索公司开发的三维虚拟软件开发平台,将自身功能模块与其他三维软件开发的模型或场景相结合,通过编程规划其逻辑行为和物理属性,开发贴近现实的虚拟交互环境[2]。Virtools功能、模块完善,适用于游戏和动画的开发制作,也是出现最早、使用最为广泛的虚拟现实游戏开发工具。Virtools突出的便捷性和开放性,使其成为许多虚拟现实开发技术初学者的首选。利用行为模块实现图形化的开发介面,通过视觉化窗口实现图形化编程,这些特点都使Virtools的学习门槛降低,易于理解,便于掌握。但对于需要使用多种软件平台联合开发的复杂系统,使用Virtools与其他软件平台进行通信时却存在一定的技术缺陷,信息交互技术的短板限制了Virtools的应用,特别对于使用最为广泛的Visual C++开发平台,仅利用Virtools自带的行为模块很难实现二者之间的信息交互。针对这一技术缺陷,本文提出了行之有效的技术方案,解决Virtools虚拟软件和Visual C++软件开发平台之间信息交互困难的难题。

1 Virtools通信机制局限性分析

Vtrtools通过模块开发机制实现行为开发与互动操作,各类功能模块称作BuildingBlock,将不同功能的BuildingBlock遵循预设的逻辑关系组合起来实现预定的功能[3]。

网络服务器模块包含大量Building Block(BB模块)实现Virtools的网络通信功能。这些Building Block遵循TCP/IP协议,按照典型的CS结构,完成网络通信。但必须在VirtoolsDev软件平台下调用这些功能模块才能构建通信网络。即所有网络通信节点都要用Virtools来开发,才能使用网络通信BuildingBlock构建通信体系[4]。在复杂系统的开发过程中,Virtools经常需要响应其他软件开发平台的信息,例如VC编写的程序向Virtools发送消息,Virtools接受消息并控制模型产生相应动作。Virtools自带的模块库中没有此类功能模块,当需要Virtools软件平台和其他软件平台之间进行通信,交换数据,这时Virtools通信的局限性就凸显出来,内置网络模块无法与其他软件平台进行信息通信。这种缺陷限制了Virools平台与其他不同软件平台之间的信息交互,不利于大型三维虚拟软件的开发。

Visual C++(VC)软件开发平台基础语言较为普及,代码执行效率高,使用微软编译器,得到Windows系列操作系统的良好支持,开发的程序健壮、稳定。一般大型程序的核心组件都使用VC开发,以满足核心程序运行高效稳定的要求。VC具有完善的帮助文档,大量的优质教材和海量的网络资源,为开发者带来了极大的便利条件。而且VC开发平台具有多种控件及函数接口,可以利用多种方法实现与不同软件之间的信息通信。研究Virtools与VC之间的信息交互技术,以VC平台为枢纽,充分利用VC平台丰富的编程资源、良好的兼容性和扩展性,实现Virtools与其他软件的信息交互,弥补其信息交互技术的短板,扩展Virtools的通信手段,拓展应用范围。

2 用户数据报协议通信模块的开发

用户数据报协议(UDP协议),与TCP协议相比没有拥塞控制机制,便于维持最低数据率,消除数据传输时延[5],在实时控制程序中应该利用UDP协议速度优势建立通信机制,用户数据报协议通过套接字(Socket)传输数据,将该协议嵌入到Building Block中,再利用VC的套接字技术可实现VC与Virtools平台的通信。Building Block开发需要利用Microsoft Visual Studio.Net环境,开发流程如图1所示。

图1 Building Block开发流程

(1) 使用函数CKGetPluginInfo()和CKGetPluginlnfoCount()将DLL声明为Building Block Plugin,定义Plugin为Behavior Plugin类型,定义并声明Building Block Plugin个数为一,使用这个Plugin执行Building Block,Building Block Plug要执行的Building Block用函数RegisterBehaviorDcclaration()注册。

(2) 利用CreateCKObjectDeclaration()声明函数创建CKObjectDeelaration类型的指针,指向创建的Building Block信息函数,描述Building Block的基本信息,如版本号,作者,功能。

(3) 用创建函数CreateCKBehaviorPrototype()创建网络通信相关的模块输入端口,定义端口号、网络地址等。从指定输入端口上获取并保存网络信息和网络数据结果。

(4) 将使用套接字相关的头文件和库文件添加到Building Block中,首先激活模块的输入端口,再将网络应用程序移植到BuildingBlock的执行函数中。读取输入参数可利用函数GetlnputParameterValue()数据结果可通过SetOutputParameterValue()保存到参数输出端口。

(5) 使用系统默认同调函数完成对Building Block的创建,生成DLL文件。

(6) 编译成功后,从生成的文件目录下将DLL文件拷贝到Virtools软件安装目录下的BuildingBlock文件夹中,重新启动Virtools调用执行。

用户数据报协议通信模块发出的信息在VC中可利用套接字(Socket)进行处理,完成信息交换。

首先调用WSAStartup()初始化Windows Sockets DLL 。WinSock的动态连接库初始化成功后,在服务器端使用函数socket( int af, int type, int protocol )建立监听Socket,type参数设定为SOCK_DGRAM,以使用UDP(数据报)通信协议。接下来调用bind()函数为Socket指定地址和端口(Port)。服务器端完成Socket对象绑定之后,使用listen()函数建立监听队列,进入监听状态准备接收客户端连接请求,并设定最大连接数。当需要真正完成通信连接时,客户端需调用connect()发出请求,系统使用WSAAsyncSelect()函数发出通知,服务器端调用accept()响应请求,完成通信连接。建立连接后,客户端的Virtools程序就可以借由用户数据报BB模块发出自定义消息,而VC开发的服务器端通过分析消息,调用相关函数进行处理。结束通信连接由服务器或客户端的任一端调用closesocket()套接字,并调用 WSACleanup()通知套接字动态链接库释放占用的资源。

3 串口通信模块的开发

串口通信是利用数据信号线连接外设和计算机,完成按位数据传输的一种通信方法[6]。串口通信双方连接采用端对端的方式,连接方式单一,硬件要求低,不容易出现相互干扰,查错纠错难度低,容易实现。但其存在接口插拔风险,要避免两端通电状态下的拔插,安全性低于网口。串口通信传输速度较慢,对于操作对象较多,交互数据量较大的虚拟操作软件,传输数据量很难达到实时通信的要求,串口通信仅能应对虚拟环境较为简单,操作对象单一的虚拟操作软件。而且应用程序对串口具有独占性,一旦某个程序占据串口,其他的程序则无法使用该串口。单一程序由于串行通信的特点也无法使用多线程进行串口通信否则会发生多个命令之间的干扰导致通信失败。

开发串口通信模块需要利用Virtools SDK开发构架,通过调用Win 32 API完成,靠指针依次调用执行注册函数、声明函数、创建函数、执行函数和回调函数,完成对模块的开发(具体开发步骤可参考用户数据报协议通信模块开发)。在回调函数中调用Win32 API文件操作函数实现串口打开/关闭。CreateFile()函数实现串口打开,WriteFile()函数实现数据发送,ReadFile()函数则用来实现接受数据[6]。程序运行过程中,首先利用执行函数完成Building Block激活,接着参数初始化,然后与通信端利用握手机制建立连接,从计算机串口读取并处理数据,数据结果可供其他模块调用。串口通信模块的循环调用可通过Virtools帧循环方式实现。

VC可利用多种方式接受Virtools通过串口发出的数据,如串行通信控件MSComm或利用串口通信类。串行通信控件主要应用于基于对话框开发的程序,通过事件驱动处理串行端口信息交互,发生数据交换或通信错误时,OnComm事件触发,捕捉CommEvent属性值,应用程序根据属性值做出相应的信息处理。

其次可开发自定义的串口通信类,在单线程或多线程中实现串口通信。利用CreateFile()函数指定通信串口及相关属性。通过调用GetCommState()函数读取当前串口设置,通过SetCommState()函数写入修改后的属性。调用SetCommTimeouts()函数通过COMMTIMEOUTS结构设置异步读写的超时控制。串口读写操作主要运用ReadFile()与WriteFile()API函数。

4 利用Virtools消息机制通信

消息是对象之间在一次交互中所传送的信息。为保持封装对象成为各司其职,互不干扰的高内聚独立单位,消息通信成为对象之间唯一合法的动态联系途径,使不同功能单元的行为互相配合,构成一个动态、有序的系统[7]。当系统发生某个事件时,操作系统将与这个事件关联的消息放置到消息队列,应用程序从消息队列中接收消息并传递给适当的窗口,窗口响应并处理消息。所有的开发环境都有消息机制,因此借由消息机制,可以实现不同平台之间的应用程序调用请求。消息机制可用于缓解甚至消除系统瓶颈,消息处理可并行展开,缓解点对点同步连接造成系统瓶颈,甚至可以消除瓶颈。通过多个消息接收者并发处理不同消息,还可以提高系统的整体可伸缩性和吞吐量。消息机制的这些特点都使它非常适用于完成虚拟平台和VC软件平台之间的实时大数据量信息交互。

利用消息机制进行通信,首先需要Virtools留出通信接口,以方便VC读取相关信息。Virtools消息通信模块的开发基本步骤与串口通信模块、UDP通信模块类似,完成指定消息的发送需在执行函数中调用函数:

CKMessageManage:SendMessageSingle(CKMessageType MsgType,CKBeobjectdest,CKBeObjecl*sender=NUll)

VC可利用钩子机制获取Virtools发送的特定消息。应用程序使用钩子机制能够完成特定事件的截获和处理。应用程序可以在钩子(Hook)这个消息处理平台上面设置子程序,以监测其他进程所创建的特定窗口的指定消息。指定消息存储在钩子链表中,即与信息相关联的指针列表,该链表中的指针为各个类型的消息指定处理子程。这些处理子程叫做钩子子程,钩子子程可由应用程序自定义,它是应用程序的回调函数,可通过API函数SetWindowsHookEx()将其安装到钩子链表中。

VC利用钩子机制截获并处理Virtools发出的消息后,可以通过发送指定的虚拟键盘消息将消息处理结果反馈Virtools完成通信。Virtools自带行为交互模块Keyboard Controller、Keyboard Mapper支持将按键操作映射为系统消息或自定义消息。响应键盘消息可保证信息传递的多样性。VC可以实现在不激活应用程序的情况下向其窗口发送模拟按键消息。首先使用FindWindow() 及 FindWindowEx()函数取得接收按键消息的窗口句柄,然后用PostMessage()向该窗口发送按键消息。运用这种方法可以依据VC发送的信息对虚拟物体或角色进行灵活多变的控制,流程图如图2所示,利用消息机制实现VC与Virtools的通信。

图2 消息机制通信流程

5 利用Virtools阵列输出机制通信

Virtools中的阵列用于建立数据、时间变量控制等,它由Column(列)和Row(行)组成[9]。Virtools的阵列可以存储三维对象和摄像机的三维位置、矢量位移、旋转方式、旋转角度和动作时机等动作因素。Virtools提供了大量阵列操作BB,可以直接读取三维物体的相关参数存储到阵列或者根据阵列内存储的参数驱动三维物体动作。在Virtools程序运行时,通过Test和2D Picking行为交互模块判断此时被用户操作的虚拟物体,并将虚拟物体的参数变化通过SetCell行为交互模块对阵列的每一个元素及相应参数进行设置。然后利用Array Save行为交互模块将数组数据储存成指定路径下的文件档案[9]。一旦VC软件读取这些文件档案就可以提取Virtools虚拟软件操作的结果,并根据结果做出反馈,完成信息交互。

完成存储后利用Windows API实现对指定目录中文件的监控,一旦发现文件改变,则立即进行处理,获取数据。可使用的API函数有:FindFirstChangeNotification()和ReadDirectory ChangesW()。两个函数都能够监测文件最终写入时间和文件大小的改变,从而实时监测阵列输出指定文件,快速提取Virtools通过阵列机制输出的信息。

当监控条件满足时,FindFirstChangeNotification()函数返回的监控句柄结束在WaitForMultipleObjects() 上的等待状态,变为激发状态,这时应用程序得知目录发生了变化并立即进行数据处理,数据处理结束后调用BOOL FindNextChangeNotification()来将该监控句柄置为去激活状态,并继续等待下一次被激活。完成文件监控时调用FindCloseChangeNotification()关闭监控句柄。

ReadDirectoryChangesW()函数使用CreateFile()获取要监控目录的句柄;然后循环调用ReadDirectoryChangesW()判断文件是否改变,并分配内存用来存放目录变化通知并传给该函数。当监控条件满足文件发生改变,函数把目录变化通知存放在指定的内存区域内,并进行相关处理。

在VC程序中利用上述函数实时监控数组文件档案存储的指定路径,一旦发现文件发生更改,使用CreateFile()函数取得对应文件的句柄,利用句柄使用ReadFile()函数读取文件内容到指定字符串,并进行相应处理,处理完成后结果可使用WriteFile()函数再次写入数组文件。Virtools可以在完成阵列输出后,在规定响应时间内利用Array Load模块读取数组文件,利用数组元素完成虚拟物体的控制。利用Virtools数组输出保存/读取机制和VC文件监控函数完成信息交互,流程如图3所示。

图3 阵列输出机制通信流程

6 结 语

本文对Virtools与VC的信息交互技术进行了深入分析,通过自定义模块开发技术,将UDP协议、串口通信技术、消息通信机制嵌入到了Virtools的Building Block模块中,丰富BB模块的功能,弥补Virtools本身通信模块的功能缺陷。在仅需利用Virtools已有模块的情况下,提出利用Virtools阵列进行信息交互,使得Virtools与VC之间的通信手段更加多样化。VC由于其突出的兼容性使其可以成为Virtools信息交互的中介,在技术上克服了Virtools与其他软件平台间通信的瓶颈问题,为Virtools与其他不同软件平台间进行信息交互搭建了一座桥梁,拓展了其应用范围。

[1] 姜学智,李忠华.国内外虚拟现实技术的研究现状[J].辽宁工程技术大学学报,2004(4):238-241.

[2] 牛彦,张烁男.基于Virtools技术的产品虚拟交互式操作指导系统构建[J].沈阳建筑大学学报,2012(5):569-572.

[3] 刘明昆.三维游戏设计师宝典[M].成都:四川出版集团四川电子音像出版中心,2005.

[4] 于修洪,项辉宇,牛凯.虚拟现实技术在机械产品装配中的应用[J].现代制造工程,2011(5):39-42.

[5] 汪云飞,晁爱农,黄飞.基于Virtools的UDP协议嵌入模块技术研究[J].计算机工程与设计,2010,31(8):1852-1855.

[6] 滕英岩,张福艳.基于Virtools和串口通信的界面交互性的设计与实现[J].微计算机信息,2010,26(17):88-90.

[7] 刘航,王春水,王积忠.基于视景仿真技术的某型装备虚拟操作训练系统[J].指挥控制与仿真,2007,29(2):79-82.

[8] 张豫南,郭文涛,田鹏,等.VC对Virtools二次开发实现网络监控的研究[J].电脑编程技巧与维护,2010(20):118-120.

[9] 于丹东,徐英新,胥林.三维游戏设计师宝典一Virtools行为模块词典大全[M].电脑报电子音像出版社,2009.

RESEARCHONINFORMATIONCOMMUNICATIONBETWEENVIRTOOLSANDVISUALC++

Zhou Jie
(NavalSubmarineAcademy,Qingdao266042,Shandong,China)

To make up for the communication defect of Virtools (i.e. one of the virtual development platform mode) and rich the means of communication between Virtools and other software platform and expand the scope of application. This paper aim at the communication mechanism for Virtools and VC and propose methods of developing UDP communication module, serial communication module, using the Virtools message mechanism and Virtools array output mechanism to complete the data exchange between the two kinds of software platform. The methods can give full play to good compatibility of the VC development platform and provide a feasible way for data exchange between Virtools and other different software.

Virtools VC Communication

2017-02-20。周杰,讲师,主研领域:发射装置。

TP3

A

10.3969/j.issn.1000-386x.2017.08.059

猜你喜欢
调用串口消息
浅谈AB PLC串口跟RFID传感器的通讯应用
一张图看5G消息
核电项目物项调用管理的应用研究
LabWindows/CVI下基于ActiveX技术的Excel调用
测控技术(2018年5期)2018-12-09 09:04:46
基于系统调用的恶意软件检测技术研究
USB接口的多串口数据并行接收方法探索
基于蓝牙串口适配器的GPS接收机与AutoCAD的实时无线通信
地矿测绘(2015年3期)2015-12-22 06:27:26
消息
中国卫生(2014年12期)2014-11-12 13:12:26
消息
中国卫生(2014年8期)2014-11-12 13:00:50
消息
中国卫生(2014年7期)2014-11-10 02:32:52