天天看點

C++輕量級RPC庫RpcCore倉庫位址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

  1. 在自己的項目添加搜尋路徑
include_directories(RpcCore的目錄)
           
  1. 基本用法(省略初始化過程)
// 接收端
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