1.代码下载

   github比较慢,在gitee上找到一个国内的镜像源 。创建erpc目录和demo目录,两个目录平级,分别用于安放erpc sdk和测试用例。执行git clone https://gitee.com/zydltech/erpc.git获取源码,之后创建demo目录:

2.安装依赖

 sudo apt-get install flex bisonsudo apt-get install libboost-dev libboost-system-dev libboost-filesystem-dev

3.编译idl编译工具erpcgen.

进入到 ./erpc/erpcgen 目录,执行 make

之后执行 sudo make install,安装erpcgen

备用

4.编译erpc核心库.

进入到 ./erpc/erpc_c目录,执行 make, 得到liberpc.a核心库

执行sudo make install 安装

5.编译IDL 接口描述文件

在demo目录中创建文件erpcdemo.erpc,编辑如下描述信息。

/*! 定义项目名称,也是所有生成的源码文件名前缀 */
program erpcdemo/*! 定义返回状态枚举类型 */
enum lockErrors_t
{lErrorOk_c = 0,lErrorOutofMemory_c,// ......定义状态码// 最大枚举类型值lErrorMaxError_c
}/*! 定义服务接口函数 */
interface DEMO {RD_demoHello(binary txInput) -> binary
}

利用erpcgen工具将idl文件转换为 cpp 文件代码
执行erpcgen erpcdemo.erpc, 生成如下四个文件

6.编写client端和server端应用代码

Client

/** test_erpcdemo_client.c**  Created on: Apr 14, 2020*      Author: guyadong*/#include <string.h>
#include <iostream>
#include <erpc_client_setup.h>
#include <erpc_port.h>
#include "erpcdemo.h"
#include "erpc_setup_tcp.h"
using namespace std;
// 释放binary占用的空间
static void free_binary_t_struct(binary_t * data)
{if (data->data){erpc_free(data->data);}
}
int main(int argc, char *argv[])
{/* 创建client端传输层对象(TCP),127.0.0.1:5407 */auto transport = erpc_transport_tcp_init("127.0.0.1",5407, false);auto message_buffer_factory = erpc_mbf_dynamic_init();/* 初始化客户端 */erpc_client_init(transport,message_buffer_factory);auto msg = "hello!!!!!";binary_t b = {(uint8_t*)msg,(uint32_t)strlen(msg)};{/* RPC 调用 */auto resp = RD_demoHello(&b);/* 输出返回值 */cout << "RD_demoHello response:" << resp->data << endl;/* 对于返回指针类型的数据,用完后需要释放RD_demoHello中分配的内存 */free_binary_t_struct(resp);}/* 关闭socket */erpc_transport_tcp_deinit();
}

Server

/** test_erpcdemo_server.cpp**  Created on: Apr 15, 2020*      Author: guyadong*/#include <iostream>
#include <time.h>
#include <chrono>
#include <iomanip>
#include <sstream>
#include <string.h>
#include <erpc_server_setup.h>
#include "erpcdemo_server.h"
#include "erpc_setup_tcp.h"
using namespace std;
/** 返回当前时间字符串 */
static std::string now_str() {time_t t = std::chrono::system_clock::to_time_t(std::chrono::system_clock::now());std::stringstream ss;ss << std::put_time(std::localtime(&t), "%F %T");return ss.str();
}
/** servicer端实现接口方法 */
binary_t * RD_demoHello(const binary_t * txInput){cout << "RD_demoHello called" << endl;string o ((char*)txInput->data);o.append("@").append(now_str());auto ol = strlen(o.c_str());char* buf = (char*)malloc(ol + 1);strncpy(buf,o.c_str(),ol);return new binary_t{(uint8_t*)buf,(uint32_t)ol};
}
int main(int argc, char *argv[]){// 创建client端传输层对象(TCP),127.0.0.1:5407auto transport = erpc_transport_tcp_init("127.0.0.1",5407, true);/* MessageBufferFactory initialization */erpc_mbf_t message_buffer_factory = erpc_mbf_dynamic_init();/* eRPC 服务端初始化 */erpc_server_init(transport, message_buffer_factory);/** 将生成的接口服务DEMO添加到server, 参见生成的源文件 erpcdemo_server.h */erpc_add_service_to_server(create_DEMO_service());cout << "start erpcdemo server" << endl;/* 启动服务器 */erpc_server_run(); /* or erpc_server_poll(); *//* 关闭socket */erpc_transport_tcp_deinit();return 0;
}

并且提供用于TCP传输的实现文件

erpc_setup_tcp.cpp

/** Copyright (c) 2014-2016, Freescale Semiconductor, Inc.* Copyright 2016-2017 NXP* All rights reserved.*** SPDX-License-Identifier: BSD-3-Clause*/#include "erpc_setup_tcp.h"
#include "erpc_manually_constructed.h"
#include "erpc_tcp_transport.h"using namespace erpc;
// Variables
static ManuallyConstructed<TCPTransport> s_transport;
// Code
erpc_transport_t erpc_transport_tcp_init(const char *host, uint16_t port, bool isServer)
{s_transport.construct(host,port,isServer);erpc_status_t err = s_transport->open();if (err){return NULL;}return reinterpret_cast<erpc_transport_t>(s_transport.get());
}void erpc_transport_tcp_deinit()
{s_transport->close();
}

erpc_setup_tcp.h

/** Copyright (c) 2020, ZYtech, Inc.* All rights reserved.*** SPDX-License-Identifier: BSD-3-Clause*/#ifndef _ERPC_SETUP_TCP_H_
#define _ERPC_SETUP_TCP_H_#include "erpc_transport_setup.h"
/*!* @{* @brief erpc::TCPTransport类的标准C封装* @file*/
// API
#ifdef __cplusplus
extern "C" {#endif#include <stdint.h>//! @name TCP/IP transport
//@{/*!* @brief Create an TCP/IP transport.* 如果指定的主机和端口无法连接则返回NULL** @param[in] host Specify the host name or IP address of the computer.* @param[in] port Specify the listening port number.* @param[in] isServer True when this transport is used for server side application.* @return Return NULL or erpc_transport_t instance pointer.*/
erpc_transport_t erpc_transport_tcp_init(const char *host, uint16_t port, bool isServer);
/*!* @brief Deinitialize an TCP/IP transport.** This function deinitializes the TCP/IP transport.*/
void erpc_transport_tcp_deinit(void);//@}#ifdef __cplusplus
}
#endif/*! @} */#endif // _ERPC_SETUP_TCP_H_

7.编写Makefile

INCLUDE1 = ../erpc/erpc_c/setup/
INCLUDE2 = ../erpc/erpc_c/infra/
INCLUDE3 = ../erpc/erpc_c/port/
INCLUDE4 = ../erpc/erpc_c/config/
INCLUDE5 = ../erpc/erpc_c/transports/
LIBRARY1 = ../erpc/Debug/Linux/erpc/lib/all:g++  test_erpcdemo_client.cpp erpcdemo_client.cpp erpc_setup_tcp.cpp -I${INCLUDE1} -I${INCLUDE2} -I${INCLUDE3} -I${INCLUDE4} -I${INCLUDE5} -L${LIBRARY1} -lerpc -lpthread -o clientg++  test_erpcdemo_server.cpp erpcdemo_server.cpp erpc_setup_tcp.cpp -I${INCLUDE1} -I${INCLUDE2} -I${INCLUDE3} -I${INCLUDE4} -I${INCLUDE5} -L${LIBRARY1} -lerpc -lpthread -o server

7.编译代码

在编译前,demo目录中的文件结构如下图:

demo目录下直接执行make, 得到输出可执行文件client, server.

8.运行测试

必须首先执行server启动,否则,先执行client会出错。

server:

client:

Server有输出,Client 远程调用 Server 成功。

Note:如果遇到RPC调用失败没有输出的情况,可能是端口号被占用了,这个时候只要修改server和client端的端口号为一合法端口号即可。

结束

erpc Linux 本地环境的搭建和使用相关推荐

  1. linux 嵌入式 交叉 环境搭建 实验原理,实验三 嵌入式Linux开发环境的搭建

    南京邮电大学通达学院 实 验 报 告 实验 实验三题目 嵌入式Linux开发环境的搭建 课程名称 嵌入式驱动开发实验 学院 专业 班 实验者学号同做者学号 08002210 姓名 毛骏超 同做者学号 ...

  2. 嗖嗖嗖主题网wordpress外贸企业主题制作教程--第一讲 本地环境的搭建和wordpress安装

    第一讲 本地环境的搭建和wordpress安装 第一讲 本地环境的搭建和WordPress安装

  3. Linux LNMP环境的搭建 详细步骤

    Nginx的编译安装 yum install -y gcc gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel cd /root ...

  4. Linux开发环境的搭建

    记录在牛客Linux服务器开发项目学到的Linux开发环境搭建的步骤 视频网址        ​​​​ 课程列表_牛客网 (nowcoder.com) 需要的软件:VSCode.Xshell.Xftp ...

  5. 若依微服务版RuoYi-Cloud本地环境快速搭建教程

    参考若依官网文档:https://doc.ruoyi.vip/ruoyi-cloud/ 具体步骤: 一.下载RuoYi-Cloud源码 源码官方地址:https://gitee.com/y_proje ...

  6. linux开发环境基础搭建

    0.引言 总结在Windows环境搭建linux的C/C++开发环境,以及简单的GCC.Makefile.gdb介绍. 1. 虚拟机安装 在VMware官网下载软件并安装 在Ubuntu官网下载系统镜 ...

  7. 嵌入式linux开发环境 cpu,嵌入式Linux开发环境的搭建之:U-Boot移植-嵌入式系统-与非网...

    5.2  U-Boot移植 5.2.1  Bootloader介绍 1.概念 简单地说,Bootloader就是在操作系统内核运行之前运行的一段程序,它类似于PC机中的BIOS程序.通过这段程序,可以 ...

  8. Linux LNMP 环境的搭建之【Nginx的安装】

    Nginx 俄罗斯人开发的一款比较强劲的web服务器,静态页面html 单机在优化得当的情况下,能够达到3-4W的并发,是一款比较优秀的服务器软件,在国内,有Tengine[淘宝]开发的分支 ,关于T ...

  9. 嵌入式Linux开发环境的搭建

    一个.制造u-boot.bin文件:    tar xjf u-boot-1.1.6.tar.bz2    cd u-boot-1.1.6    patch -p1 < ../u-boot-1. ...

  10. linux 建立交叉编译环境变量,ARM-Linux-gcc-4.4.3交叉编译环境终于搭建

    Linux交叉编译环境终于搭建完成具体步骤: 0.软件请到友善之臂的官网下载 1.解压 tar zxvf arm-linux-gcc-4.4.3-20100728.tar.gz -C/(别make了, ...

最新文章

  1. 在CentOS上用yum安装redis
  2. cmake (4)多个子目录
  3. 「递归」第5集 | 从网瘾少年到极客大神:没有什么是一段代码解决不了的
  4. iOS Block 知识点拾遗
  5. aba会导致问题_肌肤缺水会导致哪些问题呢?我们又该怎么判断呢?
  6. Flink x Zeppelin ,Hive Streaming 实战解析
  7. 华科PAMI黑科技,方向任意目标检测新算法
  8. 连载三:Oracle升级文档大全
  9. 使用Jsoup完成网页爬虫
  10. STC学习:八位数码管动态扫描
  11. Win XP 精简版安装SQL Server
  12. 系统分析师-论文(论系统分析中对用户需求的把握、论信息系统开发方法及其应用)
  13. arcgis创建城市路网
  14. 【临床研究】---多元回归分析中的变量筛选问题
  15. JavaScript高级程序设计[美]Nicholas C.Zakas著 读书笔记(二)
  16. JAVA复制数组的三种方法
  17. xshell下载链接及安装步骤
  18. Clion 2021解决中文输出乱码问题-亲测有效
  19. 还没新上市华为鸿蒙os,搭载华为操作系统的新机或年内上市 华为自研操作系统是鸿蒙还是OS?...
  20. Apriori算法python实现(数据挖掘学习笔记)

热门文章

  1. 4.1.14 Flink-流处理框架-Flink流处理API之数据重分区操作
  2. Phoenix 升級报Cluster is being concurrently upgraded from 4.9.x to 4.13.x 错误
  3. [Luogu P3164] [BZOJ 3503] [CQOI2014]和谐矩阵
  4. java成员变量的调用_java中对象调用成员变量与成员的方法介绍
  5. Windows 驱动开发 新手入门(一)
  6. Ardunio开发实例-MMA8653FC 10位加速度计
  7. android gps定位误差,Android的GPS定位速度不可靠
  8. R语言和医学统计学(11):球形检验
  9. Linux timeout命令
  10. 上位机PC控制UR3机器人实现方式