何用輝
(福建信息職業(yè)技術(shù)學(xué)院機電工程系,福建福州350003)
許多嵌入式環(huán)境下的分布式系統(tǒng)是基于進程間的顯式消息進行信息交換的,其發(fā)送和接收過程無法隱藏通信過程.這種方式的缺點是開發(fā)者需要了解網(wǎng)絡(luò)接口及使用方式,通信過程對開發(fā)者來說不透明,必須親自關(guān)心數(shù)據(jù)的發(fā)送和接收,極大影響了程序的開發(fā)效率.鑒于CAN總線在嵌入式系統(tǒng)中的廣泛應(yīng)用,設(shè)計并實現(xiàn)了一種可運行于嵌入式CAN網(wǎng)絡(luò)的RPC協(xié)議及其實現(xiàn)方法,通過使用一致的協(xié)議和提供基礎(chǔ)性的底層服務(wù),使得開發(fā)人員不必為如何實現(xiàn)通信而煩惱,從而可以把注意力集中到如何解決問題上,有效地改進現(xiàn)有工業(yè)控制系統(tǒng)的開發(fā)效率.
RPC可分為異步RPC和同步RPC,在調(diào)用方發(fā)出RPC請求后,調(diào)用進程會被掛起的為同步RPC,反之為異步RPC,這里所描述的RPC為同步RPC.RPC通過如下基本過程實現(xiàn)對開發(fā)者隱藏通信細(xì)節(jié)的目的.節(jié)點A調(diào)用節(jié)點B上的進程時,節(jié)點A上的調(diào)用進程將被掛起,而B上被調(diào)用的進程開始執(zhí)行.調(diào)用方使用參數(shù)將信息提供給被調(diào)用方,然后被調(diào)用方用返回值的形式將結(jié)果傳回調(diào)用方.
在這種方式下,客戶端的開發(fā)者可以以正常的方式調(diào)用某個函數(shù).當(dāng)這個函數(shù)的實現(xiàn)被放在遠程服務(wù)器時,在本機的函數(shù)體中放入RPC調(diào)用的實現(xiàn)版本,稱之為客戶存根(client).這個客戶存根首先阻塞源程序,同時對接口函數(shù)的參數(shù)類型和字節(jié)數(shù)進行統(tǒng)一封裝,調(diào)用網(wǎng)絡(luò)接口函數(shù),發(fā)送RPC請求包到遠程服務(wù)器.遠程服務(wù)器接收到這個數(shù)據(jù)包后,將它傳遞給一個稱作服務(wù)器存根(server stub)的進程.服務(wù)器存根對這個包進行解析并提取需要的參數(shù),同時調(diào)用相應(yīng)的函數(shù)實體,并返回相應(yīng)的執(zhí)行結(jié)果.然后,服務(wù)器存根返回這個結(jié)果給客戶端,客戶端重新喚醒相應(yīng)的進程,使原程序繼續(xù)運行.這樣,對開發(fā)者來講,整個過程就好像是本地調(diào)用一樣.
RPC的另一個關(guān)鍵是設(shè)計一個通信綁定過程.圖1所示為基于TCP/IP協(xié)議棧的RPC協(xié)議所采用的方法示意圖.首先,服務(wù)進程向本機守護程序注冊一個端口號,然后服務(wù)進程向目錄機器的目錄服務(wù)進程注冊一個服務(wù)名稱.之后,客戶進程就可以調(diào)用服務(wù)進程了.客戶端首先把需要的服務(wù)名稱傳給目錄服務(wù)器,目錄服務(wù)器返回具有此服務(wù)的服務(wù)器網(wǎng)絡(luò)地址,客戶進程隨后向該機器的守護進程(它具有公開的端口號)發(fā)出請求,目標(biāo)服務(wù)器守護進程查詢端口表并返回相應(yīng)服務(wù)的端口號,客戶進程最后通過獲得的網(wǎng)絡(luò)地址和服務(wù)端口號進行RPC連接.
圖1 RPC服務(wù)綁定過程
通過上面分析可知,在嵌入式環(huán)境下(特別是在非以太網(wǎng)的網(wǎng)絡(luò)環(huán)境下),由于系統(tǒng)對資源有著嚴(yán)格的限制,用上述一般方法實現(xiàn)RPC是很困難的,甚至無法實現(xiàn).因此,設(shè)計了一個適用于嵌入式環(huán)境下的簡單、分層RPC協(xié)議,根據(jù)RPC協(xié)議原理,將RPC協(xié)議的嵌入式實現(xiàn)分成了如下3個部分:客戶存根處理模塊、服務(wù)器存根處理模塊和協(xié)議數(shù)據(jù)格式.
1)客戶存根處理模塊.模塊處理過程如圖2所示.
圖2 RPC客戶存根處理模塊
這個模塊實現(xiàn)了客戶端的RPC處理過程.在每個RPC客戶機器上實現(xiàn)一個客戶存根處理進程,這個進程負(fù)責(zé)處理本機的各個RPC調(diào)用,維護一個全局的消息隊列.當(dāng)用戶進程調(diào)用一個RPC函數(shù)時,本地函數(shù)的實現(xiàn)部分會打包相關(guān)消息(這個消息包含有RPC調(diào)用號、創(chuàng)建的接收郵箱地址、參數(shù)組編等信息),然后發(fā)送到這個消息隊列中.客戶存根處理進程將提取、解析這些消息包,然后通過網(wǎng)絡(luò)發(fā)送詢問幀以查找具有相應(yīng)服務(wù)的主機.找到后再將這個消息包打包發(fā)送到對應(yīng)主機,并接收主機的返回結(jié)果.最后將結(jié)果發(fā)送到用戶進程的郵箱中,從而喚醒用戶進程.同時,客戶存根處理進程還維護一個RPC處理狀態(tài)表,以方便客戶處理這些消息包.這個狀態(tài)表保存有RPC調(diào)用處理過程的一些狀態(tài)信息(比如狀態(tài)表保存了RPC調(diào)用的開始狀態(tài)、調(diào)用主機查詢狀態(tài)、消息返回、處理成功、超時時間等狀態(tài)).
2)服務(wù)器存根處理模塊.模塊處理過程如圖3所示.
圖3 服務(wù)存根處理模塊
這個模塊實現(xiàn)了服務(wù)器端的RPC處理過程,本機的RPC服務(wù)均在這個模塊中實現(xiàn).首先,客戶機器的一個RPC調(diào)用將會觸發(fā)服務(wù)器的RPC中斷,RPC中斷處理函數(shù)將網(wǎng)絡(luò)消息放到服務(wù)器存根的全局消息隊列中.服務(wù)器存根處理進程進行消息提取、消息解析、調(diào)用服務(wù)函數(shù)表中的相應(yīng)服務(wù)函數(shù)、發(fā)送RPC結(jié)果等操作.同時,類似于客戶端處理進程,服務(wù)器存根處理進程也維護一個RPC處理狀態(tài)表,用以標(biāo)志處理過程的相應(yīng)狀態(tài).
3)協(xié)議數(shù)據(jù)格式模塊.這個模塊分2個部分,一部分是用戶進程向客戶端處理進程發(fā)送的處理消息格式,另一部分是網(wǎng)絡(luò)傳輸?shù)臄?shù)據(jù)格式.
CAN總線是一種有效支持分布式控制或?qū)崟r控制的串行通訊網(wǎng)絡(luò),其總線規(guī)范已被ISO國際標(biāo)準(zhǔn)化組織制定為國際標(biāo)準(zhǔn).根據(jù)國際CAN 2.0B的技術(shù)規(guī)范,CAN2.0B含有標(biāo)準(zhǔn)數(shù)據(jù)幀和擴展數(shù)據(jù)幀,兩者區(qū)別是幀的仲裁長度不一樣,其格式如圖4所示.此設(shè)計采用標(biāo)準(zhǔn)數(shù)據(jù)幀格式,以減少網(wǎng)絡(luò)傳輸量.
圖4 CAN鏈路層協(xié)議格式
CAN總線的應(yīng)用范圍遍及高速網(wǎng)絡(luò)到低成本的多線路網(wǎng)絡(luò),并廣泛應(yīng)用于車載系統(tǒng)、控制系統(tǒng)等領(lǐng)域,在工業(yè)控制領(lǐng)域占據(jù)著主導(dǎo)地位.此處只介紹與本設(shè)計密切相關(guān)的仲裁字段、控制字段和數(shù)據(jù)字段的格式.仲裁字段包含一個數(shù)據(jù)幀的幀ID,和以太網(wǎng)不同,CAN總線的數(shù)據(jù)包是面向幀消息的,而以太網(wǎng)是面向節(jié)點的.因此,CAN數(shù)據(jù)包只包含一個幀ID,而不包含目的地址和源地址信息,控制字段包含由數(shù)據(jù)字段的長度信息(數(shù)據(jù)字段長度只能為0-8B),數(shù)據(jù)字段則包含相應(yīng)要傳輸?shù)臄?shù)據(jù).
如上所述,RPC數(shù)據(jù)協(xié)議模塊包含2個部分.一部分是用戶進程向客戶存根處理進程發(fā)送的處理消息格式;另一部分是網(wǎng)絡(luò)傳輸?shù)臄?shù)據(jù)格式.基于CAN總線的RPC協(xié)議格式如圖5所示.
圖5 RPC數(shù)據(jù)格式
數(shù)據(jù)幀的幾點說明:
1)郵箱地址.RPC客戶存根處理進程收到遠程服務(wù)器的返回結(jié)果后,將獲得的數(shù)據(jù)放入這個郵箱地址,以便喚醒相應(yīng)用戶進程.
2)唯一調(diào)用號.這是一個全局唯一的調(diào)用號,占據(jù)1個字節(jié).系統(tǒng)必須保證所有的服務(wù)在全局僅有唯一的一個調(diào)用號碼.
3)參數(shù)組編.設(shè)計中對參數(shù)和返回值有如下規(guī)定.
①假設(shè)在函數(shù)參數(shù)列表中的參數(shù)從左到右分別是param l,param2,…,paramN,它們對應(yīng)地放在調(diào)用數(shù)據(jù)包的“參1…參數(shù)N”,那么,參數(shù)組編格式為“參數(shù)數(shù)目+參數(shù)1組編+參數(shù)2組編+…參數(shù)N組編”.參數(shù)的組編則有2種形式:非指針型和指針型.非指針型參數(shù)的組編方法為“類型編號(4 bit)+實參數(shù)據(jù)”;指針型參數(shù)的組編方法為“類型編號(4 bit)+長度(12 bit)+實參數(shù)據(jù)”.本設(shè)計參數(shù)組編方法詳見表1和表2所示.
②函數(shù)的返回值組編方法和參數(shù)組編方法一樣,只不過它是保存在服務(wù)器傳給客戶機的數(shù)據(jù)包中.
③簡單RPC只接收C語言的簡單數(shù)據(jù)類型(不包含浮點數(shù)據(jù)類型),支持1維指針,不支持2維以上的指針,也不支持struct類型.
④數(shù)據(jù)的存放表示一律使用little endian.
⑤傳遞指針時,需要把指針指向的數(shù)據(jù)放入報文中.
4)幀類型.占2個位(2 bit),其中“00”表示RPC結(jié)果返回幀,幀攜帶RPC的調(diào)用結(jié)果數(shù)據(jù);“01”表示調(diào)用查詢幀,幀攜帶調(diào)用請求數(shù)據(jù).客戶端用這種幀查詢哪臺服務(wù)器擁有相關(guān)調(diào)用號的服務(wù);“02”傳輸出錯報文幀,用于服務(wù)器和客戶端的傳輸信息協(xié)調(diào).這個字段和上面提到的“唯一調(diào)用號”字段組成了仲裁字段的ID字段(11 bit).
表1 非指針型組編編碼
表2 指針型組編編碼
5)剩余字節(jié)數(shù)(占用1B).如果一個幀無法傳輸完整的數(shù)據(jù),那么需要將要傳輸?shù)臄?shù)據(jù)分成多個數(shù)據(jù)幀來傳輸.這個字段保存剩余需要傳輸?shù)臄?shù)據(jù)字節(jié)數(shù)目,用以完成整個數(shù)據(jù)包的完整傳輸.
6)識別號(占用1B).這個號的作用是區(qū)分不同進程對同一個服務(wù)的調(diào)用,并標(biāo)志調(diào)用進程.
采用ARM 7-Lpc2290處理器(本身帶有CAN接口),μC/OS-II為底層操作系統(tǒng),CAN總線網(wǎng)絡(luò)為網(wǎng)絡(luò)環(huán)境.設(shè)定系統(tǒng)所使用的總線速率為125 kbps.一般來說,同步RPC設(shè)計目標(biāo)主要有2個:高吞吐量和低延時,但二者不可兼得.由于在嵌入式環(huán)境下,特別是控制環(huán)境下,節(jié)點間通信的數(shù)據(jù)量比較小,對實時性有一定的要求,因此在所述的設(shè)計中以低延時作為主要目標(biāo).
測試主要考察在RPC調(diào)用過程中,RPC相關(guān)操作對調(diào)用時間的影響.測試所使用的過程接口為unsigned char W ritedata1(u8 data,u8 len).該過程中將首地址為data,長度為len的數(shù)據(jù)從客戶端發(fā)送到服務(wù)器端.如果調(diào)用成功,服務(wù)器返回接收到的數(shù)據(jù)長度,否則返回0.作為對比,本測試使用了不同大小的數(shù)據(jù),并得到所使用的時間.由于嵌入式環(huán)境下數(shù)據(jù)量比較小,因此規(guī)定最大數(shù)據(jù)長度為256B,這個長度可以滿足大多數(shù)進程通信的要求,具體測試結(jié)果見表3.
從測試結(jié)果可以看出,RPC相關(guān)操作對調(diào)用時間的影響較低,基本實現(xiàn)了低延時的設(shè)計目標(biāo).RPC方式與直接使用消息的傳遞方式在時間消耗方面相差不大.
表3 RPC時間測試ms
分層RPC協(xié)議可以在多個嵌入式系統(tǒng)之間順利地完成函數(shù)調(diào)用,從而提供了一定的互操作性.分層的RPC協(xié)議把進程間調(diào)用和網(wǎng)絡(luò)連接調(diào)用分開,方便了不同系統(tǒng)、不同網(wǎng)絡(luò)的編程.簡單的說,這個分層協(xié)議為客戶端和服務(wù)器之間建立統(tǒng)一的底層通信機制,使得系統(tǒng)開發(fā)者可以把精力集中到如何實現(xiàn)功能以及解決實際問題上來.
[1] 袁菲,陸洋,海深.嵌入式環(huán)境下RPC的設(shè)計與實現(xiàn)[J].計算機工程,2007(9):266-268.
[2] Vinoski S.RPC Under Fire[J].IEEE Internet Computing,2005,9(5):93-95.
[3] Dissanaike S,W ijkman P,W ijkman M.Utilizing XMLRPC or SOAP on an Embedded System[C]//Proc.of Distributed Computing SystemsWorkshops.2004:438-440.
[4] 鄭麗英,李全兵.一種新的基于RPC的分布式開發(fā)模型[J].蘭州交通大學(xué)學(xué)報:自然科學(xué)版,2004(1):83-86.
[5] 肖政東.基于CAN總線的RPC遠程監(jiān)控系統(tǒng)的研究與實現(xiàn)[D].南京:南京航空航天大學(xué),2009.
[6] 何用輝.基于CAN總線的啤酒發(fā)酵監(jiān)控系統(tǒng)研究與設(shè)計[D].福州:福州大學(xué),2006.