基于句柄和脚本定制的试飞数据自动卸载工具
2016-09-08贾雨王爽刘升护
贾雨,王爽,刘升护
(中国飞行试验研究院 陕西 西安 710079)
基于句柄和脚本定制的试飞数据自动卸载工具
贾雨,王爽,刘升护
(中国飞行试验研究院 陕西 西安710079)
试飞数据卸载及位流分析是飞行试验中的一个重要环节,直接影响着飞行试验结果分析的及时性和有效性。本文提出了基于句柄和脚本定制相结合的试飞数据自主卸载工具,通过配置文件按照操作句柄或脚本设定的操作流程,自动调用相应的卸载和位流分析软件进行数据卸载分析。经过实践使用表明,该工具缓解了传统数据卸载耗费大量人力的问题,同时确保了试飞数据的及时性和准确性。
试飞数据;数据卸载;位流分析;句柄;脚本
飞行试验是在真实飞行条件下进行的科学研究和产品试验,是航空航天科技发展的重要手段,是航空产品研制和鉴定的必须环节,是为用户摸索和积累经验的有效途径。试飞数据处理的对象是经由测试系统在飞行试验或地面试验进行中所采集到的实验数据,然后按照试飞课题要求对采集到的试验数据进行加工、整理、分析,使得课题人员及时掌握飞行情况,诊断和检测飞行参数的质量,给出在试验状态下飞行任务完成情况,以保证飞行安全和提高试飞质量,最终得到评价试验对象的有用信息,它是航空武器装备定型、鉴定最重要的依据。
目前,试飞数据的事后处理是在飞行结束之后地面卸载人员将机载记录器记录的飞行数据通过专业卸载软件卸载到数据服务器上并根据需要进行位流分析,然后提供给数据处理人员进行数据的预处理与二次处理。随着科技的进步和测试技术的发展,飞行试验过程中的测试参数与日剧增,而且由于试飞架次的不断增加,试飞数据量也随之增大,然而目前数据卸载都是通过地面卸载人员手动完成,导致数据卸载变得愈加繁重和花费时间,对数据的快速处理要求带来很大挑战。
针对以上问题,文中提出了基于句柄和脚本定制相结合的自主卸载工具,在需要进行数据卸载时用户只需要编写一个简单的配置文件,卸载工具只需要根据配置文件控制相关句柄或解析相应动作脚本,即可自动控制卸载软件进行试飞数据卸载和位流分析,节省了大量的人工操作时间,有效提高了数据卸载的工作效率,而且还可以防止人为因素而引起的错误,保证飞行试验数据卸载的准确性、及时性及完整性。
1 自主卸载工具设计
软件控制指在自己的程序中针对某些特定的应用软件模拟人的行为实现自动控制,软件控制使得我们能将现已经成型的第三方一系列相关软件集成为一个大的应用,大大地节约了系统开发时间。在本文中我们利用Windows系统的消息机制,在合适的时刻获取目标程序的相应句柄,模拟Windows系统向其适当窗口发出相应的消息实现数据卸载和位流分析。同时考虑到第三方软件升级等变动造成的窗口句柄实效,我们还实现了软件的脚本控制功能,用户可以根据需要选择现有脚本或者自己编写脚本对第三方软件进行控制进行数据卸载和位流分析。
自主卸载工具的最主要目的是将地面卸载人员从重复繁琐的卸载软件操作中解放出来,减少卸载人员的工作量,因此,软件设计只需要用户读取定义的一组配置信息文件,卸载工具通过运行相应的操作配置文件,自动调用相关的卸载软件和位流分析软件进行试飞数据的卸载及位流分析,极大减轻了卸载人员的工作量,同时保证试飞数据卸载及位流分析的完整性和有效性。卸载工具的工作流程定义如图1所示。
图1 工作流程
用户配置文件为一个规范化的文本文档,自主卸载工具读取一段完整的用户配置定义后根据用户选择利用Windows系统的消息机制控制句柄或者调用脚本解析模块解析相应脚本动作文件,模拟按键操作控制相应的卸载软件及位流分析软件,卸载工具的用户配置管理、句柄获取与控制、动作脚本文件的解析以及日志记录功能通过C++[1]开发环境编程实现。当卸载分析软件开始工作时,自主卸载工具停止继续解析配置文件,而是不断检测当前卸载分析软件是否运行完毕,当检测到当前的卸载分析软件运行完毕时,关闭当前软件,用户配置管理读取下一段完整的用户配置定义开始下一个卸载操作控制直至用户配置文件执行完毕。在下文中将着重介绍基于Windows系统的消息机制句柄控制模块、脚本定义及解析模块、户配置模块及日志记录模块。
2 Windows系统的消息机制句柄控制
2.1Windows消息机制概述
Windows是消息驱动的系统。Windows应用程序的键盘或鼠标等的输入由Windows系统以消息的形式送给应用程序窗口。系统将会维护一个或多个消息队列,所有产生的消息都会被放入或是插入队列中。系统会在队列中取出每一条消息,根据消息的接收句柄而将该消息发送给拥有该窗口的程序的消息循环。每一个激活程序在循环中获得属于自己的消息并根据接收窗口的句柄控制相关窗口过程。这就是Windows操作系统的消息机制。消息的数据结构如下:
在Windows程序中,消息是由MSG结构体来表示的。MSG结构体的定义如下[2]:
Typedef struct tagMsg{
HWND hwnd;
UNIT message;
WPARAM wParam;
LPARAM lParam;
DWORD time;
POINT pt;
}MSG;
其中,hwnd表示目标窗口的句柄。Message指定了消息类型。在Windows中,消息是由一个数值来表示的,不同的消息对应不同的数值。wParam和lParam用于指定消息的附加信息。time表示消息产生的时间,pt则是消息产生时鼠标在屏幕中的位置坐标。
2.2卸载软件和位流分析软件控制技术
上面介绍了Windows系统的消息机制,自主卸载工具要控制卸载软件和位流分析软件,还须要弄清楚两个问题,如何获取卸载软件和位流分析软件的对应窗口的句柄和如何向该窗口发送消息。
2.2.1获取窗口句柄
Windows中用窗口句柄(Handle)来标识一个窗口。有句柄的控件本质上都是一个窗体(window),它们可以独立存在,可以作为其它控件的容器,而没有句柄的控件,如Label,是不能独立存在的,只能作为窗口控件的子控件。窗口分为主窗口和子窗口,并且子窗口中还有子窗口。在这里我们利用SPY++工具来确定每一窗口(包括有句柄的控件)之间的从属关系,SPY++以清晰的树状结构表示窗口的父窗口和子窗口。
要找到卸载软件和位流分析软件的某一控件,必须首先找出其窗口,再逐级的找出子窗口,直至找到想要控制的控件。要获得窗体/控件的句柄,你先用SPY++获得它的类名或窗口标题,如位流分析软件PCMDUMP窗口标题为“PCM数据文件检查”,然后用 FindWindow即可获得其句柄,如PCMDUMP句柄
hWnd=::FindWindow(NULL,"PCM数据文件检查");
其他窗体/控件也类似,只要用SPY++选获得窗体从属关系,便可以一步步用FindWindow或FindWindowEx获得其句柄。
2.2.2发送Windows消息到受控窗体/控件
发送消息到指定卸载软件或位流分析软件的窗体/控件是通过以下两个Windows API函数完成的:SendMessage和PostMessage。两个函数的区别在于:PostMessage函数是非阻塞的,只是向线程消息队列中添加消息,添加完之后立即返回。而SendMessage是非阻塞的,它并不是把消息加入到队列里,而是直接翻译消息和调用消息处理,直到消息处理完成后才返回。
应用程序窗口一般有按钮、文本框、菜单、滚动条等不同的要素组成,要控制一个可控的控件,可以通过SendMessage这个API函数发送特定的消息,我们可以借助于SPY++工具,通过工具的“Message Log”功能,先进行一次类似操作,再查看该操作所须要的SendMessage函数的参数值。
1)控制菜单栏
要实现对菜单的控制,首先要去的菜单的标识信息,Windows应用程序的菜单是一个为树状结构,要取得菜单项的句柄就得从树根出发逐级而下获得。利用Windows API函数GetMenu取得主菜单的句柄,然后再用GetSubMenu取得子菜单的句柄,而取得菜单标识项则调用GetMenuItemID。得到了菜单项的标识后,就可以同过发送WM_COMMAMD消息选择控制菜单项了。
::PostMessage(hParentWnd,WM_COMMAND,(WPARAM)menuid,NULL);
2)控制按钮
按钮的控制是向按钮句柄发送CLICK消息。
::SendMessage(hChildWnd6,BM_CLICK,0,MAKELPARAM (2,2);
3)控制文本输入
实现文本的输入,是向文本框发送WM_SETTEXT消息,例如向文本框输入一段文字,文字存放在str中。
str=m_FrameSet_Number;
::SendMessage(hChildWnd,WM_SETTEXT,0,(LPARAM)_T (str.c_str());
3 脚本及脚本定义解析
当卸载软件或位流分析软件版本发生变化时,如果不更新自主卸载工具继续使用句柄控制会导致句柄获取实效,无法继续完成相关操作,在这里,我们为用户提供脚本控制功能,用户可以利用现有脚本或自定义动作脚本有效控制卸载软件或位流分析软件。
3.1脚本定义
随着计算机的运算速度不断提高,编程的方法和技术的不断演变,面向软件组件结构的系统设计方法逐渐为众多的开发者所接受。程序开发的观念正发生着变化:从使用高级程序设计语言编写应用程序向结合脚本语言[3]开发应用程序过渡[4]。高级程序设计语言主要是用于构造带有复杂数据结构和算法的组件。而脚本语言则是一种“穿线的语言”或“系统集成语言,它总是假设已经存在一个功能强大的组件集合,而运用脚本语言编程的目的就是根据应用需求粘贴组合这些组件,形成一个实际的应用系统。脚本语言具有以下优点[2]:脚本语言的无类型性;脚本语言的被解释执行;脚本语言的简单性;脚本语言的高效性。
在试飞数据卸载和位流分析过程中,卸载人员都是经过一个既定的操作流程操作一系列的卸载软件和位流分析软件组合完成试飞数据卸载分析工作,为了完成试飞数据的自动卸载和位流分析,在程序中需要定义一套完整的动作脚本语句。通过粘贴组合这些脚本语句,可以形成对某个卸载分析软件进行完整操作的操作配置文件定义,然后利用C++编写的脚本解析模块自动解析该操作配置文件文件,最终实现试飞数据的自动卸载及位流分析。具体脚本操作定义如下所示:
#以"#"开头的行为注释行
[SLEEP]暂停时间(以秒计算)
[RUN]SIZE=[NORMAL(default)|MAX|MIN] " filepath""Para"
[OPEN]SIZE=[NORMAL(default)|MAX|MIN]"filepath"
[ACTIVE]"Feature"
[CLOSE]"Feature"
[MOUSEMOVE] x、y
[LCLICK]
[RCLICK]
[LDBLCLICK]
[KEYPRESS]STRING
[KEYDOWN]Char
[KEYUP]Char
[SCREENSAVE]
[SUSPEND]
[PAUSE]STRING
3.2解析模块
尽管对于粘贴型和系统集成型应用程序,用脚本语言能以几乎快10倍左右的速度开发,但是对于包含复杂数据结构和算法的系统,高级编程语言的类型性能够使应用程序更容易控制。在那些运行速度要求很高的地方,高级编程语言能以比脚本语言快10到20倍的速度运行。而且脚本编程所使用的组件都需要用高级编程语言精心组织和编写。显然,两类语言具有很强的互补性。把它们结合起来使用就能产生强大功能的编程环境:高级编程语言用于生成组件,脚本语言把它们组合起来构成应用程序。
通过脚本语句的粘贴组合形成的脚本文件,自动卸载工具可以快速轻松的实现不同的应用需求,同时,卸载工具需要“解释”这些脚本文件,要根据脚本定义的不同需求来控制相应的位流分析和卸载软件,即能够对脚本文件解析执行。这些是脚本语言本身无法实现的,因此,该卸载工具利用C++编写脚本解析模块从而根据解析情况进行相关卸载及位流分析软件的操作,实现脚本文件的解析功能。
解析模块由分解源程序、语句解释、表达式解析器和语法错误处理几部分组成。解释器对源程序进行边解释边执行。在整个程序的解释执行当中,若出现语法错误,就执行语法错误处理程序,提醒用户脚本文件编写错误。解析模块的结构如图2所示。
图2 解析模块结构
语句解释是整个解析模块的关键部分,每一个语句对应于一个方法,在一个循环里面对程序的所有语句进行解释。每个语句的第一个“令牌”是关键字,根据关键字,调用相应的方法进行解释,解析模块能够自动地在自定义的动作对象和键盘鼠标操作之间根据名称一致性的原则实现属性和方法的对应,例如当在脚本片断中执行定义的行为描述“[KEYPRESS]ALT+F4”,那么就会模拟相应的键盘组合操作。在这里,我们通过HOOK技术[5],利用WINDOWS的消息机制实现鼠标键盘动作的模拟。HOOK技术即钩子技术。在Windows系统中,钩子是一种特殊的消息处理函数[6]。钩子可以监视系统或进程中的各种事件消息,截获发往目标窗口的消息并进行处理。这样,我们就可以在系统中安装自定义的钩子,监视系统中特定事件的发生,完成特定的功能,比如截获键盘、鼠标的输入和日志监视等等。
4 用户操作组件实现
用户操作控制组件主要基于vc6.0开发环境完成。操作界面如图3所示。用户可通过加载运行配置文件进行数据卸载。
图3 工具操作界面
4.1配置文件实现
用户通过编辑配置文件组织数据的卸载分析流程,一个配置文件由几组规范化的配置定义组成,每一组配置定义完成一个特定的数据卸载或位流分析操作,如FTrans卸载、PCM数据位流分析。由于每架飞机试飞数据数据类型相对稳定,而且卸载结果数据存储路径固定,配置文件经过一次编辑定义好一组卸载操作流程,以后只需要极小的修改即可完成一个飞行架次的数据卸载,自主卸载工具根据配置文件调用相关的卸载软件完成试飞数据的卸载任务,配置文件如下所示:
#****************************D40f卸载
**************************
Begin:
Type:D40f
TestIni:FTrans.ini
Exe_FileName:
Source_FileName:D:JY est33120140630-1DATaRec.Raw
Result_FileName:D:JY est33120140630-1-pcm
Video_Dir:D:JY est33120140630-1-video
Drc:D:JY est331970#Script.Drc
End
#*************************位流分析-PCM
***************************
Begin:
Type:PCM
TestIni:PCMDUMP_PCM.ini
Exe_FileName:
Source_FileName:D:JY est33120140630-1DCM1.pcm
Result_FileName:D:JY est33120140630-1DCM1.DCM
FrameSet_Number:970-1
End
4.2卸载日志生成
日志文件记录了卸载工具运行的运行状态,如运行开始时间记录,执行的卸载位流分析操作类型记录,操作中的关键步骤以及错误信息的记录,同时还对运行过程中的节点状态进行截图保存。通过查看卸载日志和节点状态截图,用户可以准确掌握卸载工具的运行状态和分析结果数据的正确性和完整性,保证试飞数据卸载及位流分析的正确性,为课题分析提供准确有效的试飞数据。
5 结束语
基于句柄和脚本定制的试飞数据自动卸载工具实现了句柄获取与控制模块、格式化的操作脚本定以及解析模块和用户配置模块,有效解决了飞行试验数据卸载耗费大量人力的难题,提高了数据卸载的工作效率,同时还具备日志记录功能和关键画面截取功能,防止人为因素而引起的错误,保证飞行试验数据卸载的准确性和有效性。
[1]孙鑫.VC++深入详解[M].北京:电子工业出版社,2006.
[2]OUSTERHOUT J K.Scripting:Higher Level Programming for the 21st Century[J].IEEE Computer,1998,31(3):23-30.
[3]邵堃,刘宗田.脚本语言发展研究[J].计算机科学,2000,27(1): 21-23.
[4]刘克胜,王忠寿.API Hook关键技术解析[J].网络安全技术与应用,2006(11):48-50.
[5]崔红志,索岩基.基于API的Win32串口通信编程技术[J].科技信息,2010(7):80-81.
[6]殷振岭,商书风.系统钩子与键盘监控[J].信息技术与信息化,2004(5):26-28.
Design of a flight test data independent downloading tool based on handle and script designing
JIA Yu,WANG Shuang,LIU Sheng-hu
(Chinese Flight Test Establishment,Xi'an 710079,China)
Data downloading and bits analysing is a very important step of flight test,which affects the level of the flight test results analysis transitive and validity.In this paper we proposed a self-determinative downloading tool based on handle and script designing.It can automatic call downloading or analyzing software to download or analyze flight test data throw configure file.substantial evidence the tool can reduce people's work effectively,and insure the transitive veracity of the flight test data at the same time.
flight test data;data downloading;bits analyzing;handle;script
TN06
A
1674-6236(2016)13-0045-04
2015-07-08稿件编号:201507067
贾 雨(1988—),男,陕西府谷人,硕士研究生,助理工程师。研究方向:试飞遥测监控与数据处理。