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