蔡永祥 王子龍 張康達(dá)
(中國(guó)汽車(chē)技術(shù)研究中心,天津 300300)
PREEvision是德國(guó)Aquintos公司的一個(gè)自上而下的基于模型的電子電氣架構(gòu)設(shè)計(jì)與開(kāi)發(fā)工具,同時(shí)也是一個(gè)集成電子電氣協(xié)作平臺(tái),覆蓋整個(gè)V字模型的開(kāi)發(fā)與測(cè)試驗(yàn)證階段,包括電子電器需求分析、結(jié)架構(gòu)設(shè)計(jì)、模塊部件開(kāi)發(fā)及后期的測(cè)試驗(yàn)證,并且可以保證多部門(mén)、多流程在同一個(gè)平臺(tái)工具并行協(xié)作。
在以往電子電氣架構(gòu)設(shè)計(jì)過(guò)程中,人們通過(guò)手動(dòng)方式把輸入文件導(dǎo)入PREEvision軟件中,很難做到自動(dòng)分析與數(shù)據(jù)處理,無(wú)法滿足用戶快速完成架構(gòu)設(shè)計(jì)與分析的需求,尤其當(dāng)面對(duì)龐大的數(shù)據(jù)量時(shí),耗費(fèi)時(shí)間的同時(shí)也無(wú)法保證準(zhǔn)確度。
針對(duì)上述問(wèn)題,本文提出一種方法,它不僅能夠快速精確自動(dòng)處理輸入文件并自動(dòng)導(dǎo)入PREEvision,還可從PREEvision中自動(dòng)分析處理并讀取數(shù)據(jù)。
該方法主要包括:C#編寫(xiě)的數(shù)據(jù)處理軟件;基于Socket的多線程異步通信模塊;PREEvision中二次開(kāi)發(fā)的模型數(shù)據(jù)處理引擎這三部分。其系統(tǒng)架構(gòu)如圖1所示,具體實(shí)現(xiàn)方法如下。
為需要處理分析上傳的原始文件,包括Office文件,網(wǎng)絡(luò)通信文件DBC、FIBEX和LDF,線束設(shè)計(jì)文件KBL等。
為使用C#編寫(xiě)的上位機(jī)操作程序,實(shí)現(xiàn)輸入數(shù)據(jù)的編輯、解析、封裝功能,同時(shí)兼做用戶操作界面客戶端。
實(shí)現(xiàn)服務(wù)端與客戶端一對(duì)一的數(shù)據(jù)流式傳輸。作為上位程序與下位機(jī)PREEvision的通訊橋梁。
在PREEvision自帶的控件中,添加JAVA編寫(xiě)序列對(duì)上位機(jī)程序編譯封裝的數(shù)據(jù)解碼,變?yōu)镻REEvision可用的數(shù)據(jù)類(lèi)型。
在PREEvision自帶的控件中,添加JAVA編寫(xiě)序列,使用PREEvision自帶命令將解碼數(shù)據(jù)放置到相應(yīng)的分類(lèi)中,并對(duì)相關(guān)類(lèi)進(jìn)行關(guān)聯(lián)。

圖1 系統(tǒng)架構(gòu)
在客戶端假設(shè)為A的PC上運(yùn)行上位機(jī)程序,對(duì)需求層、規(guī)范層、腳本層、用例層、測(cè)試數(shù)據(jù)層的各種不同格式的文件進(jìn)行導(dǎo)入解析,設(shè)置各層數(shù)據(jù)之間的關(guān)系標(biāo)識(shí)符,設(shè)置完成后通過(guò)Socket和ServerSocket類(lèi)與為服務(wù)器端假設(shè)為B的PC上運(yùn)行的PREEvision建立通信,通過(guò)getInputStream()和getOutputStream()兩個(gè)函數(shù)進(jìn)行遠(yuǎn)程數(shù)據(jù)交互,將解析后的數(shù)據(jù)上傳至PREEvision中,在PREEvision的控件matrix中使用PREEvision自帶的接口函數(shù)編寫(xiě)JAVA代碼,結(jié)合不同層次的標(biāo)志位與層次之間的標(biāo)志位,調(diào)用PREEVision的接口函數(shù)將解碼后的數(shù)據(jù)添加至PREEvision相對(duì)應(yīng)的層次中,并可在PREEvision中對(duì)數(shù)據(jù)進(jìn)行分析。分析結(jié)果用Socket通信發(fā)回A客戶端并在A客戶端的數(shù)據(jù)處理軟件中繪圖展示。
該系統(tǒng)設(shè)計(jì)完成了沒(méi)有安裝PREEvision的PC和有安裝有PREEvision的PC之間的數(shù)據(jù)快速交互。
客戶端不需要安裝PREEvision,安裝C#開(kāi)發(fā)的上位機(jī)程序。客戶端主要完成三個(gè)部分的工作:一是輸入文件的解析編譯;二是與服務(wù)器端進(jìn)行通信;三是監(jiān)控通信狀態(tài)與分析結(jié)果展示。
交互界面將在后面的試驗(yàn)驗(yàn)證處進(jìn)行展示。與服務(wù)器通信將在下節(jié)Socket多線程通信中介紹,此處詳述文件編譯處理部分。
上位機(jī)操作界面現(xiàn)在可以出來(lái)的文件類(lèi)型包括:Word、Excel、XML、DBC、LDF、KBL等,讀取處理方式相似,下面以Word的提取處理方式為例進(jìn)行敘述,Word文件編譯處理流程如圖2所示。
添加引用com文件Microsoft word 11.0 Object Library
定義全局變量
_Applicationapp=newWord.Application();//創(chuàng) 建word
_Document doc=null; //創(chuàng)建 word文檔
通過(guò)文件打開(kāi)對(duì)話框獲取word文件所在位置,代碼如下
OpenFileDialog dlg=new OpenFileDialog();
dlg.Filter = “word 文件 |*.doc”;
if (dlg.ShowDialog() == DialogResult.OK)
{
string fileName = dlg.FileName;
}
打開(kāi)word,代碼如下
object unknow = Type.Missing;
doc=app.Documents.Open(reffileName, ref unknow, ref unknow, ref unknow, ref unknow);
讀取word文檔
stringtemp=doc.Paragraphs[i].Range.Text.Trim();//變量i為第i段
textBox1.Text = temp; //將 第 i段 內(nèi) 容 復(fù) 制 到textbox中

圖2 Word文件編譯處理
為了能夠方便地開(kāi)發(fā)網(wǎng)絡(luò)應(yīng)用軟件,美國(guó)伯克利大學(xué)在Unix上推出了一種應(yīng)用程序訪問(wèn)通信協(xié)議的操作系統(tǒng)調(diào)用Socket。
Socket的出現(xiàn),使程序員可以很方便地訪問(wèn)Tcp/Ip,從而開(kāi)發(fā)各種網(wǎng)絡(luò)應(yīng)用的程序。在網(wǎng)絡(luò)通信中,Socke可以理解為客戶端或服務(wù)器端的一個(gè)特殊對(duì)象,Socket通常被稱(chēng)為“套接字”,用于描述IP地址和端口,是一個(gè)通信鏈的句柄。它可以實(shí)現(xiàn)服務(wù)器與客戶端一對(duì)一的流式傳輸。
一個(gè)完整的Socket通信程序一般包括以下幾個(gè)步驟:創(chuàng)建Socket;打開(kāi)連接到Socket的輸入輸出流;按照一定的協(xié)議對(duì)Socket進(jìn)行讀/寫(xiě)操作;關(guān)閉Socket。
Java使用專(zhuān)門(mén)建立Socket服務(wù)器的類(lèi)ServerSocket來(lái)創(chuàng)建服務(wù)器對(duì)象,ServerSocket server=new ServerSocket(int port),這里提供了一個(gè)端口作為參數(shù),要注意的是端口的分配必須是唯一的。因?yàn)槎丝谑菫榱宋ㄒ粯?biāo)識(shí)每臺(tái)計(jì)算機(jī)唯一服務(wù)的,另外端口號(hào)在0~65535,前1024個(gè)端口已經(jīng)被Tcp/Ip作為保留端口,因此人們所分配的端口只能是1024之后的。Socket通信流程如圖3所示。
建立服務(wù)器端的Socket對(duì)象步驟如下:
(1)創(chuàng)建一個(gè)服務(wù)器端套接字,并綁定到指定端口上。
ServerSocket ss=new ServerSocket(int port);
(2)調(diào)用accept(),監(jiān)聽(tīng)連接請(qǐng)求,如果客戶端請(qǐng)求連接,則接受連接,返回通信套接字。
Socket s=ss.accept();
(3) 調(diào) 用Socket 類(lèi) 的getOutputStream()和getInputStream獲取輸出流和輸入流,開(kāi)始網(wǎng)絡(luò)數(shù)據(jù)的發(fā)送和接收。
OutputStream os=s.getOutputStream();
InputStream is=s.getInputStream();
os.write(“Hello,this is server! “.getBytes());//向客戶端發(fā)送數(shù)據(jù)
byte[] buf=new byte[100];
int len=is.read(buf);//從客戶端讀取數(shù)據(jù)

圖3 Socket通信流程
報(bào)文編碼格式如圖4所示,服務(wù)器接收數(shù)據(jù)以后需做以下處理工作:
(1)對(duì)數(shù)據(jù)進(jìn)行解析。解析過(guò)程為根據(jù)字符串(字符串的第一個(gè)單詞作為關(guān)鍵字)的關(guān)鍵字進(jìn)行哈希運(yùn)算。哈希運(yùn)算以后得到不同類(lèi)別的包類(lèi)構(gòu)造函數(shù)。
(2)調(diào)用第一步查找回來(lái)的構(gòu)造函數(shù)進(jìn)行對(duì)象的構(gòu)造。構(gòu)造完成以后PREEvsion的對(duì)應(yīng)層次中自動(dòng)產(chǎn)生構(gòu)造的對(duì)象。
(3)第一步和第二步完成以后,PREEvison的對(duì)象已經(jīng)生成成功。接下來(lái)需要把需求層、測(cè)試規(guī)范層、測(cè)試腳本層、測(cè)試結(jié)果層構(gòu)造的對(duì)象關(guān)聯(lián)起來(lái)。關(guān)聯(lián)方法為調(diào)用PREEVison的Map函數(shù)。輪詢各個(gè)對(duì)象下的子對(duì)象進(jìn)行對(duì)象的查找,并根據(jù)關(guān)鍵字進(jìn)行關(guān)聯(lián)(對(duì)象名的第一單詞作為關(guān)鍵字)。
(4)通過(guò)以上工作以后數(shù)據(jù)已經(jīng)保存到PREEvision中。PREEVison提供了統(tǒng)計(jì)測(cè)試結(jié)果的函數(shù)Result()。調(diào)用Result()函數(shù)可以得到測(cè)試結(jié)果的需求覆蓋率數(shù)值。這些數(shù)值通過(guò)Socket函數(shù)傳回給客戶端UI。客戶端通過(guò)C#提供的繪圖控件繪制出覆蓋度圖形。

圖4 報(bào)文編碼格式
該系統(tǒng)可以實(shí)現(xiàn)C#開(kāi)發(fā)的客戶端和PREEVision中模型數(shù)據(jù)的交互分析。系統(tǒng)的使用減少了建立模型的工作量,縮短了建立模型的時(shí)間。與手動(dòng)建模比對(duì)驗(yàn)證可知,使用自動(dòng)建模方式準(zhǔn)確率更高,時(shí)間短,效率高。C#編寫(xiě)的界面可以快速方便地查看測(cè)試用例的覆蓋度。客戶端操作界面和數(shù)據(jù)分析界面分別如圖5、圖6所示,PREEVision數(shù)據(jù)分析界面、PREEVision中模型結(jié)構(gòu)、PREEVision中算法開(kāi)發(fā)分別如圖7、圖8和圖9所示。

圖5 客戶端操作界面

圖6 客戶端數(shù)據(jù)分析界面

圖7 PREEVision數(shù)據(jù)分析界面

圖8 PREEVision中模型結(jié)構(gòu)

圖9 PREEVision中算法開(kāi)發(fā)
基于Socket通信的PREEvision二次開(kāi)發(fā),使用Socket多線程通信,傳輸數(shù)據(jù)時(shí)間短,性能高,客戶端與服務(wù)器端之間可實(shí)時(shí)進(jìn)行信息交互,數(shù)據(jù)安全性強(qiáng)。C#開(kāi)發(fā)的客戶端和PREEVision中的二次開(kāi)發(fā)模塊的配合使用實(shí)現(xiàn)了數(shù)據(jù)在沒(méi)有安裝PREEvision的PC和有安裝有PREEvision的PC之間的快速交互。這樣既節(jié)約了軟件采購(gòu)成本,又提高了建立模型的效率。
[1]何進(jìn),謝松巍.基于Socket的TCP/IP網(wǎng)絡(luò)通訊模式研究[J].計(jì)算機(jī)應(yīng)用研究,2001,(8):134-135.
[2]周炎濤,李立明.TCP/IP協(xié)議下網(wǎng)絡(luò)編程技術(shù)及其實(shí)現(xiàn)[J].航空計(jì)算技術(shù),2002,(3):122-124.
[3]馮香枝,胡朝峰,張海濤.基于PREEvision的汽車(chē)電子電氣架構(gòu)設(shè)計(jì)[J].汽車(chē)電器,2013,(10):43-46.
[4]梁宏煒.用C#實(shí)現(xiàn)多線程Socket的通信[J].數(shù)字技術(shù)與應(yīng)用,2013,(6):60.
[5]肖美華,余立全,肖攀.SOCKET通信程序模型抽取及可靠性驗(yàn)證[J].計(jì)算機(jī)科學(xué),2012,39(11):102-105.
[6]茹志鵑.基于TCP協(xié)議的Socket數(shù)據(jù)通信[J].科技信息,2012,(13):93.
[7]李純潔.基于PREEvision的汽車(chē)電子電氣架構(gòu)設(shè)計(jì)與研究[D].上海:上海交通大學(xué),2011:11.
[8]Liu Qigang,Sun Xiangyang.Research of Web Real-time Communication Based on Web Socket[J].International Journal of Communications Network & System Sciences,2012,5(12):797-801.
[9]夏玲,王偉平.客戶端與服務(wù)器端的Socket通信[J].電腦知識(shí)與技術(shù),2009,5(4):812-813.
[10]羅亞非.基于TCP的Socket多線程通信[J].電腦知識(shí)與技術(shù),2009,5(3):563-565.
[11]馮峻域,戴青云,植俊文.基于多線程串口通信的生產(chǎn)數(shù)據(jù)實(shí)時(shí)采集系統(tǒng)[J].微計(jì)算機(jī)信息,2006,(10):149-151.