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