0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

嵌入式遠(yuǎn)程過(guò)程調(diào)用組件--eRPC

Rice嵌入式開(kāi)發(fā)技術(shù)分享 ? 來(lái)源:Rice嵌入式開(kāi)發(fā)技術(shù)分享 ? 作者:Rice嵌入式開(kāi)發(fā)技術(shù) ? 2023-04-06 14:15 ? 次閱讀

概述

  1. RPC(Remote Procedure call)遠(yuǎn)程過(guò)程調(diào)用。其分為兩部分:遠(yuǎn)程過(guò)程和過(guò)程調(diào)用。遠(yuǎn)程過(guò)程是指每臺(tái)機(jī)器上提供的服務(wù),過(guò)程調(diào)用就是對(duì)遠(yuǎn)程過(guò)程調(diào)用以及數(shù)據(jù)傳輸。
  2. RPC用通俗的語(yǔ)言描述:客戶端在不知道調(diào)用細(xì)節(jié)的情況下,調(diào)用存在于遠(yuǎn)程設(shè)備上的某個(gè)對(duì)象,就像調(diào)用本地應(yīng)用程序中的對(duì)象一樣。RPC比較正式的描述:一種通過(guò)傳輸介質(zhì)從遠(yuǎn)程設(shè)備程序上請(qǐng)求服務(wù),而不需要了解底層傳輸介質(zhì)的協(xié)議。
  3. 按照我對(duì)RPC的理解,我將RPC分為三層:接口層,協(xié)議層,傳輸層。
  • 接口層:客戶端實(shí)現(xiàn)了服務(wù)端的接口代理,而服務(wù)端的接口為具體實(shí)現(xiàn)。
  • 協(xié)議層:客戶端根據(jù)規(guī)則實(shí)現(xiàn)接口參數(shù)的打包,序列化等動(dòng)作。服務(wù)端根據(jù)規(guī)則將參數(shù)反序列化,并將其傳輸?shù)椒?wù)接口。
  • 傳輸層:傳輸介質(zhì):TCP/UDP,HTTP,藍(lán)牙,串口,USB等。
9f261bc2-cd3b-11ed-a826-dac502259ad0.pngRPC流程圖

RPC的特點(diǎn):

  1. RPC是協(xié)議:它是一套協(xié)議規(guī)范,需要遵循這套規(guī)范來(lái)實(shí)現(xiàn)。目前典型的RPC實(shí)現(xiàn)包括:Dubbo,eRPC,GRPC等。目前技術(shù)的發(fā)展趨勢(shì)來(lái)看,實(shí)現(xiàn)了RPC協(xié)議的應(yīng)用工具往往都會(huì)附加其他重要功能。
  2. 傳輸層對(duì)其透明:RPC的客戶端調(diào)用就像調(diào)用本地應(yīng)用程序中的對(duì)象,所以傳輸層使用TPC/UDB、UART、USB等協(xié)議,它本省是不需要關(guān)心的。
  3. 協(xié)議格式對(duì)其透明:RPC客戶端調(diào)用遠(yuǎn)程對(duì)象需要傳遞一些參數(shù),并且返回一個(gè)調(diào)用結(jié)果,至于被調(diào)用的對(duì)象內(nèi)部是如何使用這些參數(shù),并計(jì)算出結(jié)果的。調(diào)用方是不需要關(guān)系的。也就傳輸?shù)膮f(xié)議格式的構(gòu)成,調(diào)用方是不需要關(guān)心的。
  4. 跨語(yǔ)言能力:調(diào)用方實(shí)際是不需要關(guān)心被調(diào)用方是什么設(shè)備,使用什么語(yǔ)言。它可以是一個(gè)云服務(wù)器,也可以是一個(gè)小的單片機(jī)。至于這些設(shè)備使用的語(yǔ)言無(wú)需關(guān)心,被調(diào)用方只需要能夠解析調(diào)用方的數(shù)據(jù)及能返回正確的結(jié)果即可。

RPC的優(yōu)缺點(diǎn):

  • 優(yōu)點(diǎn):實(shí)現(xiàn)模塊的分布式部署,可以實(shí)現(xiàn)更好的維護(hù)性,擴(kuò)展性以及協(xié)同式開(kāi)發(fā)。

  • 缺點(diǎn):①通信延遲;②地址空間隔離;③局部故障;④并發(fā)問(wèn)題。

eRPC (Embedded RPC)

eRPC是什么

eRPC (Embedded RPC) is an open source Remote Procedure Call (RPC) system for multichip embedded systems and heterogeneous multicore SoCs.

eRPC(嵌入式RPC)是一種用于多芯片嵌入式系統(tǒng)和異構(gòu)多核SoC的開(kāi)源遠(yuǎn)程過(guò)程調(diào)用(RPC)系統(tǒng)。

Unlike other modern RPC systems, such as the excellent Apache Thrift, eRPC distinguishes itself by being designed for tightly coupled systems, using plain C for remote functions, and having a small code size (<5kB). It is not intended for high performance distributed systems over a network.

與其他現(xiàn)代RPC系統(tǒng)(如出色的Apache Thrift)不同,eRPC的與眾不同之處在于它是為緊密耦合的系統(tǒng)設(shè)計(jì)的,使用純C實(shí)現(xiàn)遠(yuǎn)程功能,并且代碼大小較小(<5kB)。它不適用于網(wǎng)絡(luò)上的高性能分布式系統(tǒng)。

eRPC源碼

eRPC源碼路徑

「https://github.com/EmbeddedRPC/erpc」

eRPC源碼目錄

我們關(guān)注兩個(gè)目錄erpc_c和erpcgen。其中:erpc_c是eRPC的C/C++實(shí)現(xiàn)。erpcgen是將IDL文件轉(zhuǎn)為C或Python源文件。

.
├──doxygen
├──erpc_c
│├──config
│├──infra
│├──port
│├──setup
│└──transports
├──erpcgen
├──erpc_python
├──erpcsniffer
├──examples
├──mk
├──README.md
├──test
└──utilities
目錄 說(shuō)明
erpc_c/config eRPC的配置文件
erpc_c/infra eRPC的核心代碼
erpc_c/port eRPC的移植層,適配不同的開(kāi)發(fā)環(huán)境
erpc_c/setup eRPC的C接口
erpc_c/transports eRPC的傳輸層,包含不同介質(zhì)的驅(qū)動(dòng)

eRPC編譯

我們需要編譯兩個(gè)東西,其中:①需要將編譯erpc_c編譯成庫(kù),②編譯erpcgen編譯成可執(zhí)行文件,用于.erpc的IDL語(yǔ)法生成service和client的代碼。

編譯eRPC庫(kù)

為了方便我們編譯,我們將eRPC編程庫(kù),然后我們的應(yīng)用通過(guò)鏈接方式生成可執(zhí)行文件。步驟:

  1. 進(jìn)入erpc_c目錄。
  2. 執(zhí)行 make build=release,編譯生成release版本的eRPC庫(kù)。
  3. 執(zhí)行 make build=release install,安裝release版本的eRPC庫(kù)。其中:默認(rèn)安裝路徑是:/usr/local/lib,頭文件安裝路徑是:/usr/local/include。
編譯erpcgen

eRPC為了能過(guò)夠更加方便供開(kāi)發(fā)者使用,提供了IDL的解析器erpcgen及生成規(guī)則,減少了我們編碼。erpcgen在eRPC中非常重要。步驟:

  1. 進(jìn)入erpcgen目錄。
  2. 執(zhí)行 make build=release,編譯生成可執(zhí)行程序。
  3. 執(zhí)行 make build=release install,安裝,其中:默認(rèn)安裝路徑是:/usr/local/bin。

eRPC例子

我們寫(xiě)一個(gè)簡(jiǎn)單的例子,傳輸層采用TCP,Client發(fā)一個(gè)字符串,Server端回復(fù)一個(gè)字符串。步驟:

  1. 新建一個(gè)目錄:youyeetoo,并新建一個(gè)eRPC的IDL文件:youyeetoo.erpc
programyouyeetoo//指定生成的文件名

interfaceyouyeetoo{//接口定義,包好一個(gè)或者多個(gè)函數(shù)
helloYouyeetoo(binarytxInput)->binary,//函數(shù):helloYouyeetoo,入?yún)㈩?lèi)型:binary,返回值類(lèi)型:binary
}
  1. 將youyeetoo.erpc作為參數(shù),使用剛剛編譯的erpcgen可執(zhí)行文件,生成客戶端和服務(wù)端的代碼:
youyeetoo@youyeetoo:~/youyeetoo$erpcgen./youyeetoo.erpc
  1. 上述執(zhí)行完會(huì)在當(dāng)前目錄下生成4個(gè)文件:"youyeetoo_client.cpp","youyeetoo_server.cpp","youyeetoo_server.h","youyeetoo.h"。其中:

  • 根據(jù).erpc文件會(huì)生成一個(gè)接口:binary_t * helloYouyeetoo(const binary_t * txInput);。
  • 客戶端無(wú)需實(shí)現(xiàn)這個(gè)接口的定義,它的實(shí)現(xiàn)已經(jīng)自動(dòng)生成放在youyeetoo_client.cpp。上層應(yīng)用直接使用即可。
  • 服務(wù)端需要沒(méi)有實(shí)現(xiàn)這個(gè)接口,所以需要在上層應(yīng)用實(shí)現(xiàn)函數(shù)體的內(nèi)容。
  • 創(chuàng)建一個(gè)客戶端的上層應(yīng)用文件:client_app.cpp。其中:

  • 創(chuàng)建一個(gè)TCP傳輸層通道。
  • 初始化eRPC客戶端對(duì)象。
  • 通過(guò)helloYouyeetoo函數(shù)進(jìn)行遠(yuǎn)程調(diào)用,發(fā)送一條消息:"hello youyeetoo!"。
  • 將遠(yuǎn)程調(diào)用的返回值打印出來(lái)。
  • 編譯命令:「g++ -Wall -I. -I/usr/local/include/erpc -L/usr/local/lib youyeetoo_client.cpp client_app.cpp -lerpc -lpthread -o client_app」
  • 生成client_app可執(zhí)行文件。
#include
#include
#include
#include
#include
#include"youyeetoo.h"

staticvoidfree_binary_t_struct(binary_t*data)
{
if(data->data){
erpc_free(data->data);
}
}

intmain(intargc,char*argv[])
{
erpc_transport_ttransport=erpc_transport_tcp_init("127.0.0.1",5555,false);
erpc_mbf_tmessage_buffer_factory=erpc_mbf_dynamic_init();
erpc_client_init(transport,message_buffer_factory);
char*msg="hello,youyeetoo!";
binary_tb={(uint8_t*)msg,(uint32_t)strlen(msg)};
printf("Request:%sn",msg);
binary_t*resp=helloYouyeetoo(&b);
if(resp!=NULL){
char*buf=(char*)malloc(resp->dataLength+1);
strncpy(buf,(constchar*)resp->data,resp->dataLength);
buf[resp->dataLength]='';
printf("Respond:%sn",buf);
free_binary_t_struct(resp);
free(buf);
}

erpc_transport_tcp_close();

return0;
}
  1. 創(chuàng)建一個(gè)服務(wù)端的上層應(yīng)用文件:server_app.cpp。其中:
  • 創(chuàng)建一個(gè)TCP傳輸層通道。
  • 初始化eRPC服務(wù)端對(duì)象。
  • 注冊(cè)服務(wù)到服務(wù)端對(duì)象中。
  • 運(yùn)行服務(wù)端線程。
  • 當(dāng)客戶端進(jìn)行遠(yuǎn)程調(diào)用時(shí),將會(huì)進(jìn)入helloYouyeetoo函數(shù),并返回。
  • 編譯命令:「g++ -Wall -I. -I/usr/local/include/erpc -L/usr/local/lib youyeetoo_server.cpp server_app.cpp -lerpc -lpthread -o server_app」
  • 生成client_app可執(zhí)行文件。
#include
#include
#include
#include
#include
#include
#include"youyeetoo_server.h"

binary_t*helloYouyeetoo(constbinary_t*input)
{
size_tlen=0;
char*buf;

printf("recv:%srn",input->data);

buf=(char*)malloc(strlen("hi,good!"));
memset(buf,0,strlen("hi,good!"));
strncpy(buf,"hi,good!",strlen("hi,good!"));
printf("send:hi,good!n");
len=strlen("hi,good!");

returnnewbinary_t{(uint8_t*)buf,(uint32_t)len};
}

intmain(intargc,char*argv[])
{
erpc_transport_ttransport=erpc_transport_tcp_init("127.0.0.1",5555,true);
erpc_mbf_tmessage_buffer_factory=erpc_mbf_dynamic_init();
erpc_server_tserver=erpc_server_init(transport,message_buffer_factory);
erpc_add_service_to_server(server,create_youyeetoo_service());
while(1){
erpc_server_run(server);
}
erpc_transport_tcp_close();

return0;
}
  1. 執(zhí)行結(jié)果:
9f2f2eba-cd3b-11ed-a826-dac502259ad0.pngeRPC運(yùn)行結(jié)果

總結(jié)

  1. eRPC確實(shí)是一個(gè)不錯(cuò)的組件,它對(duì)底層傳輸層做了抽象,使其RPC組件不局限傳統(tǒng)的僅在TPC/UDP條件下運(yùn)行。
  2. eRPC的傳輸層缺少可行認(rèn)證,它的傳輸時(shí)明文的,對(duì)于數(shù)據(jù)來(lái)說(shuō)是不安全的,應(yīng)該提供安全認(rèn)證的能力。
  3. eRPC提供IDL(接口定義語(yǔ)言),是我們使用起來(lái)更加方便,我們不在需要知道eRPC的具體實(shí)現(xiàn),便可以完成客戶端與服務(wù)端的調(diào)用。

歡迎關(guān)注微信公眾號(hào)『Rice嵌入式開(kāi)發(fā)技術(shù)分享』


聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 嵌入式
    +關(guān)注

    關(guān)注

    5105

    文章

    19288

    瀏覽量

    310192
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    如何手搓一個(gè)自定義的RPC 遠(yuǎn)程過(guò)程調(diào)用框架

    1、RPC(遠(yuǎn)程過(guò)程調(diào)用概述) 遠(yuǎn)程過(guò)程調(diào)用(RPC, Remote Procedure Call)是一種通過(guò)網(wǎng)絡(luò)從遠(yuǎn)程計(jì)算機(jī)程序上請(qǐng)求服務(wù),而無(wú)需了解網(wǎng)絡(luò)細(xì)節(jié)的通信技術(shù)。在分布系統(tǒng)
    的頭像 發(fā)表于 07-22 12:17 ?1000次閱讀
    如何手搓一個(gè)自定義的RPC <b class='flag-5'>遠(yuǎn)程過(guò)程調(diào)用</b>框架

    SQL server服務(wù),遠(yuǎn)程過(guò)程調(diào)用失敗的解決方法

    成功解決SQL server服務(wù),遠(yuǎn)程過(guò)程調(diào)用失敗
    發(fā)表于 12-27 10:11

    嵌入式組件的設(shè)計(jì)原則是什么?

    、Internet和分布計(jì)算環(huán)境中CBD技術(shù)已經(jīng)得到了成熟的應(yīng)用。但是,在其他一些領(lǐng)域,如嵌入式系統(tǒng)中,CBD的應(yīng)用還及其有限。由于不同嵌入式系統(tǒng)的需求和硬件平臺(tái)各異,要開(kāi)發(fā)出適用于所有系統(tǒng)的通用
    發(fā)表于 03-06 08:09

    嵌入式系統(tǒng)組件的設(shè)計(jì)原則是什么

    嵌入式系統(tǒng)和組件技術(shù)嵌入式系統(tǒng)組件的設(shè)計(jì)原則面向嵌入式組件的系統(tǒng)開(kāi)發(fā)
    發(fā)表于 04-23 06:08

    VS Code + gdbserver嵌入式arm遠(yuǎn)程調(diào)試的過(guò)程是怎樣的

    VS Code + gdbserver嵌入式arm遠(yuǎn)程調(diào)試的過(guò)程是怎樣的
    發(fā)表于 12-24 07:43

    如何將eRPC移植到rt-thread系統(tǒng)上

    什么是 eRPCeRPC (Embedded RPC) 是用于多芯片嵌入式系統(tǒng)和異構(gòu)多核 SoC 的開(kāi)源遠(yuǎn)程過(guò)程調(diào)用 (RPC) 系統(tǒng)。eRPC
    發(fā)表于 08-22 14:46

    eRPC上怎么添加RT-Thread系統(tǒng)接口

    rt-thread 系統(tǒng)端的 rpc 遠(yuǎn)程調(diào)用過(guò)程!結(jié)束語(yǔ)這么簡(jiǎn)單就實(shí)現(xiàn)了?當(dāng)然不是,移植過(guò)程遠(yuǎn)遠(yuǎn)不夠。本篇只完成了 port 下的接口。還缺一個(gè) Transport ,我們下篇見(jiàn)。原作者:出出啊
    發(fā)表于 08-25 15:00

    基于嵌入式TCP/IP的遠(yuǎn)程GPRS控制終端的設(shè)計(jì)與實(shí)現(xiàn)

    介紹了基于8 位單片機(jī)的嵌入式TCP/ IP 的遠(yuǎn)程無(wú)線控制終端的設(shè)計(jì)與實(shí)現(xiàn). 描述了基于GPRS 網(wǎng)的數(shù)據(jù)傳輸過(guò)程、嵌入式實(shí)時(shí)操作系統(tǒng)RTX51 以及
    發(fā)表于 08-24 18:56 ?33次下載

    嵌入式RPC的設(shè)計(jì)與實(shí)現(xiàn)

    在研究遠(yuǎn)程過(guò)程調(diào)用的原理和嵌入式系統(tǒng)特點(diǎn)的基礎(chǔ)上,提出一種遠(yuǎn)程過(guò)程調(diào)用的設(shè)計(jì)以及在VxWorks操作系統(tǒng)上服務(wù)器端和在Windows操作系統(tǒng)上客戶端的實(shí)現(xiàn)。經(jīng)在項(xiàng)目中的應(yīng)用,本設(shè)計(jì)
    發(fā)表于 03-21 15:30 ?23次下載

    嵌入式視頻監(jiān)控組件的設(shè)計(jì)與實(shí)現(xiàn)

    關(guān)鍵詞:嵌入式 , 視頻監(jiān)控 隨著數(shù)字視頻壓縮技術(shù)的日益成熟,嵌入式視頻監(jiān)控成為當(dāng)今監(jiān)控技術(shù)的主流,但由于系統(tǒng)功能不斷增加、編程環(huán)境不斷改變以及前期需求分析和設(shè)計(jì)不完善,導(dǎo)致系統(tǒng)升級(jí)和維護(hù)的難度不斷
    發(fā)表于 01-25 18:35 ?368次閱讀

    如何實(shí)現(xiàn)嵌入式系統(tǒng)遠(yuǎn)程調(diào)試

    嵌入式系統(tǒng)隨著目前科技的發(fā)展,正逐步融入人們的生活中。對(duì)于嵌入式系統(tǒng),我們應(yīng)該有所了解。就專(zhuān)業(yè)人員而言,他們對(duì)嵌入式系統(tǒng)早已駕輕就熟。為增進(jìn)大家對(duì)嵌入式系統(tǒng)的認(rèn)識(shí),本文將對(duì)
    的頭像 發(fā)表于 11-22 11:55 ?5586次閱讀
    如何實(shí)現(xiàn)<b class='flag-5'>嵌入式</b>系統(tǒng)<b class='flag-5'>遠(yuǎn)程</b>調(diào)試

    嵌入式系統(tǒng)如何進(jìn)行遠(yuǎn)程調(diào)試

    嵌入式系統(tǒng)隨著目前科技的發(fā)展,正逐步融入人們的生活中。對(duì)于嵌入式系統(tǒng),我們應(yīng)該有所了解。就專(zhuān)業(yè)人員而言,他們對(duì)嵌入式系統(tǒng)早已駕輕就熟。為增進(jìn)大家對(duì)嵌入式系統(tǒng)的認(rèn)識(shí),本文將對(duì)
    發(fā)表于 12-23 10:39 ?7次下載

    RPC如何在遠(yuǎn)程過(guò)程調(diào)用?

    RPC(Remote Procedure Call Protocol)即遠(yuǎn)程過(guò)程調(diào)用,也就是調(diào)用的函數(shù)是在其它的控制板上運(yùn)行的,不需要理會(huì)底層的通訊協(xié)議。
    的頭像 發(fā)表于 02-07 09:52 ?999次閱讀
    RPC如何在<b class='flag-5'>遠(yuǎn)程</b><b class='flag-5'>過(guò)程</b>中<b class='flag-5'>調(diào)用</b>?

    嵌入式系統(tǒng)中函數(shù)如何調(diào)用

    嵌入式系統(tǒng)中,一個(gè)函數(shù)調(diào)用時(shí),它的內(nèi)部機(jī)理是什么,執(zhí)行了哪些步驟?如圖1所示,先看 看 一個(gè)程序在運(yùn)行時(shí),它的內(nèi)存分布狀況。
    的頭像 發(fā)表于 02-13 14:15 ?1178次閱讀
    <b class='flag-5'>嵌入式</b>系統(tǒng)中函數(shù)如何<b class='flag-5'>調(diào)用</b>

    什么是遠(yuǎn)程過(guò)程調(diào)用

    開(kāi)發(fā)環(huán)境:Ubuntu VS Code 編譯器:g++ 編程語(yǔ)言:C++ 框架源碼下載:GitHub 認(rèn)識(shí)RPC RPC的全稱是遠(yuǎn)程過(guò)程調(diào)用(Remote Procedure Call
    的頭像 發(fā)表于 11-10 10:10 ?1215次閱讀
    什么是<b class='flag-5'>遠(yuǎn)程過(guò)程調(diào)用</b>