韩旭 宋华军 王跃宗
摘 要: 针对现有VXI?11协议在Windows下的开发都过于简单,功能严重不完整,且仪器在启动VXI?11服务时需要引入很多代码,操作过于繁琐等问题,完成了VXI?11协议在Windows下完整功能的开发。在此基础上,将所有的代码封装成库的形式,并且给使用者提供一些必要的接口,让使用者可以方便快捷地在仪器上启动VXI?11服务而且更加灵活地使用该服务。实验结果证明,该系统的服务端程序可以正确地响应客户端的VXI?11协议,并且可以通过VXI?11协议稳定地进行数据传输。
关键词: VXI?11协议; 功能开发; 代码封装; 网络仪器; 端口映射; 仪器测试
中图分类号: TN915.04?34; TP336 文献标识码: A 文章编号: 1004?373X(2020)10?0086?03
Complete development of VXI?11 protocol and implementation of library
HAN Xu, SONG Huajun, WANG Yuezong
(School of Information and Control Engineering, China University Of Petroleum, Qingdao 266580, China)
Abstract: As the existing development of VXI?11 protocol is too simple in Windows, the function is severe incomplete, the instrument needs to introduce a lot of codes when starting the VXI?11 service, the operation is too cumbersome and other problems, the development of the complete function of VXI?11 protocol in Windows is completed. On this basis, all the codes are packaged as the form of the library, and users are provided with some necessary interfaces, so that users can convenient and efficient start the VXI?11 service on the instrument and use the service more flexible. The experimental results show that the server?side program of the system can respond to the client′s VXI?11 protocol correctly, and can transmit data stably through the VXI?11 protocol.
Keywords: VXI?11 protocol; functional development; code packaging; network instrument; port mapping; instrument test
0 引 言
LXI的推出为构建分布式测试系统提供了更好的手段,同时LXI仪器也成为测试仪器发展的新方向[1]。VXI?11协议是LXI仪器中的关键标准之一,为了在网络中发现并使用LXI仪器,必须实现VXI?11协议开发[2]。近些年,VXI?11协议在Windows下的开发已经取得了一定进展,但实现的功能还不够完整,仅有部分功能函数可以使用。在现代科技迅速发展的情况下,这仅有的部分功能函数难以满足人们对仪器功能日益增长的需求。此外,现有对VXI?11协议的开发使用起来十分不便,需要向仪器中引入大量代码,这对一些没有接触源代码的使用者很不友好。因此,VXI?11协议在Windows下完整功能的开发以及更为方便的使用成了人们的迫切需求。
1 开发原理
RPC(Remote Procedure Call)即远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议[3]。
VXI?11协议定义了三个通道:核心通道(Core Channel)、中止通道(Abort Channel)和中断通道(Interrupt Channel)[4]。三个通道函数的调用均采用RPC方式进行。VXI?11协议所包含的通道及通道调用方向关系如图1所示。
VXI?11整体的通信包括三个部分:客户端、服务器端和Portmap端口映射程序。客户端的作用是根据需要向服务器端发起远程调用请求。服务器端在仪器上运行,对客户端发送过来的请求进行解析处理并将解析结果返回客户端。 Portmap端口映射程序功能是把RPC进程标识号转化为Internet的端口号[5]。
下面从VXI?11协议完整功能的开发以及库和接口的实现两个方面进行介绍。
2 VXI?11协议完整功能的开发
2.1 VXI?11协议开发
VXI?11协议开发的流程如图2所示。
首先在Linux系统下使用rpcgen命令(该命令可以生成RPC服务器程序的代码,它的输入为一个规格说明文件,输出为一个C语言的源程序[6])生成VXI?11协议的框架,然后将其导出至Windows系统中。之后,在Windows系统里新建工程,将导出的文件加入工程并调试。现有对VXI?11开发的功能函数仅有2~3个,本系统复现了现有的功能函数后,补充完善并实现所有的功能函数。
2.2 VXI?11协议功能函数
完整的VXI?11协议共17个功能函数。其中,核心通道定义了15个函数,通过这15个函数完成对网络仪器的大部分控制任务[7],比如向仪器写入数据的写入函数和可以读取仪器状态字的读状态字函数;中止通道定义了1个函数,用于仪器控制端对仪器优先级较高或紧急的控制任务;中断通道定义了1个函数,用于仪器向控制器反馈信息。
在17個功能函数中,核心通道的读取仪器函数最为复杂,下面以读取仪器函数device_read的开发为例做介绍。
device_read函数用于将数据从仪器读取到客户端。客户端发送的数据结构体代码如下:
struct Device_ReadParms {
Device_Link lid; //来自客户端的链接ID
unsigned long requestSize;
//客户端一次能接收的最大字节数
unsigned long io_timeout; //I/O最多传输的时间
unsigned long lock_timeout; //最多等待解锁的时间
Device_Flags flags;
char termChar;
//termChar和flags里的termchrset一起使用,当termchrset的字符
与termChar匹配时,该字符被传输
};
仪器返回给客户端的数据结构体代码如下:
struct Device_ReadResp {
Device_ErrorCode error; //读取失败的原因标志位
long reason; //读取完成的原因标志位
opaque data<>; //返回给客户端的数据长度和具体数据
};
device_read函数的流程图如图3所示。
首先,客户端发送读请求后,运行服务器端的仪器会根据客户端发送的lid判断是否可以连接,若不能连接,则返回Error=4;若可以,则判断其他连接是否有锁定。如果没有锁定,判断要读的数据是否大于requestSize;若有锁定,则等待Lock_timeout毫秒的时间。若在该时间内未解锁,则返回Error=11、data.data_len=0;否则,判断要读的数据是否大于RequestSize,若小于则返回Reason=4,若大于则判断返回的缓冲区是否已满,如果已满,则返回Reason=0,否则继续读。最后判断是否读完,若读完则返回Reason=1,否则继续判断返回的缓冲区是否满,直到读完为止。
3 VXI?11库及接口的实现
虽然已将VXI?11协议开发完整,但使用起来仍不方便,因此系统将完整开发的VXI?11协议封装成库,只需在仪器里调用这个库就可以成功启动VXI?11服务,使用起来更为便捷、快速。
此外,系统还提供众多独立封装接口函数,可满足大多数仪器的需求,使用起来更为灵活。其包括1个服务启动函数、1个可以完成缓冲区的初始化的缓冲初始函数和10个接口函数。在10个接口函数中,读取数据接口较为复杂,以此函数为例对接口函数做介绍。
读取数据接口定义如下:
typedef struct InputdData{char* DataVal; u_int DataLen;}
InputData;
typedef int (CALLBACK * RdDevice)(InputData data);
RdDevice funcRe;
void ReadVXI11Device(RdDevice func);
{
funcRe = func;
}
首先,定义InputData结构体和一个回调函数类型RdDevice,此回调函数的输入参数类型为InputData型,返回参数为int型。通过RdDevice即可创建此类型的回调函数指针。ReadVXI11Device函数为库的导出函数,此函数功能是将一个库外的回调函数指针传递给VXI?11库内事先定义好的回调函数指针funcRe,库内便可以通过指针funcRe调用到库外的回调函数。
4 测 试
本文测试使用的是Keysight Connection Expert软件。在仪器中调用该系统的VXI?11库,通过简单的几个库函数便可以成功启动VXI?11服务。
以大数据传输为例,在对仪器进行访问时,不可避免地要对大量数据进行传输,但由于受客户端单次最大可接收字节数限制,通常无法通过单次操作完成传输,而使用本系统的库,可通过一次读操作直接完成传输,测试结果如图4所示。
当仪器(服务器端)接收到测试软件(客户端)发出的测试命令后,会判断要读的数据是否大于测试软件一次能接收的最大字节数,测试软件默认设置1 024 B,而本次要接收的数据为3 000 B,所以读完1 024 B数据后,将继续读1 024 B数据,直至3 000 B全部读完,一共读三次,然后将结果返回至测试软件。从图4可以看出,通过读操作,客户端成功接收了服务器端的3 000 B数据。
5 结 语
本文完成了VXI?11协议在Windows下完整功能的开发,并且做成库的形式,给使用者提供接口,解决了现有VXI?11协议在Windows下开发的功能还不够完整、使用起来不方便等问题。经验证,功能开发完整的服务端程序可以正确响应客户端的VXI?11协议,并且可以稳定地传输数据。
参 考 文 献
[1] 沈建飞.基于LXI的数据链端机自动测试系统[J].现代导航,2019,10(1):56?59.
[2] 尹洪伟,孙美美,张树团.基于VXI?11的LXI仪器发现技术研究[J].電子设计工程,2011,19(18):18?20.
[3] 邱畅,李龙,郑艳梅.基于LXI总线PCI接口的软件设计[J].国外电子测量技术,2016,35(5):100?103.
[4] 翟龙军,曲洪东,高山,等.基于DSP和VXI?11协议的LXI仪器控制与实现[J].计算机测量与控制,2014,22(11):3691?3693.
[5] 田丹丹.PortMap端口映射器[J].网络安全和信息化,2017(2):161.
[6] 耿建平,邓力.通过VXI?11协议控制LXI仪器[J].微计算机信息,2011,27(10):39?41.
[7] 庞新法.网络化仪器仪表协议客户端设计与实现[J].现代电子技术,2015,38(18):122?124.
[8] 李延峰,李宥谋,闫海卿,等.LXI网络仪器后台处理的设计与实现[J].计算机技术与发展,2019,29(3):159?163.
[9] 邓茂林,姚静波,解维奇.基于航天测试技术的LXI多功能接口板卡设计[J].现代电子技术,2014,37(21):94?97.
[10] 郑馥薇,沈卓炜.基于数据分发服务的远程过程调用系统[J].计算机应用,2018,38(z2):239?242.
[11] 张波,万丽.基于端口映射NAT网络方案分析与实施[J].软件工程师,2015,18(3):12?13.