协议缓冲区特异性

Protocol Buffer Specificity

本文关键字:特异性 缓冲区 协议      更新时间:2023-10-16

我最近开始集成Google的Protocol Buffer,用于机器人网络中更复杂的数据结构(例如矩阵、内部状态数组、设备信息)的通信。

当我还在原型阶段的时候,我已经开始思考我应该如何使原型消息更具体以获得长期支持。我看到了三种可能的方法(非常简单的例子):

1)中等专用性:使消息特定于每种类型的机器人。例:

// RobotA.proto
optional int32 commandID
repeated double positionData //ex: this robot has many joints
// RobotB.proto
optional int32 commandID
optional int32 subCommandID //ex: this robot has subcommands
optional double positionData //ex: this robot has only one joint

2)低特异性:使信息非常一般化。例:

// GeneralRobotMessage.proto
optional int32 commandID //switch-case which other potential data is needed
optional int32 potentialIntData 
repeated double potentialDoubleArray
optional string potentialStringData
optional bool potentialBoolData

3)高特异性:每种类型的消息都有一个protobuf。例:

// NAKMessage.proto
// ACKMessage.proto
// RobotAGetPosition.proto

根据过去的经验,我通常采用一种低特异性的方法,并使用命令id(又名数据包头)来指定解析消息的方法。但是对于protobufs,预先指定的。proto的整个概念似乎充当了头文件的概念。

是否有推荐的消息专用性方法?编码标准?经验法则?

欢呼,

我猜这主要是品味问题(使这个Q边缘偏离主题)

我会阅读并遵循proto3指南和风格指南。

作为提示,我建议指定字段和消息,用于区分特定收件人上的消息,以便解析变得更容易。

如果可能的话,也保持所有的实体是可选的,然后你可以改变格式,它仍然是向后兼容的。

嵌套消息也可以是另一种选择,您可以创建一个层次结构,如:

message Robot{
    optional uint32 id = 1;
    optional RobotTypeA robo_type_a = 2;
    optional RobotTypeB robo_type_b = 3;
    message RobotTypeA {
     optional uint32 a = 1;
     optional uint32 b = 2;
     optional uint32 c = 3;
     optional uint64 d = 4;
     optional int32 command_id = 5;
     optional string ip_address = 6 [default = "10.10.10.10"];
    }
    message RobotTypeB {
     optional uint32 a = 1;
     optional uint32 b = 2;
     optional uint32 c = 3;
     optional uint64 d = 4;
     optional int32 command_id = 5;
     optional string ip_address = 6 [default = "10.10.10.10"];
    }
}