李 瑋,董淵科
(1.西北工業大學 軟件與微電子學院,陜西 西安 710072;2.西北工業大學 航海學院,陜西 西安 710072)
隨著ETX、SPT2C、ATPPC等嵌入式模塊的規模化生產,設計技術的成熟,對這些模塊的驗收測試、仿真與其交聯的模塊、驗證其功能、性能及接口的工作也越來越頻繁。現代自動測試系統是由多個分系統組成的,每個分系統由通用系統或專用系統實現,并承擔一部分相對獨立的測控任務,各分系統之間通過信息交換實現并行與協同工作,共同實現整個自動測試系統的功能[1]。提出一種采用客戶機/服務器模式的測試系統。該系統讓每個客戶機負責在本地對嵌入式模塊的接口進行測試,而服務器負責各項測試命令的發送以及結果的接收和顯示,這樣可使測試部分和控制部分分離,便于模塊化設計,提高整個測試系統的運行效率。
測試系統分為測試平臺和控制平臺2部分,控制平臺相當于服務器,負責測試命令的發送。測試平臺用于對嵌入式模塊接口進行本地測試,它啟動后必須連接到控制平臺獲得測試的相關信息后方可進行測試。對于測試平臺的主體部分,測試人員可以根據被測對象使用不同的語言和方式進行設計,可以不局限于使用與控制平臺相同的語言,這也是采用C/S模式的優勢。測試臺-控制臺通信流程如圖1所示。
在各模塊交聯測試中,測試的命令與結果數據量一般都很小,往往測試平臺反饋給控制平臺的結果只有正常/異常,或者一些簡略的異常信息,但是也有一些測試平臺需要將一些大容量的文件信息發送給控制平臺進行存儲并顯示,在此,以小數據量的通信來設計網絡傳輸中的數據包格式。
測試系統的網絡通信是基于TCP/IP協議的。選用TCP/IP協議是因為它在基本的IP數據包上增加了可靠性和流量控制,其流式套接字定義了一種可靠的面向連接的服務,實現了無差錯無重復的順序數據傳輸[2]。
1.2.1 通信協議

測試系統通過發送一定格式的數據包來實現網絡通信。一次發送和接收命令信息的緩沖區大小為1 024字節,一次通信過程(發送/接收)只能包含一個命令或結果。具體協議的格式為:狀態字段+數據長度字段+命令字段+數據字段。信息結構格式見表1。

表1 命令信息結構表Tab.1 Structure of command packet
在此還需注意的是,控制平臺和測試平臺在開發過程中可能是用不同的開發環境或不同的編程語言,由此而產生相同的數據類型可能所占的字節數不同,雙方需要約定數據包中各字段的數據存放方式與所代表的數據類型。同時可以根據具體調試臺系統的需要設計不同的命令字段和狀態字段編碼。
1.2.2 CAsyncSocket特性分析
CAsyncSocket提供全面的由事件驅動的Socket通信能力,應用程序要響應Windows Socket激發的事件,就要創建自己派生的Socket子類捕獲和響應事件[3]。由于CAsyncSocket是虛擬了一個消息池,借助它來完成各部分的消息循環,所有的操作必須在一個線程里完成才可以,其本身是異步的,已經設置了類似于多線程的機制。因此在使用CAsyncSocket實現網絡通信時,不需要使用多線程技術,只要將CAsyncSocket與MFC的消息響應機制進行有效地結合,就可以提高網絡通信的處理效率。
為了說明問題,建立一個會話程序的例子,控制平臺和測試平臺分別獨立編程。因為在工程中控制平臺除了進行網絡通信可能還負擔有別的功能,所以本例中控制平臺被建立為單文檔MFC應用程序ServerProject,使用向導生成,選擇支持WinSock;測試平臺被建立為基于對話框的MFC應用程序ClientProject,使用向導生成,選擇支持 WinSock。在控制平臺和測試平臺都自定義派生于CAsyncSocket類的CMySocket類。
從軟件設計一致性的角度,關于socket的全部處理都使用MFC消息響應機制,所以在控制平臺和測試平臺都需要構造以下4類消息[4]:
1)WM_MY_INITSOCKET 消息,初始化 Socket;
2)WM_MY_MESSAGE消息,發送 Socket數據;
3)WM_MY_RECEIVE消息,接收來自Socket的數據;
4)WM_MY_CLOSE消息,接收Socket連接斷開的事件。
以上消息分別對應于 OnMyInitial (),OnMyMessage(),OnMyReceive(),OnMyClose()等函數。
在實際工程中,控制平臺的應用程序往往會有多個對話框,網絡通信的結果也需要在多個對話框中傳遞,經過實驗,在ServerProjectView類中生成并調用CMySocket類的對象是一種可靠的方法。
在ServerProjectView類中需要一個新的消息WM_MY_ACCEPT,用于處理Socket的OnAccept函數[5],它所對應的函數為OnMyAccept()。在ServerProjectView.cpp中聲明全局變量m_listenSocket用于控制平臺監聽連接請求,m_connectSocket用于處理連接Socket。ServerProjectView類的工作過程如下:
1)應用程序啟動時,響應WM_MY_INITSOCKET消息,在OnMyInitial()函數中初始化全局變量,調用Create函數將端口號與控制平臺本地IP地址綁定于m_listenSocket變量,調用Listen()函數,使m_listenSocket變量處于監聽狀態;
2)測試平臺啟動并發起連接請求后,響應WM_MY_ACCEPT消息,完成Socket連接;
3)測試人員根據相關界面進行操作,確定要發送的測試命令后,響應WM_MY_MESSAGE消息,調用Send函數將這些測試命令數據包發送給測試平臺;
4)Socket接收到測試結果后,響應WM_MY_RECEIVE消息,解析所得數據獲得結果。
在CMySocket類中需要聲明常量MAX_MSG_PACKET為1 024,還需要聲明如下變量:
1)BYTE m_nBuffer[MAX_MSG_PACKET+1];//m_nBuffer為類的數據緩沖區
2)UINT m_nLength;//m_nLength為緩沖區大小值
3)CView*pView;//視類指針
CMySocket類的工作過程如下:
1)函數 bool CMySocket::GetView()獲取應用程序視類指針,并賦值給pView;
2)函數 void CMySocket::OnAccept(int nErrorCode)接收到連接請求,處理FD_ACCEPT事件,通過視類指針發送WM_MY_ACCEPT消息;
3)函數 void CMySocket::OnReceive(int nErrorCode)處理FD_READ事件,通過視類指針發送WM_MY_RECEIVE消息,將數據緩沖區接收到的數據發送給ServerProjectView類。
測試平臺為一個基于對話框的應用程序ClientProject,在ClientProjectDlg類中生成并調用CMySocket類的對象。
在ClientProjectDlg中聲明全局變量m_clientSocket用于與控制平臺進行網絡通信。ClientProjectDlg類的工作過程如下:
1)應用程序啟動時,響應WM_MY_INITSOCKET消息,在OnMyInitial()函數中初始化全局變量,調用Create函數,無需指定端口號,但必須指定控制平臺的IP地址serverIP,因為Create函數中觸發了FD_CONNECT事件,m_clientSocket會自動向控制平臺發起連接請求;
2)Socket接收到測試命令后,響應 WM_MY_RECEIVE消息,解析所得數據獲得命令;
3)執行完成測試命令并得到測試結果后,根據協議將數據構造測試結果數據包,響應WM_MY_MESSAGE消息,調用Send函數將這些測試結果數據包發送給控制平臺。
在CMySocket類中需要聲明常量MAX_MSG_PACKET為1 024,需要聲明如下變量:
1)YTE m_nBuffer[MAX_MSG_PACKET+1];//m_nBuffer 為類的數據緩沖區
2)INT m_nLength;//m_nLength為緩沖區大小值
3)ClientProjectDlg*pMyDialog;//對話框類指針
CMySocket類的工作過程如下:
1)函數 bool CMySocket::GetDlg()獲取應用程序對話框類指針,并賦值給pMyDialog;
2)函數 void CMySocket::OnReceive(int nErrorCode)處理FD_READ事件,通過視類指針發送WM_MY_RECEIVE消息,將數據緩沖區接收到的數據發送給ClientProjectDlg類。
作為基于網絡通信的測試系統,應具有最大的可擴展性和高穩定性[6]。由于TCP/IP協議采用3次握手建立連接,提供可靠的數據流服務,可以保證其基礎上所搭建的測試系統的高穩定性。在項目測試實驗過程中,網絡通信達到無誤碼率,滿足嵌入式模塊接口測試對結果準確性的需求。
該網絡通信技術應用于地圖嵌入式模塊測試及語音嵌入式模塊測試。其中前者需要進行命令通信,而后者既需要傳輸命令,又需要傳輸大批量的語音文件。此時專用通信協議表現出良好的可移植性,通過對命令信息結構的數據字段的擴展,實現語音文件的可靠和高速傳輸。
在設計過程中,異常處理是影響系統穩定性的關鍵。當網絡電纜被拔出、測試臺程序或控制臺程序被強制關閉時,需要及時被發現并處理。因此,在控制臺設置定時器,周期查詢連接是否正常,結合WM_MY_CLOSE消息的接收情況,對異常情況進行有效識別并處理。
提出了一種針對嵌入式模塊接口性能測試系統的網絡通信方式,使用了Visual C++6.0 MFC平臺,主要運用了MFC封裝的CAsyncSocket類的相關特性,并將之與MFC具有的消息響應機制結合,通過引入自定義的通信協議,達到快速穩定的通信效果。所有代碼均來源于自動化測試軟件的實際工程中,在Visual C++6.0平臺下調試通過。
[1]張元,韓燮.網絡化測試系統中問件的研究與設計[J].計算機工程與設計,2009,30(22):5279-5283.ZHANG Yuan,HAN Xie.Research and design of middleware in network test system[J].Computer Engineering and Design,2009,30(22):5279-5283.
[2]李峰,陳向益.TCP/IP—協議分析與應用編程[M].北京:人民郵電出版社,2008.
[3]李文天,董祥軍,張潔.用MFC CAsyncSocket類實現計算機間的通信[J].山東輕工業學院學報,2001,15(1):21-25.LI Wen-tian,DONG Xiang-jun,ZHANG Jie.Realizing the computer communication by using MFC CAsyncSocket class[J].Journal of Shandong Institute of Light Industry,2001,15(1):21-25.
[4]曾小立.基于TCP/IP的數據遠程傳輸的實現[J].三峽大學學報:自然科學版,2002(24):432-433.ZENG Xiao-li.The implementation of the data-transmission based on TCP/IP[J].Jounal of China Three Gorges University:Natural Science,2002(24):432-433.
[5]羅瑜,胡榮強.遠程監控系統中網絡通信的研究與實現[D].武漢:武漢理工大學,2006.
[6]王瑞斌,李鳳崎,施玉勛,等.基于IOCP機制的網絡游戲服務器通信層的實現[J].計算機工程與應用,2009,45(7):75-78 WANG Rui-bin,LI Feng-qi,SHI Yu-xun,et al.Realization of IOCP-based net layer of online games server[J].Computer Engineering and Applications,2009,45(7):75-78.