韓旭 宋華軍 王躍宗
摘? 要: 針對(duì)現(xiàn)有VXI?11協(xié)議在Windows下的開發(fā)都過于簡(jiǎn)單,功能嚴(yán)重不完整,且儀器在啟動(dòng)VXI?11服務(wù)時(shí)需要引入很多代碼,操作過于繁瑣等問題,完成了VXI?11協(xié)議在Windows下完整功能的開發(fā)。在此基礎(chǔ)上,將所有的代碼封裝成庫的形式,并且給使用者提供一些必要的接口,讓使用者可以方便快捷地在儀器上啟動(dòng)VXI?11服務(wù)而且更加靈活地使用該服務(wù)。實(shí)驗(yàn)結(jié)果證明,該系統(tǒng)的服務(wù)端程序可以正確地響應(yīng)客戶端的VXI?11協(xié)議,并且可以通過VXI?11協(xié)議穩(wěn)定地進(jìn)行數(shù)據(jù)傳輸。
關(guān)鍵詞: VXI?11協(xié)議; 功能開發(fā); 代碼封裝; 網(wǎng)絡(luò)儀器; 端口映射; 儀器測(cè)試
中圖分類號(hào): TN915.04?34; TP336? ? ? ? ? ? ? ?文獻(xiàn)標(biāo)識(shí)碼: A? ? ? ? ? ? ? ? ? ? ? 文章編號(hào): 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的推出為構(gòu)建分布式測(cè)試系統(tǒng)提供了更好的手段,同時(shí)LXI儀器也成為測(cè)試儀器發(fā)展的新方向[1]。VXI?11協(xié)議是LXI儀器中的關(guān)鍵標(biāo)準(zhǔn)之一,為了在網(wǎng)絡(luò)中發(fā)現(xiàn)并使用LXI儀器,必須實(shí)現(xiàn)VXI?11協(xié)議開發(fā)[2]。近些年,VXI?11協(xié)議在Windows下的開發(fā)已經(jīng)取得了一定進(jìn)展,但實(shí)現(xiàn)的功能還不夠完整,僅有部分功能函數(shù)可以使用。在現(xiàn)代科技迅速發(fā)展的情況下,這僅有的部分功能函數(shù)難以滿足人們對(duì)儀器功能日益增長(zhǎng)的需求。此外,現(xiàn)有對(duì)VXI?11協(xié)議的開發(fā)使用起來十分不便,需要向儀器中引入大量代碼,這對(duì)一些沒有接觸源代碼的使用者很不友好。因此,VXI?11協(xié)議在Windows下完整功能的開發(fā)以及更為方便的使用成了人們的迫切需求。
1? 開發(fā)原理
RPC(Remote Procedure Call)即遠(yuǎn)程過程調(diào)用,它是一種通過網(wǎng)絡(luò)從遠(yuǎn)程計(jì)算機(jī)程序上請(qǐng)求服務(wù),而不需要了解底層網(wǎng)絡(luò)技術(shù)的協(xié)議[3]。
VXI?11協(xié)議定義了三個(gè)通道:核心通道(Core Channel)、中止通道(Abort? Channel)和中斷通道(Interrupt Channel)[4]。三個(gè)通道函數(shù)的調(diào)用均采用RPC方式進(jìn)行。VXI?11協(xié)議所包含的通道及通道調(diào)用方向關(guān)系如圖1所示。
VXI?11整體的通信包括三個(gè)部分:客戶端、服務(wù)器端和Portmap端口映射程序??蛻舳说淖饔檬歉鶕?jù)需要向服務(wù)器端發(fā)起遠(yuǎn)程調(diào)用請(qǐng)求。服務(wù)器端在儀器上運(yùn)行,對(duì)客戶端發(fā)送過來的請(qǐng)求進(jìn)行解析處理并將解析結(jié)果返回客戶端。 Portmap端口映射程序功能是把RPC進(jìn)程標(biāo)識(shí)號(hào)轉(zhuǎn)化為Internet的端口號(hào)[5]。
下面從VXI?11協(xié)議完整功能的開發(fā)以及庫和接口的實(shí)現(xiàn)兩個(gè)方面進(jìn)行介紹。
2? VXI?11協(xié)議完整功能的開發(fā)
2.1? VXI?11協(xié)議開發(fā)
VXI?11協(xié)議開發(fā)的流程如圖2所示。
首先在Linux系統(tǒng)下使用rpcgen命令(該命令可以生成RPC服務(wù)器程序的代碼,它的輸入為一個(gè)規(guī)格說明文件,輸出為一個(gè)C語言的源程序[6])生成VXI?11協(xié)議的框架,然后將其導(dǎo)出至Windows系統(tǒng)中。之后,在Windows系統(tǒng)里新建工程,將導(dǎo)出的文件加入工程并調(diào)試?,F(xiàn)有對(duì)VXI?11開發(fā)的功能函數(shù)僅有2~3個(gè),本系統(tǒng)復(fù)現(xiàn)了現(xiàn)有的功能函數(shù)后,補(bǔ)充完善并實(shí)現(xiàn)所有的功能函數(shù)。
2.2? VXI?11協(xié)議功能函數(shù)
完整的VXI?11協(xié)議共17個(gè)功能函數(shù)。其中,核心通道定義了15個(gè)函數(shù),通過這15個(gè)函數(shù)完成對(duì)網(wǎng)絡(luò)儀器的大部分控制任務(wù)[7],比如向儀器寫入數(shù)據(jù)的寫入函數(shù)和可以讀取儀器狀態(tài)字的讀狀態(tài)字函數(shù);中止通道定義了1個(gè)函數(shù),用于儀器控制端對(duì)儀器優(yōu)先級(jí)較高或緊急的控制任務(wù);中斷通道定義了1個(gè)函數(shù),用于儀器向控制器反饋信息。
在17個(gè)功能函數(shù)中,核心通道的讀取儀器函數(shù)最為復(fù)雜,下面以讀取儀器函數(shù)device_read的開發(fā)為例做介紹。
device_read函數(shù)用于將數(shù)據(jù)從儀器讀取到客戶端。客戶端發(fā)送的數(shù)據(jù)結(jié)構(gòu)體代碼如下:
struct Device_ReadParms {
Device_Link lid;? ? ? ? ? ? ? ? ? ? ? ? ? //來自客戶端的鏈接ID
unsigned long requestSize;
//客戶端一次能接收的最大字節(jié)數(shù)
unsigned long io_timeout;? ? ? ? ? ? ? ? ?//I/O最多傳輸?shù)臅r(shí)間
unsigned long lock_timeout;? ? ? ? ? ? ?//最多等待解鎖的時(shí)間
Device_Flags flags;
char termChar;
//termChar和flags里的termchrset一起使用,當(dāng)termchrset的字符
與termChar匹配時(shí),該字符被傳輸
};
儀器返回給客戶端的數(shù)據(jù)結(jié)構(gòu)體代碼如下:
struct Device_ReadResp {
Device_ErrorCode error;? ? ? ? ? ? ? //讀取失敗的原因標(biāo)志位
long reason;? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//讀取完成的原因標(biāo)志位
opaque data<>;? ? ? ?//返回給客戶端的數(shù)據(jù)長(zhǎng)度和具體數(shù)據(jù)
};
device_read函數(shù)的流程圖如圖3所示。
首先,客戶端發(fā)送讀請(qǐng)求后,運(yùn)行服務(wù)器端的儀器會(huì)根據(jù)客戶端發(fā)送的lid判斷是否可以連接,若不能連接,則返回Error=4;若可以,則判斷其他連接是否有鎖定。如果沒有鎖定,判斷要讀的數(shù)據(jù)是否大于requestSize;若有鎖定,則等待Lock_timeout毫秒的時(shí)間。若在該時(shí)間內(nèi)未解鎖,則返回Error=11、data.data_len=0;否則,判斷要讀的數(shù)據(jù)是否大于RequestSize,若小于則返回Reason=4,若大于則判斷返回的緩沖區(qū)是否已滿,如果已滿,則返回Reason=0,否則繼續(xù)讀。最后判斷是否讀完,若讀完則返回Reason=1,否則繼續(xù)判斷返回的緩沖區(qū)是否滿,直到讀完為止。
3? VXI?11庫及接口的實(shí)現(xiàn)
雖然已將VXI?11協(xié)議開發(fā)完整,但使用起來仍不方便,因此系統(tǒng)將完整開發(fā)的VXI?11協(xié)議封裝成庫,只需在儀器里調(diào)用這個(gè)庫就可以成功啟動(dòng)VXI?11服務(wù),使用起來更為便捷、快速。
此外,系統(tǒng)還提供眾多獨(dú)立封裝接口函數(shù),可滿足大多數(shù)儀器的需求,使用起來更為靈活。其包括1個(gè)服務(wù)啟動(dòng)函數(shù)、1個(gè)可以完成緩沖區(qū)的初始化的緩沖初始函數(shù)和10個(gè)接口函數(shù)。在10個(gè)接口函數(shù)中,讀取數(shù)據(jù)接口較為復(fù)雜,以此函數(shù)為例對(duì)接口函數(shù)做介紹。
讀取數(shù)據(jù)接口定義如下:
typedef struct InputdData{char* DataVal; u_int DataLen;}
InputData;
typedef int (CALLBACK * RdDevice)(InputData data);
RdDevice funcRe;
void ReadVXI11Device(RdDevice func);
{
funcRe = func;
}
首先,定義InputData結(jié)構(gòu)體和一個(gè)回調(diào)函數(shù)類型RdDevice,此回調(diào)函數(shù)的輸入?yún)?shù)類型為InputData型,返回參數(shù)為int型。通過RdDevice即可創(chuàng)建此類型的回調(diào)函數(shù)指針。ReadVXI11Device函數(shù)為庫的導(dǎo)出函數(shù),此函數(shù)功能是將一個(gè)庫外的回調(diào)函數(shù)指針傳遞給VXI?11庫內(nèi)事先定義好的回調(diào)函數(shù)指針funcRe,庫內(nèi)便可以通過指針funcRe調(diào)用到庫外的回調(diào)函數(shù)。
4? 測(cè)? 試
本文測(cè)試使用的是Keysight Connection Expert軟件。在儀器中調(diào)用該系統(tǒng)的VXI?11庫,通過簡(jiǎn)單的幾個(gè)庫函數(shù)便可以成功啟動(dòng)VXI?11服務(wù)。
以大數(shù)據(jù)傳輸為例,在對(duì)儀器進(jìn)行訪問時(shí),不可避免地要對(duì)大量數(shù)據(jù)進(jìn)行傳輸,但由于受客戶端單次最大可接收字節(jié)數(shù)限制,通常無法通過單次操作完成傳輸,而使用本系統(tǒng)的庫,可通過一次讀操作直接完成傳輸,測(cè)試結(jié)果如圖4所示。
當(dāng)儀器(服務(wù)器端)接收到測(cè)試軟件(客戶端)發(fā)出的測(cè)試命令后,會(huì)判斷要讀的數(shù)據(jù)是否大于測(cè)試軟件一次能接收的最大字節(jié)數(shù),測(cè)試軟件默認(rèn)設(shè)置1 024 B,而本次要接收的數(shù)據(jù)為3 000 B,所以讀完1 024 B數(shù)據(jù)后,將繼續(xù)讀1 024 B數(shù)據(jù),直至3 000 B全部讀完,一共讀三次,然后將結(jié)果返回至測(cè)試軟件。從圖4可以看出,通過讀操作,客戶端成功接收了服務(wù)器端的3 000 B數(shù)據(jù)。
5? 結(jié)? 語
本文完成了VXI?11協(xié)議在Windows下完整功能的開發(fā),并且做成庫的形式,給使用者提供接口,解決了現(xiàn)有VXI?11協(xié)議在Windows下開發(fā)的功能還不夠完整、使用起來不方便等問題。經(jīng)驗(yàn)證,功能開發(fā)完整的服務(wù)端程序可以正確響應(yīng)客戶端的VXI?11協(xié)議,并且可以穩(wěn)定地傳輸數(shù)據(jù)。
參 考 文 獻(xiàn)
[1] 沈建飛.基于LXI的數(shù)據(jù)鏈端機(jī)自動(dòng)測(cè)試系統(tǒng)[J].現(xiàn)代導(dǎo)航,2019,10(1):56?59.
[2] 尹洪偉,孫美美,張樹團(tuán).基于VXI?11的LXI儀器發(fā)現(xiàn)技術(shù)研究[J].電子設(shè)計(jì)工程,2011,19(18):18?20.
[3] 邱暢,李龍,鄭艷梅.基于LXI總線PCI接口的軟件設(shè)計(jì)[J].國(guó)外電子測(cè)量技術(shù),2016,35(5):100?103.
[4] 翟龍軍,曲洪東,高山,等.基于DSP和VXI?11協(xié)議的LXI儀器控制與實(shí)現(xiàn)[J].計(jì)算機(jī)測(cè)量與控制,2014,22(11):3691?3693.
[5] 田丹丹.PortMap端口映射器[J].網(wǎng)絡(luò)安全和信息化,2017(2):161.
[6] 耿建平,鄧力.通過VXI?11協(xié)議控制LXI儀器[J].微計(jì)算機(jī)信息,2011,27(10):39?41.
[7] 龐新法.網(wǎng)絡(luò)化儀器儀表協(xié)議客戶端設(shè)計(jì)與實(shí)現(xiàn)[J].現(xiàn)代電子技術(shù),2015,38(18):122?124.
[8] 李延峰,李宥謀,閆海卿,等.LXI網(wǎng)絡(luò)儀器后臺(tái)處理的設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)算機(jī)技術(shù)與發(fā)展,2019,29(3):159?163.
[9] 鄧茂林,姚靜波,解維奇.基于航天測(cè)試技術(shù)的LXI多功能接口板卡設(shè)計(jì)[J].現(xiàn)代電子技術(shù),2014,37(21):94?97.
[10] 鄭馥薇,沈卓煒.基于數(shù)據(jù)分發(fā)服務(wù)的遠(yuǎn)程過程調(diào)用系統(tǒng)[J].計(jì)算機(jī)應(yīng)用,2018,38(z2):239?242.
[11] 張波,萬麗.基于端口映射NAT網(wǎng)絡(luò)方案分析與實(shí)施[J].軟件工程師,2015,18(3):12?13.