erpc Linux 本地环境的搭建和使用
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 本地环境的搭建和使用相关推荐
- linux 嵌入式 交叉 环境搭建 实验原理,实验三 嵌入式Linux开发环境的搭建
南京邮电大学通达学院 实 验 报 告 实验 实验三题目 嵌入式Linux开发环境的搭建 课程名称 嵌入式驱动开发实验 学院 专业 班 实验者学号同做者学号 08002210 姓名 毛骏超 同做者学号 ...
- 嗖嗖嗖主题网wordpress外贸企业主题制作教程--第一讲 本地环境的搭建和wordpress安装
第一讲 本地环境的搭建和wordpress安装 第一讲 本地环境的搭建和WordPress安装
- Linux LNMP环境的搭建 详细步骤
Nginx的编译安装 yum install -y gcc gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel cd /root ...
- Linux开发环境的搭建
记录在牛客Linux服务器开发项目学到的Linux开发环境搭建的步骤 视频网址 课程列表_牛客网 (nowcoder.com) 需要的软件:VSCode.Xshell.Xftp ...
- 若依微服务版RuoYi-Cloud本地环境快速搭建教程
参考若依官网文档:https://doc.ruoyi.vip/ruoyi-cloud/ 具体步骤: 一.下载RuoYi-Cloud源码 源码官方地址:https://gitee.com/y_proje ...
- linux开发环境基础搭建
0.引言 总结在Windows环境搭建linux的C/C++开发环境,以及简单的GCC.Makefile.gdb介绍. 1. 虚拟机安装 在VMware官网下载软件并安装 在Ubuntu官网下载系统镜 ...
- 嵌入式linux开发环境 cpu,嵌入式Linux开发环境的搭建之:U-Boot移植-嵌入式系统-与非网...
5.2 U-Boot移植 5.2.1 Bootloader介绍 1.概念 简单地说,Bootloader就是在操作系统内核运行之前运行的一段程序,它类似于PC机中的BIOS程序.通过这段程序,可以 ...
- Linux LNMP 环境的搭建之【Nginx的安装】
Nginx 俄罗斯人开发的一款比较强劲的web服务器,静态页面html 单机在优化得当的情况下,能够达到3-4W的并发,是一款比较优秀的服务器软件,在国内,有Tengine[淘宝]开发的分支 ,关于T ...
- 嵌入式Linux开发环境的搭建
一个.制造u-boot.bin文件: tar xjf u-boot-1.1.6.tar.bz2 cd u-boot-1.1.6 patch -p1 < ../u-boot-1. ...
- linux 建立交叉编译环境变量,ARM-Linux-gcc-4.4.3交叉编译环境终于搭建
Linux交叉编译环境终于搭建完成具体步骤: 0.软件请到友善之臂的官网下载 1.解压 tar zxvf arm-linux-gcc-4.4.3-20100728.tar.gz -C/(别make了, ...
最新文章
- 在CentOS上用yum安装redis
- cmake (4)多个子目录
- 「递归」第5集 | 从网瘾少年到极客大神:没有什么是一段代码解决不了的
- iOS Block 知识点拾遗
- aba会导致问题_肌肤缺水会导致哪些问题呢?我们又该怎么判断呢?
- Flink x Zeppelin ,Hive Streaming 实战解析
- 华科PAMI黑科技,方向任意目标检测新算法
- 连载三:Oracle升级文档大全
- 使用Jsoup完成网页爬虫
- STC学习:八位数码管动态扫描
- Win XP 精简版安装SQL Server
- 系统分析师-论文(论系统分析中对用户需求的把握、论信息系统开发方法及其应用)
- arcgis创建城市路网
- 【临床研究】---多元回归分析中的变量筛选问题
- JavaScript高级程序设计[美]Nicholas C.Zakas著 读书笔记(二)
- JAVA复制数组的三种方法
- xshell下载链接及安装步骤
- Clion 2021解决中文输出乱码问题-亲测有效
- 还没新上市华为鸿蒙os,搭载华为操作系统的新机或年内上市 华为自研操作系统是鸿蒙还是OS?...
- Apriori算法python实现(数据挖掘学习笔记)
热门文章
- 4.1.14 Flink-流处理框架-Flink流处理API之数据重分区操作
- Phoenix 升級报Cluster is being concurrently upgraded from 4.9.x to 4.13.x 错误
- [Luogu P3164] [BZOJ 3503] [CQOI2014]和谐矩阵
- java成员变量的调用_java中对象调用成员变量与成员的方法介绍
- Windows 驱动开发 新手入门(一)
- Ardunio开发实例-MMA8653FC 10位加速度计
- android gps定位误差,Android的GPS定位速度不可靠
- R语言和医学统计学(11):球形检验
- Linux timeout命令
- 上位机PC控制UR3机器人实现方式