C++轻量级RPC库RpcCore
C++轻量级的RPC库,可用于任何项目中,甚至单片机。
方便平台直接相互进行功能调用。
- 基于asio的实现 asio_net 也可用在esp32
- 适用于ESP32/ESP8266的实现 esp_rpc
目前也有一些轻量的库,参考了protobuf(或者依赖它),基于IDL。
其实对于中小型的项目而言,使用IDL并不是一个好的选择,使用也不方便。
仓库地址
https://github.com/shuai132/RpcCore
以下是README,方便SEO。最新文档请打开上述链接。
RpcCore
RPC Core library, designed for IOT, support most microchip(Arduino、STM32、ESP8266)
Introduction
完善的RPC框架(如gRPC)使用复杂,尤其在嵌入式平台更不现实。
本项目提供轻量级的消息注册、解析分发功能以及方便使用的API。
注:本仓库只提供协议层和API,不包含传输层实现。基于TCP的实现见文末Links。
Features
- 简单高效易用 支持性能受限的平台
- Header-Only 仅有头文件
- 支持任意形式的连接(串口、TCP等)
- 提供基本数据类型、结构体、字符串、二进制类型的序列化实现
- 方便自定义消息类型 提供了
Flatbuffers
、json
的实现 - 提供Dispose基于RAII自动取消请求 方便UI相关应用
- 支持设置超时重试次数
- std::future接口
Requirements
- C++11
- 数据收发需要完整的数据包,例如WebSocket。
如果用Socket/串口等需要自己实现消息打包解包。可使用:PacketProcessor
或 data_packer.hpp
Usage
- 在自己的项目添加搜索路径
include_directories(RpcCore的目录)
- 基本用法(省略初始化过程)
// 接收端
rpc->subscribe("cmd", [](const String& msg) -> String {assert(msg == "hello");return "world";
});// 发送端
rpc->cmd("cmd")->msg(String("hello"))->rsp([](const String& rsp) {assert(rsp == "world");})->call();
详细的初始化流程和单元测试见:RpcTest.cpp
Design
类说明
外部接口
- Connection 提供收发实现
- Rpc 提供注册消息和创建请求的方法
- Request 提供消息请求的各种方法
- Message 消息自定义序列化/反序列化规则
- Dispose 通过RAII的方式 用于自动取消Request
内部实现
- MsgWrapper 包装Message 用于内部传输解析
- MsgDispatcher 解析MsgWrapper 分发消息
- Coder MsgWrapper序列化实现
Plugin
-
JsonMsg.hpp
支持直接使用nlohmann/json支持的类型作为消息传输
(需满足nlohmann/json
中的to_json/from_json
规则) -
FlatbuffersMsg.hpp
支持直接使用Flatbuffers
生成的类型作为消息传输(flatc
需添加参数--gen-object-api
)
Links
- 基于asio的实现 asio_net
- 适用于ESP32/ESP8266的实现 esp_rpc