【问题标题】:protobuf RPC structure (embedded ARM)protobuf RPC 结构(嵌入式 ARM)
【发布时间】:2013-03-18 15:38:16
【问题描述】:

我需要在嵌入式 arm 系统中使用 protobuf。需要纯C的支持。该项目将使用客户端-服务器架构(C服务器与java、Python客户端)。该项目需要考虑扩展协议的可能性。 例如 - 这样的请求将被发送到服务器:

read <address> <type> <count> [<filename>]
write <address> <type> <value>
...

其中地址、长度、类型、值 - 必需;文件名 - 可选。请求必须包含以下命令之一:write、read ...(但不超过一个)。 我认为应该是这样的:

message WriteRequest {
    enum ValueType {
        INT8 = 0 [(string)="int8"];
        INT16 = 1 [(string)="int16"];
        INT32 = 2 [(string)="int32"];
        INT64 = 3 [(string)="int64"];
        FLOAT32 = 4 [(string)="float32"];
        FLOAT64 = 5 [(string)="float64"];
        BYTEARRAY = 6 [(string)="bytearray"];
    }

    required uint64 address = 1;

    required ValueType value_type = 2 [default = INT32];
    optional int32 value_int8 = 3;
    optional int32 value_int16 = 4;
    optional int32 value_int32 = 5;
    optional int32 value_int64 = 6;
    optional float value_float32 = 7;
    optional double value_float64 = 8;
    optional bytes value_bytearray = 9;
}
...
message Request {
    enum RequestType {
        READ_REQUEST = 1;
        WRITE_REQUEST = 2;
        ...
    }

    required RequestType request_type = 1;
    optional ReadRequest read = 3;
    optional WriteRequest write = 4;
    ...
}

我认为在这种情况下最好的选择 - nanopb (http://koti.kapsi.fi/jpa/nanopb/)。在我看来,代码 nanopb 写得很好。

据我了解,nanopb 不支持自描述消息。或任何反射方法。这就是我选择这种结构的原因。 这种结构最适合这种情况吗?将来会不会有问题?是否需要为新命令扩展协议(例如:listStatus &lt;id&gt; &lt;verbose&gt;)?

如果用作服务器 nanopb(像这样:http://code.google.com/p/nanopb/source/browse/example/server.c),我可以用作客户端吗? (据我了解,nanopb 不支持 .proto 中的服务。)

service MyService {
  rpc Search (Request) returns (Response);
}

PS:protobuf-c值得用吗?

【问题讨论】:

    标签: java c embedded rpc protocol-buffers


    【解决方案1】:

    自描述消息更像是一种特殊情况,我认为即使它们受到支持,您也不应该在此处使用它们。 Protocol Buffers 对以后扩展消息有很好的支持,你可以为新的请求类型添加新的可选字段。

    您不一定需要那些 ValueType 和 RequestType 字段。相反,您可以检查每个字段是否存在(has_value_int8 等)。

    然后,您的请求消息将使用“Union Message”设计模式。如果希望节省内存,可以使用 nanopb 回调机制将函数绑定到每个请求类型。

    【讨论】:

    • 感谢您的回复。服务呢?兼容服务器,使用 nanopb 和客户端编写,由 .proto 文件中的指令 services 创建吗?
    • nanopb 目前不支持service 关键字。此外,protocol buffers 没有定义service 的实现,因此无论如何它不会在不同的库之间兼容。我建议不要使用 service 关键字。
    • 谢谢。所以我只是不明白service关键字的含义...(这是我第一次使用protobuf)。我认为对于...的不同实现之间的兼容性是必要的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-09
    • 2014-07-31
    • 2016-12-23
    • 2013-01-05
    • 1970-01-01
    相关资源
    最近更新 更多