erpc Linux 本地环境的搭建和使用

1.代码下载

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

在这里插入图片描述

2.安装依赖

	sudo apt-get install flex bison
	sudo 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:5407
	auto 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 client
	g++  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端的端口号为一合法端口号即可。

结束

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

papaofdoudou

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值