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