沈阳什么药房有卖正大天晴生产的苦参素胶囊的?联系电话? 氧化苦参碱价格
2023-07-29
很多朋友对嵌入式远程调试,嵌入式远程过程调用组件--eRPC不是很了解,每日小编刚好整理了这方面的知识,今天就来带大家一探究竟。
RPC(Remote procedure call)远程过程调用概述。它分为两部分:远程过程和过程调用。远程过程是指在每台机器上提供的服务,过程调用是指远程过程调用和数据传输。 RPC 用通俗易懂的语言描述:客户端在不知道调用细节的情况下,调用远程设备上存在的对象,就像调用本地应用程序中的对象一样。 RPC 更正式的描述:一种通过传输介质向远程设备程序请求服务而无需了解底层传输介质的协议。根据我对RPC的理解,我将RPC分为三层:接口层、协议层、传输层。接口层:客户端实现服务端的接口代理,服务端的接口是具体实现。协议层:客户端按照规则实现接口参数的打包、序列化等动作。服务器根据规则将参数反序列化并传输到服务接口。传输层: 传输介质:TCP/UDP、HTTP、蓝牙、串口、USB等RPC流程图RPC特点: RPC是一种协议:是一套协议规范,需要遵循这套协议来实现规格。目前典型的RPC实现有:Dubbo、eRPC、GRPC等。从目前技术的发展趋势来看,实现RPC协议的应用工具往往还添加了其他重要的功能。传输层对它来说是透明的:RPC客户端调用就像调用本地应用程序中的对象一样,因此传输层使用TPC/UDB、UART、USB等协议,它不需要关心。协议格式对其来说是透明的:RPC客户端需要传递一些参数来调用远程对象,并返回一个调用结果。至于被调用的对象内部如何使用这些参数,并计算出结果。调用者不需要有关联。即传输的协议格式的组成,调用者不需要关心。跨语言能力:调用者实际上不需要关心被调用者使用的设备或语言。它可以是云服务器或小型微控制器。至于这些设备使用的语言则无需关心,被叫方只需要能够解析调用方的数据并返回正确的结果即可。 RPC :的优缺点优点:模块分布式部署,可以实现更好的可维护性、扩展性和协同开发。
缺点:通讯延迟; 地址空间隔离; 局部失效; 并发问题。
eRPC (Embedded RPC) 什么是eRPC?eRPC (Embedded RPC) 是一个开源远程过程调用(RPC) 系统,适用于多芯片嵌入式系统和异构多核SoC。
eRPC(Embedded RPC)是一个开源的远程过程调用(RPC)系统,适用于多芯片嵌入式系统和异构多核SoC。
与其他现代RPC 系统(例如优秀的Apache Thrift)不同,eRPC 的独特之处在于它是为紧密耦合的系统而设计的,使用纯C 语言来实现远程功能,并且具有较小的代码大小(5kB)。通过网络连接系统。
与其他现代RPC 系统(例如优秀的Apache Thrift)不同,eRPC 的不同之处在于它是为紧耦合系统设计的,使用纯C 来实现远程功能,并且代码大小很小(5kB)。它不适合网络上的高性能分布式系统。
eRPC源码eRPC源码路径“https://github.com/EmbeddedRPC/erpc”
eRPC源码目录我们重点关注两个目录erpc_c和erpcgen。其中:erpc_c是eRPC的C/C++实现。 erpcgen 将IDL 文件转换为C 或Python 源文件。
.doxygen erpc_cconfiginfra端口设置传输erpcgen erpc_python erpcsniffer 示例mk README.md testutilities 目录说明erpc_c/configeRPC 配置文件erpc_c/infraeRPC 核心代码erpc_c/porteRPC 移植层,适应不同的开发环境erpc_c/setupeRPC C 的传输层erpc_c/transportseRPC接口,包括不同介质的驱动。 eRPC编译我们需要编译两件事,其中:需要将erpc_c编译成库,将erpcgen编译成可执行文件,用于.erpc的IDL语法生成服务端和客户端的代码。
编译eRPC库为了让我们更容易编译,我们将对eRPC库进行编程,然后我们的应用程序将通过链接生成可执行文件。步:
进入erpc_c目录。执行make build=release编译生成eRPC库的release版本。执行make build=release install 安装eRPC 库的release版本。其中:默认安装路径为:/usr/local/lib,头文件安装路径为:/usr/local/include。为了方便开发者使用,编译erpcgeneRPC提供了IDL解析器erpcgen和生成规则,减少了我们的编码。 erpcgen在eRPC中非常重要。步:
进入erpcgen目录。执行make build=release编译生成可执行程序。执行make build=release install进行安装,其中:默认安装路径为:/usr/local/bin。 eRPC示例我们来写一个简单的例子,传输层使用TCP,客户端发送一个字符串,服务器回复一个字符串。步:
新建目录:youyeetoo,创建eRPC IDL文件:youyeetoo.erpcprogramyouyeetoo//指定生成的文件名interfaceyouyeetoo{//接口定义,封装一个或多个函数helloYouyeetoo(binarytxInput)-binary, //函数:helloYouyeetoo , input参数类型:binary,返回值类型:binary} 以youyeetoo.erpc为参数,使用刚刚编译好的erpcgen可执行文件生成客户端和服务端的代码:youyeetoo@youyeetoo:~/youyeetoo$erpcgen./youyeetoo.erpc 之后上述执行后,会在当前目录下生成四个文件:'youyeetoo_client.cpp'、'youyeetoo_server.cpp'、'youyeetoo_server.h'、'youyeetoo.h'。在:
根据.erpc文件,会生成一个接口:binary_t * helloYouyeetoo(const binary_t * txInput);客户端不需要实现这个接口的定义,它的实现已经自动生成并放在youyeetoo_client.cpp中。上层应用可以直接使用。服务器端不需要实现该接口,因此函数体的内容需要在上层应用程序中实现。创建客户端上层应用文件:client_app.cpp。在:
创建TCP 传输层通道。初始化eRPC客户端对象。通过helloYouyeetoo 函数进行远程调用并发送消息:“hello youyeetoo!”。打印远程调用的返回值。编译命令:“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可执行文件。 #include#include#include#include#include#include'youyeetoo.h'static void free_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='你好,你也太棒了!';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;}创建服务器上层应用文件:server_app.cpp。其中:创建TCP传输层通道。初始化eRPC服务器对象。向服务器对象注册服务。运行服务器线程。当客户端进行远程调用时,会进入helloYouyeetoo函数并返回。编译命令:“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可执行文件。 #include#include#include#include#include#include#include'youyeetoo_server.h'binary_t*helloYouyeetoo(constbinary_t*input){size_tlen=0;char*buf;printf('recv:%srn',输入数据);buf=(char*)malloc(strlen('嗨,好!'));memset(buf,0,strlen('嗨,好!'));strncpy(buf,'嗨,好!',strlen('嗨,好!'));printf('send:hi,好!n');len=strlen('嗨,好!');返回新的binary_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(服务器,create_youyetoo_service());同时(1 ){ erpc_server_run(server);}erpc_transport_tcp_close();return0;}执行结果:eRPC运行结果总结eRPC确实是一个很好的组件,它对底层传输层进行了抽象,使得它的RPC组件不仅仅局限于传统的TPC/UDP下运行状况。 eRPC传输层缺乏可行的认证,其传输采用明文形式,对数据不安全,应提供安全认证能力。 eRPC提供了IDL(接口定义语言),更方便我们使用。我们不再需要知道eRPC的具体实现来完成客户端与服务器之间的调用。欢迎关注微信公众号“大米嵌入式开发技术分享”
以上知识分享希望能够帮助到大家!
版权声明:本站所有作品图文均由用户自行上传分享,仅供网友学习交流。若您的权利被侵害,请联系我们
推荐阅读
2023-07-29
2023-07-29
2023-07-29
2023-07-29
2023-07-29
2023-07-29
2023-07-29
2023-07-29
2023-07-29
2023-07-29
2023-07-29
2023-07-29
2023-07-29
栏目热点
沈阳什么药房有卖正大天晴生产的苦参素胶囊的?联系电话? 氧化苦参碱价格
LilyGoT手表键盘C3迷你电脑套件
索泰ZBOXEdgeCI342迷你电脑正式上市
谷歌在最新的视频预告片中展示了PixelWatch的独特设计
三星与设计师Juun.J合作推出限量版可折叠产品和配件
从2023年起Fitbit设备将需要Google帐户
TOKKCAMC2+智能WiFi独立日 夜视摄像头
三星正在与全球时尚品牌JUUN.J合作
OnePlusNordWatch的颜色选项通过泄露的渲染揭示
就在第一款Nothing手机发布之前一种新的TWS芽设计浮出水面