一、RPC簡(jiǎn)介
RPC(Remote Procedure Call,遠(yuǎn)程過程調(diào)用)機(jī)制是一種常用的通信機(jī)制。實(shí)際上就是要像調(diào)用本地的函數(shù)一樣去調(diào)遠(yuǎn)程函數(shù)。
RPC機(jī)制,在互聯(lián)網(wǎng)中應(yīng)用得比較廣泛。在我們嵌入式中,把傳輸層拓展到IPC、TPC/IP、UART、USB等,很多場(chǎng)景下也都可以用得上。
如:
??需要發(fā)送確認(rèn)的場(chǎng)景,比如發(fā)送某個(gè)數(shù)據(jù),需要對(duì)端回復(fù)一個(gè)數(shù)據(jù)進(jìn)行確認(rèn),這種場(chǎng)景,我們可以在應(yīng)用上進(jìn)行實(shí)現(xiàn),隨著協(xié)議越加越多,對(duì)應(yīng)的回復(fù)的代碼也越來越多,但基本都是很相似的代碼。這種下使用RPC機(jī)制就比較優(yōu)雅了,本地發(fā)起遠(yuǎn)端調(diào)用請(qǐng)求,遠(yuǎn)端執(zhí)行完后會(huì)將結(jié)果返回。
??應(yīng)用于進(jìn)程間的交互:你寫了一段代碼,這段代碼可以調(diào)用你電腦上某個(gè)服務(wù)提供的功能,而不需要關(guān)心這個(gè)服務(wù)運(yùn)行在你的電腦上還是在網(wǎng)絡(luò)的另一端。
??應(yīng)用于板間的交互:多個(gè)控制板之間需要通信和協(xié)作來協(xié)調(diào)生產(chǎn)過程。使用RPC可以簡(jiǎn)化這些控制單元之間的調(diào)用和數(shù)據(jù)共享。
??應(yīng)用于端云的交互:IoT設(shè)備通常需要和云端服務(wù)器或其他設(shè)備交互。通過RPC,設(shè)備可以遠(yuǎn)程調(diào)用云服務(wù),實(shí)現(xiàn)數(shù)據(jù)同步、功能升級(jí)等操作。
二、RPC的基本原理
嵌入式RPC機(jī)制主要由客戶端和服務(wù)器兩部分組成:
1、客戶端:發(fā)起調(diào)用請(qǐng)求,將參數(shù)傳遞給遠(yuǎn)程方法,并接收服務(wù)端返回的結(jié)果。在嵌入式系統(tǒng)中,客戶端通常作為非安全環(huán)境中的應(yīng)用程序。
2、服務(wù)器:執(zhí)行客戶端調(diào)用的遠(yuǎn)程過程,并將結(jié)果返回給客戶端。在嵌入式系統(tǒng)中,服務(wù)器通常位于安全環(huán)境中的可信執(zhí)行環(huán)境(TEE)中,如OP-TEE框架。
這張圖里的network傳輸鏈路,在我們嵌入式中,對(duì)于不同的應(yīng)用場(chǎng)景可以是UART、USB等。
RPC的基本工作原理如下:
1、定義遠(yuǎn)程方法接口(服務(wù)契約),包括方法名稱、參數(shù)類型、返回值類型等信息。
2、生成客戶端和服務(wù)端的stub(樁)和skeleton(骨架)代碼。
3、客戶端通過stub調(diào)用遠(yuǎn)程方法,stub將請(qǐng)求序列化為網(wǎng)絡(luò)傳輸格式,然后通過網(wǎng)絡(luò)發(fā)送給服務(wù)端。
4、服務(wù)端接收到請(qǐng)求后,通過skeleton進(jìn)行反序列化,根據(jù)接口定義執(zhí)行遠(yuǎn)程方法,并將返回值序列化為網(wǎng)絡(luò)傳輸格式,發(fā)送給客戶端。
5、客戶端接收到服務(wù)端的響應(yīng)后,通過stub進(jìn)行反序列化,獲取返回值。
三、RPC的主要特點(diǎn)
跨平臺(tái)性:RPC框架可以在不同的操作系統(tǒng)和平臺(tái)上運(yùn)行,實(shí)現(xiàn)跨平臺(tái)的遠(yuǎn)程調(diào)用。這一特點(diǎn)使得RPC框架能夠廣泛應(yīng)用于各種異構(gòu)環(huán)境中,提高了系統(tǒng)的靈活性和適應(yīng)性。
透明性:RPC框架隱藏了底層的通信細(xì)節(jié),使得客戶端能夠像調(diào)用本地函數(shù)一樣調(diào)用遠(yuǎn)程函數(shù),無需關(guān)注網(wǎng)絡(luò)通信的具體實(shí)現(xiàn)。這一特點(diǎn)簡(jiǎn)化了開發(fā)者的編程模型,降低了開發(fā)難度。
高效性:RPC框架通常采用二進(jìn)制數(shù)據(jù)傳輸和壓縮等技術(shù),使得網(wǎng)絡(luò)通信效率更高,比如使用protobuf進(jìn)行序列化與反序列化。
四、嵌入式RPC框架推薦:erpc
eRPC(嵌入式RPC)是NXP開源的、用于多芯片嵌入式系統(tǒng)和異構(gòu)多核SoC的開源遠(yuǎn)程過程調(diào)用(RPC)系統(tǒng)。與其他現(xiàn)代RPC系統(tǒng)(如出色的Apache Thrift)不同,eRPC的與眾不同之處在于它是為緊密耦合的系統(tǒng)設(shè)計(jì)的,使用純C實(shí)現(xiàn)遠(yuǎn)程功能,并且代碼大小較?。?lt;5kB)。它不適用于網(wǎng)絡(luò)上的高性能分布式系統(tǒng)。
erpc源碼:
https://github.com/EmbeddedRPC/erpc
??函數(shù)的參數(shù)和標(biāo)識(shí)符(用于被調(diào)用的例程)被序列化成字節(jié)流。
??該字節(jié)流通過通信通道(IPC、TPC/IP、UART等)傳輸?shù)椒?wù)器。
??服務(wù)器對(duì)參數(shù)進(jìn)行反序列化,確定調(diào)用了哪個(gè)函數(shù),然后調(diào)用它。
??如果函數(shù)返回一個(gè)值,那么該值將被序列化并通過通信通道發(fā)送回客戶端。
erpc主要特點(diǎn)
??輕量級(jí)但可擴(kuò)展
??生成的代碼較小
??抽象傳輸接口
??序列化數(shù)據(jù)的大小較小
??非常適合C語言的環(huán)境,也足夠靈活,可以支持面向?qū)ο蟮恼Z言,如c++
??從服務(wù)器到客戶機(jī)的異步通知
??最小化延遲影響