0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

嵌入式远程过程调用组件--eRPC

Rice嵌入式开发技术分享 来源:Rice嵌入式开发技术分享 作者:Rice嵌入式开发技术 2023-04-06 14:15 次阅读

概述

  1. RPC(Remote Procedure call)远程过程调用。其分为两部分:远程过程和过程调用。远程过程是指每台机器上提供的服务,过程调用就是对远程过程调用以及数据传输。
  2. RPC用通俗的语言描述:客户端在不知道调用细节的情况下,调用存在于远程设备上的某个对象,就像调用本地应用程序中的对象一样。RPC比较正式的描述:一种通过传输介质从远程设备程序上请求服务,而不需要了解底层传输介质的协议。
  3. 按照我对RPC的理解,我将RPC分为三层:接口层,协议层,传输层。
  • 接口层:客户端实现了服务端的接口代理,而服务端的接口为具体实现。
  • 协议层:客户端根据规则实现接口参数的打包,序列化等动作。服务端根据规则将参数反序列化,并将其传输到服务接口。
  • 传输层:传输介质:TCP/UDP,HTTP,蓝牙,串口,USB等。
9f261bc2-cd3b-11ed-a826-dac502259ad0.pngRPC流程图

RPC的特点:

  1. RPC是协议:它是一套协议规范,需要遵循这套规范来实现。目前典型的RPC实现包括:Dubbo,eRPC,GRPC等。目前技术的发展趋势来看,实现了RPC协议的应用工具往往都会附加其他重要功能。
  2. 传输层对其透明:RPC的客户端调用就像调用本地应用程序中的对象,所以传输层使用TPC/UDB、UART、USB等协议,它本省是不需要关心的。
  3. 协议格式对其透明:RPC客户端调用远程对象需要传递一些参数,并且返回一个调用结果,至于被调用的对象内部是如何使用这些参数,并计算出结果的。调用方是不需要关系的。也就传输的协议格式的构成,调用方是不需要关心的。
  4. 跨语言能力:调用方实际是不需要关心被调用方是什么设备,使用什么语言。它可以是一个云服务器,也可以是一个小的单片机。至于这些设备使用的语言无需关心,被调用方只需要能够解析调用方的数据及能返回正确的结果即可。

RPC的优缺点:

  • 优点:实现模块的分布式部署,可以实现更好的维护性,扩展性以及协同式开发。

  • 缺点:①通信延迟;②地址空间隔离;③局部故障;④并发问题。

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)是一种用于多芯片嵌入式系统和异构多核SoC的开源远程过程调用(RPC)系统。

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.

与其他现代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_c
│├──config
│├──infra
│├──port
│├──setup
│└──transports
├──erpcgen
├──erpc_python
├──erpcsniffer
├──examples
├──mk
├──README.md
├──test
└──utilities
目录 说明
erpc_c/config eRPC的配置文件
erpc_c/infra eRPC的核心代码
erpc_c/port eRPC的移植层,适配不同的开发环境
erpc_c/setup eRPC的C接口
erpc_c/transports eRPC的传输层,包含不同介质的驱动

eRPC编译

我们需要编译两个东西,其中:①需要将编译erpc_c编译成库,②编译erpcgen编译成可执行文件,用于.erpc的IDL语法生成service和client的代码。

编译eRPC库

为了方便我们编译,我们将eRPC编程库,然后我们的应用通过链接方式生成可执行文件。步骤:

  1. 进入erpc_c目录。
  2. 执行 make build=release,编译生成release版本的eRPC库。
  3. 执行 make build=release install,安装release版本的eRPC库。其中:默认安装路径是:/usr/local/lib,头文件安装路径是:/usr/local/include。
编译erpcgen

eRPC为了能过够更加方便供开发者使用,提供了IDL的解析器erpcgen及生成规则,减少了我们编码。erpcgen在eRPC中非常重要。步骤:

  1. 进入erpcgen目录。
  2. 执行 make build=release,编译生成可执行程序。
  3. 执行 make build=release install,安装,其中:默认安装路径是:/usr/local/bin。

eRPC例子

我们写一个简单的例子,传输层采用TCP,Client发一个字符串,Server端回复一个字符串。步骤:

  1. 新建一个目录:youyeetoo,并新建一个eRPC的IDL文件:youyeetoo.erpc
programyouyeetoo//指定生成的文件名

interfaceyouyeetoo{//接口定义,包好一个或者多个函数
helloYouyeetoo(binarytxInput)->binary,//函数:helloYouyeetoo,入参类型:binary,返回值类型:binary
}
  1. 将youyeetoo.erpc作为参数,使用刚刚编译的erpcgen可执行文件,生成客户端和服务端的代码:
youyeetoo@youyeetoo:~/youyeetoo$erpcgen./youyeetoo.erpc
  1. 上述执行完会在当前目录下生成4个文件:"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"

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. 创建一个服务端的上层应用文件: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",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. 执行结果:
9f2f2eba-cd3b-11ed-a826-dac502259ad0.pngeRPC运行结果

总结

  1. eRPC确实是一个不错的组件,它对底层传输层做了抽象,使其RPC组件不局限传统的仅在TPC/UDP条件下运行。
  2. eRPC的传输层缺少可行认证,它的传输时明文的,对于数据来说是不安全的,应该提供安全认证的能力。
  3. eRPC提供IDL(接口定义语言),是我们使用起来更加方便,我们不在需要知道eRPC的具体实现,便可以完成客户端与服务端的调用。

欢迎关注微信公众号『Rice嵌入式开发技术分享』


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    4984

    文章

    18299

    浏览量

    288639
收藏 人收藏

    评论

    相关推荐

    SQL server服务,远程过程调用失败的解决方法

    成功解决SQL server服务,远程过程调用失败
    发表于 12-27 10:11

    嵌入式系统怎么实现远程监控和升级?

    偏远无人地区,通常这些采集系统基于GPRS无线网络来传输远程数据,但系统的维护和升级受到距离和环境的较大限制,不但成本高,而且周期长。为实现远程监测和升级野外作业嵌入式系统,本文提出一种基于GPRS
    发表于 08-02 06:49

    基于组件嵌入式移动数据库怎么实现?

    的发展而迅速发展起来。分析当前存在的各种嵌入式移动数据库系统的体系结构,我们考虑采用一种总体上采用组件方式设计、组件内部采用模块化方式设计的嵌入式移动数据库。
    发表于 10-11 06:44

    嵌入式组件的设计原则是什么?

    、Internet和分布计算环境中CBD技术已经得到了成熟的应用。但是,在其他一些领域,如嵌入式系统中,CBD的应用还及其有限。由于不同嵌入式系统的需求和硬件平台各异,要开发出适用于所有系统的通用
    发表于 03-06 08:09

    嵌入式系统组件的设计原则是什么

    嵌入式系统和组件技术嵌入式系统组件的设计原则面向嵌入式组件的系统开发
    发表于 04-23 06:08

    怎么实现嵌入式视频监控组件的设计?

    怎么实现嵌入式视频监控组件的设计?
    发表于 06-04 06:09

    嵌入式系统的设计过程

    (一)嵌入式系统的设计过程1. 设计过程中使用的概念(1)抽象:首先要对每个问题的组件进行抽象。例如,机器人系统问题的抽象可以根据手臂和电机的控制进行。(2)硬件和软件体系结构:在开始
    发表于 11-08 08:13

    组件技术在嵌入式软件中有何作用

    巨大成功,但在嵌入式这一领域影响甚微,其主要原因是嵌入式系统受到时间、空间和功耗的限制,主流组件技术很难应用。随着嵌入式应用程序复杂度的增加以及对程序可移植性的期望,
    发表于 12-21 07:35

    VS Code + gdbserver嵌入式arm远程调试的过程是怎样的

    VS Code + gdbserver嵌入式arm远程调试的过程是怎样的
    发表于 12-24 07:43

    如何使用GDB进行嵌入式远程调试?

    如何使用 GDB 进行嵌入式远程调试?
    发表于 12-24 07:01

    如何将eRPC移植到rt-thread系统上

    什么是 eRPCeRPC (Embedded RPC) 是用于多芯片嵌入式系统和异构多核 SoC 的开源远程过程调用 (RPC) 系统。eRPC
    发表于 08-22 14:46

    eRPC上怎么添加RT-Thread系统接口

    rt-thread 系统端的 rpc 远程调用过程!结束语这么简单就实现了?当然不是,移植过程远远不够。本篇只完成了 port 下的接口。还缺一个 Transport ,我们下篇见。原作者:出出啊
    发表于 08-25 15:00

    嵌入式RPC的设计与实现

    在研究远程过程调用的原理和嵌入式系统特点的基础上,提出一种远程过程调用的设计以及在VxWorks操作系统上服务器端和在Windows操作系统上客户端的实现。经在项目中的应用,本设计
    发表于 03-21 15:30 23次下载

    RPC如何在远程过程调用

    RPC(Remote Procedure Call Protocol)即远程过程调用,也就是调用的函数是在其它的控制板上运行的,不需要理会底层的通讯协议。
    的头像 发表于 02-07 09:52 640次阅读
    RPC如何在<b class='flag-5'>远程</b><b class='flag-5'>过程</b>中<b class='flag-5'>调用</b>?

    什么是远程过程调用

    开发环境:Ubuntu VS Code 编译器:g++ 编程语言:C++ 框架源码下载:GitHub 认识RPC RPC的全称是远程过程调用(Remote Procedure Call
    的头像 发表于 11-10 10:10 429次阅读
    什么是<b class='flag-5'>远程过程调用</b>