我需要通过串行端口传输数据。为了确保数据的完整性,我想要一个围绕每个 protobuf 消息的小信封协议。我想到了以下几点:
- 消息类型(1 字节)
- 消息大小(2 个字节)
- protobuf 消息(N 字节)
- (校验和;可选)
消息类型主要是 proto 文件中定义的消息之间的映射。但是,如果消息损坏或某些字节丢失,则消息大小将不正确,并且无法再解释所有后续字节。解决这个问题的一种方法是在消息之间引入限制器,但为此我需要选择 protobuf 不使用的东西。是否存在任何 protobuf 消息从未使用过的字节序列?
我也想过另一种方式。如果 master 发现包损坏,它应该将通信重置为干净的开始。为此,我希望主机向从机发送 RESTART 命令。从机应以 ACK 应答,然后再次开始发送完整消息。在 RESTART 和 ACK 之间接收到的所有字节都将被主机丢弃。我想将 ACK 和 RESTART 编码为特殊消息。但是使用这种方法我面临同样的问题:我需要为 ACK 和 RESTART 找到未被任何 protobuf 消息使用的字节序列。
也许我也采取了错误的方法 - 随意建议其他方法来处理丢失的字节。