劉逸涵 李興智 宋丫 航空工業(yè)西安航空計(jì)算技術(shù)研究所
中間件是一類連接軟件組件和應(yīng)用的計(jì)算機(jī)軟件。以便于運(yùn)行在一臺(tái)或多臺(tái)機(jī)器上的多個(gè)軟件通過網(wǎng)絡(luò)進(jìn)行交互。該技術(shù)所提供的互操作性,使得一致分布式體系架構(gòu)的演進(jìn),該架構(gòu)通常用于支持并簡(jiǎn)化那些復(fù)雜的分布式應(yīng)用程序。
中間件在操作系統(tǒng)、網(wǎng)絡(luò)和數(shù)據(jù)庫(kù)之上,應(yīng)用軟件的下層,總的作用是為處于自己上層的應(yīng)用軟件提供運(yùn)行與開發(fā)的環(huán)境,幫助用戶靈活、高效地開發(fā)和集成復(fù)雜的應(yīng)用軟件。在眾多關(guān)于中間件的定義中,比較普遍被接受的是IDC表述的:中間件是一種獨(dú)立的系統(tǒng)軟件或服務(wù)程序,分布式應(yīng)用軟件借助這種軟件在不同的技術(shù)之間共享資源,中間件位于客戶機(jī)服務(wù)器的操作系統(tǒng)之上,管理計(jì)算資源和網(wǎng)絡(luò)通信。
中間件能夠屏蔽操作系統(tǒng)和網(wǎng)絡(luò)協(xié)議的差異,為應(yīng)用程序提供多種通訊機(jī)制,并提供相應(yīng)的平臺(tái)以滿足不同領(lǐng)域的需要。因此,中間件為應(yīng)用程序提供了一個(gè)相對(duì)穩(wěn)定的高層應(yīng)用環(huán)境。然而,中間件服務(wù)也并非適用于所有情況,多數(shù)流行的中間件服務(wù)使用專有的API和專有的協(xié)議,使得應(yīng)用建立于單一廠家的產(chǎn)品,來自不同廠家的實(shí)現(xiàn)很難互操作。有些中間件服務(wù)只提供一些平臺(tái)的實(shí)現(xiàn),從而限制了應(yīng)用在異構(gòu)系統(tǒng)之間的移植。
通信中間件是位于應(yīng)用平臺(tái)和硬件通信平臺(tái)(通信介質(zhì)/協(xié)議)之間解決嵌入式系統(tǒng)網(wǎng)絡(luò)互連的中間適配層。該層向下屏蔽掉硬件網(wǎng)絡(luò)通信接口平臺(tái)(RS232/485、USB、以太網(wǎng)、Modem等)的差異,即基于不同介質(zhì)、不同電氣特性和不同協(xié)議的網(wǎng)絡(luò)、設(shè)備之上,能夠?qū)Ω鞣N標(biāo)準(zhǔn)的數(shù)據(jù)傳輸接口進(jìn)行透明傳輸,向上為用戶層提供一個(gè)統(tǒng)一的標(biāo)準(zhǔn)接口,應(yīng)用層的開發(fā)基于該接口進(jìn)行。通信中間件的核心思想就是定義一組接口通信的標(biāo)準(zhǔn),以及為這一標(biāo)準(zhǔn)提供基礎(chǔ)設(shè)施,其它高層的軟件均遵照這種標(biāo)準(zhǔn)來構(gòu)造應(yīng)用程序,使得符合通信中間件規(guī)范的接口通信有著很強(qiáng)的互操作性。
首先,當(dāng)系統(tǒng)通信接口平臺(tái)改變時(shí),只需改變中間適配層的幾個(gè)參數(shù),只要保持應(yīng)用層對(duì)通信中間件層的接口定義不變,就可以直接將應(yīng)用程序移植過去運(yùn)行。所有代碼只需編寫一次就可在任何系統(tǒng)上運(yùn)行,大大縮短了系統(tǒng)研制的周期,提高了開發(fā)效率,同時(shí)還保證了系統(tǒng)的高伸縮性、易升級(jí)性和穩(wěn)定性。其次,通信中間件屏蔽了底層通信平臺(tái)的差異,提供了標(biāo)準(zhǔn)的封裝接口。當(dāng)系統(tǒng)的底層通信接口改變時(shí),不用修改應(yīng)用程序,只需在通信中間件的驅(qū)動(dòng)層增加幾個(gè)相應(yīng)的通信接口控件驅(qū)動(dòng)即可實(shí)現(xiàn)對(duì)新接口的適配,從而就能保證通信系統(tǒng)在線運(yùn)行情況下,接入各種新設(shè)備,以不變的程序應(yīng)對(duì)萬變的協(xié)議,從而達(dá)到系統(tǒng)之間的互通、互連、互操作的目的,使得系統(tǒng)維護(hù)使用真正做到“傻瓜智能”。
整個(gè)通信的硬件平臺(tái)采用基于ARM微處理器的嵌入式通信硬件平臺(tái),底層通信接口包括RS232串行接口、USB、以太網(wǎng)接口、Modem及擴(kuò)展接口等。
通用通信軟件適配層(即中間件層)定義和設(shè)計(jì)支持各種通信接口的通用通信協(xié)議。該層向下與各種通信接口相適配,向上提供與通信接口無關(guān)的統(tǒng)一接口。應(yīng)用平臺(tái)是利用ACOM通信中間件通過各種通信接口以及通信協(xié)議實(shí)現(xiàn)命令、數(shù)據(jù)和消息的傳遞。
我們利用分層體系結(jié)構(gòu)思想對(duì)通信中間件ACOM進(jìn)行設(shè)計(jì),在設(shè)計(jì)中,將其分為三層結(jié)構(gòu):API層、socket層、driver層。這種分層式設(shè)計(jì)思想可以將每一層協(xié)議的實(shí)現(xiàn)細(xì)節(jié)對(duì)相鄰協(xié)議層加以屏蔽,提供服務(wù)訪問接口進(jìn)行層間數(shù)據(jù)傳遞,各層數(shù)據(jù)獨(dú)立封裝。發(fā)送和接收端的各層協(xié)議存在邏輯上的點(diǎn)對(duì)點(diǎn)連接。
Driver層(設(shè)備驅(qū)動(dòng)層):
ACOM定義了一系列的設(shè)備驅(qū)動(dòng)函數(shù)來建立與物理層的接口及與socket層的接口。通過建立設(shè)備驅(qū)動(dòng)數(shù)據(jù)結(jié)構(gòu)來控制設(shè)備的通信,在數(shù)據(jù)結(jié)構(gòu)中定義相應(yīng)的函數(shù)指針用以調(diào)用相應(yīng)的設(shè)備通信函數(shù)。
Socket層(設(shè)備抽象層):
該層定義關(guān)于通信控件設(shè)備的一些信息屬性,如:通信控件設(shè)備驅(qū)動(dòng)信息屬性、數(shù)據(jù)包信息屬性、通信設(shè)備socket信息屬性、信息屬性等,及數(shù)據(jù)處理函數(shù),包括數(shù)據(jù)的編譯碼、數(shù)據(jù)的打包及讀寫數(shù)據(jù)緩存操作和系統(tǒng)目標(biāo)析構(gòu)函數(shù)。
API層(用戶程序接口層):
ACOM軟件的應(yīng)用程序接口(簡(jiǎn)稱API)向用戶提供ACOM的初始化、ACOM控件接口操作、及ACOM用戶API三大功能。ACOM的初始化函數(shù)向用戶提供ACOM系統(tǒng)的初始化及釋放功能;控件接口操作函數(shù)向用戶提供對(duì)ACOM設(shè)備控件初始化操作,當(dāng)初始化完成后,底層的操作對(duì)用戶是透明的;ACOM API向用戶提供對(duì)消息的基本操作功能。從通信中間件的設(shè)計(jì)可以看出,用戶在使用數(shù)據(jù)對(duì)象時(shí)只能訪問由通信軟件提供的一個(gè)標(biāo)準(zhǔn)用戶程序接口,其他所有有關(guān)對(duì)象的信息則保存在驅(qū)動(dòng)層中。對(duì)用戶而言,這些對(duì)象信息已被隱藏封裝起來,屏蔽了底層操作。而對(duì)于底層驅(qū)動(dòng)的設(shè)計(jì)是指當(dāng)?shù)讓油ㄐ沤涌诟淖儠r(shí),不用修改應(yīng)用程序,只需在driver層增加幾個(gè)相應(yīng)的通信接口控件驅(qū)動(dòng)即可實(shí)現(xiàn)對(duì)新接口的適配,通過ACOM軟件的通用性達(dá)到其設(shè)計(jì)目的。
以設(shè)計(jì)實(shí)現(xiàn)兩臺(tái)設(shè)備網(wǎng)絡(luò)通訊為例講述一下利用通信中間件通信時(shí)的數(shù)據(jù)流程。
用戶A:用戶激活接口控件,Acom消息循環(huán)收到系統(tǒng)消息,此消息中包含欲連接的對(duì)方的地址及一些其它信息。Acom根據(jù)命令初始化Acom_driver,驅(qū)動(dòng)該控件的緩沖區(qū)及函數(shù)指針按照相應(yīng)設(shè)備的規(guī)定作相應(yīng)初始化。在Acom_driver調(diào)用Acom_open_socket函數(shù)創(chuàng)建socket,socket層讀取命令,按照Acom協(xié)議的規(guī)定調(diào)用Acom_code函數(shù)對(duì)請(qǐng)求消息進(jìn)行編碼及Acom_pack函數(shù)進(jìn)行打包,將數(shù)據(jù)包放入底層driver層的發(fā)送緩沖區(qū),調(diào)用發(fā)送函數(shù)。
用戶B:driver層收到A發(fā)來的數(shù)據(jù)(連接請(qǐng)求),Acom消息循環(huán)讀取driver層接收緩沖區(qū)內(nèi)容。當(dāng)發(fā)現(xiàn)是請(qǐng)求連接的消息后,根據(jù)數(shù)據(jù)包中所帶的源地址創(chuàng)建socket以進(jìn)行通信。socket層將確認(rèn)信號(hào)進(jìn)行編碼打包發(fā)送至driver層的發(fā)送緩沖區(qū)。driver直接再將數(shù)據(jù)發(fā)送至A方的driver。
用戶A:driver層收到確認(rèn)消息后進(jìn)行解碼,socket層讀取轉(zhuǎn)發(fā)至Acom消息循環(huán)。上層判定為確認(rèn)信息則根據(jù)用戶需要發(fā)送相應(yīng)的命令至socket層,socket層根據(jù)命令調(diào)用相應(yīng)的函數(shù),如短消息通信或文件傳輸。
ACOM通信中間件系統(tǒng)的設(shè)計(jì)基本實(shí)現(xiàn)了整個(gè)系統(tǒng)的框架結(jié)構(gòu)與基本的通信接口通訊功能。系統(tǒng)采用分層結(jié)構(gòu)設(shè)計(jì)的思想,引入了設(shè)備抽象層的概念,使系統(tǒng)可以很方便地進(jìn)行應(yīng)用程序的移植和調(diào)試工作,并可以跨平臺(tái)實(shí)現(xiàn)系統(tǒng)移植。用戶無需訪問底層程序,只需要調(diào)用系統(tǒng)提供的標(biāo)準(zhǔn)用戶程序接口就可以實(shí)現(xiàn)對(duì)通訊協(xié)議的訪問和使用。所有代碼都只需編寫一次就可在任何系統(tǒng)上運(yùn)行,大大縮短了系統(tǒng)研制的周期,提高了開發(fā)效率,同時(shí)保證了系統(tǒng)的易升級(jí)性。