我正在尝试将数据流式传输到微控制器上 SD 卡上的日志文件,该微控制器从某些传感器读取并将值存储在文件中。
为了序列化数据,我将使用 NanoPB,它是 C 的 protobuf 实现,非常节省资源。
日志文件的结构如下: 它需要写一个由 GUID 和固件版本组成的短标题。在标头之后,数据流应该是连续的,它应该记录来自传感器的字段,而不是标头值(这应该只在开始时出现一次)。
限制是我只能使用一个 .proto 文件进行序列化和反序列化,并且我想避免使用 .proto 中的“重复”字段然后使用 nanopb 的 C 实现而出现的 Pb_callback 函数。https://jpa.kapsi.fi/nanopb/docs/concepts.html。
我尝试过的实现如下(字段只是示例):
syntax = "proto3";
import "timestamp.proto";
import "nanopb.proto";
message LogHeader {
string firmware = 1 [(nanopb).max_size = 11];
string GUID = 2 [(nanopb).max_size = 11];
}
message Sensors {
int32 TimeStamp = 3;
// Sensory data
int32 Sens1 = 4;
int32 Sens2 = 5;
int32 Sens3 = 6;
int32 Sens4 = 7;
int32 Sense5 = 8;
}
我们的想法是拥有一个处理后看起来像这样的日志文件:
firmware "1.0.0"
GUID "1231214211321" (example)
Timestamp 123123
Sens1 2343
Sens2 13123
Sens3 13443
Sens4 1231
Sens5 190
Timestamp 123124
Sens1 2345
Sens2 2312
...
但是,如果所有字段都在同一条消息中,则每次重复都会记录 GUID 和固件。而如果我将其拆分为 2 条消息,我将无法使用一个 proto 文件一次性反序列化它们。我需要知道前两条消息的长度,对它们进行反序列化,然后从那里开始记录日志。