嵌入式远程过程调用组件 | 您所在的位置:网站首页 › 内嵌调用是什么 › 嵌入式远程过程调用组件 |
概述
RPC(Remote Procedure call)远程过程调用。其分为两部分:远程过程和过程调用。远程过程是指每台机器上提供的服务,过程调用就是对远程过程调用以及数据传输。RPC用通俗的语言描述:客户端在不知道调用细节的情况下,调用存在于远程设备上的某个对象,就像调用本地应用程序中的对象一样。RPC比较正式的描述:一种通过传输介质从远程设备程序上请求服务,而不需要了解底层传输介质的协议。按照我对RPC的理解,我将RPC分为三层:接口层,协议层,传输层。
接口层:客户端实现了服务端的接口代理,而服务端的接口为具体实现。协议层:客户端根据规则实现接口参数的打包,序列化等动作。服务端根据规则将参数反序列化,并将其传输到服务接口。传输层:传输介质:TCP/UDP,HTTP,蓝牙,串口,USB等。
优点:实现模块的分布式部署,可以实现更好的维护性,扩展性以及协同式开发。 缺点:①通信延迟;②地址空间隔离;③局部故障;④并发问题。 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 (data) { erpc_free(data->data); } } int main(int argc, char *argv[]) { erpc_transport_t transport = erpc_transport_tcp_init("127.0.0.1", 5555, false); erpc_mbf_t message_buffer_factory = erpc_mbf_dynamic_init(); erpc_client_init(transport, message_buffer_factory); char *msg = "hello, youyeetoo!"; binary_t b = {(uint8_t *)msg, (uint32_t)strlen(msg)}; printf("Request: %s\n", msg); binary_t *resp = helloYouyeetoo(&b); if (resp != NULL) { char *buf = (char *)malloc(resp->dataLength + 1); strncpy(buf, (const char *)resp->data, resp->dataLength); buf[resp->dataLength] = '\0'; printf("Respond: %s\n", buf); free_binary_t_struct(resp); free(buf); } erpc_transport_tcp_close(); return 0; } 创建一个服务端的上层应用文件: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(const binary_t * input) { size_t len = 0; char *buf; printf("recv: %s\r\n", 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!"); return new binary_t{(uint8_t*)buf, (uint32_t)len}; } int main(int argc, char *argv[]) { erpc_transport_t transport = erpc_transport_tcp_init("127.0.0.1", 5555, true); erpc_mbf_t message_buffer_factory = erpc_mbf_dynamic_init(); erpc_server_t server = 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(); return 0; } 执行结果: |
CopyRight 2018-2019 实验室设备网 版权所有 |