Я работаю над десериализацией файла журнала, который был сериализован в C с использованием буферов протокола (и NanoPB).
Файл журнала имеет короткий заголовок, состоящий из: объекта, версии и идентификатора. После заголовка поток данных должен быть непрерывным и должен регистрировать поля от датчиков, но не значения заголовка (это должно происходить только один раз и в начале). Тот же файл .proto использовался для сериализации файла. У меня нет отдельных файлов .proto для заголовка и для потоковых данных.
После моей реализации я предполагаю, что это должно выглядеть так:
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
...
Я отправил это вопрос , чтобы выяснить, как изначально структурировать файл .proto, когда я выполнял сериализацию в C. И, наконец, я использовал похожий подход, но не включил: [(nanopb) .max_count = 1];
Наконец, я выбрал следующее .proto в Python (может быть больше датчиков, чем 5):
syntax = "proto3";
import "timestamp.proto";
message SessionLogs {
int32 Entity = 1;
string Version = 2;
string GUID = 3;
repeated SessionLogsDetail LogDetail = 4;
}
message SessionLogsDetail
{
int32 DataTimestamp = 1; // internal counter to identify the order of session logs
// Sensor data, there can be X amount of sensors.
int32 sens1 = 2;
int32 sens2= 3;
int32 sens3= 4;
int32 sens4= 5;
}
На этом этапе я могу сериализовать сообщение при входе в систему на своем устройстве, и в соответствии с размером файла журнал, кажется, работает, но я не смог десериализовать его. Python в автономном режиме, чтобы проверить правильность моей реализации. И я не могу сделать это в C, так как это встроенное приложение, и я хочу сделать пост-обработку в автономном режиме с Python.
Кроме того, я проверил этот онлайн-десбурилизатор protobuf где я могу передать сериализованный файл и десериализовать его без использования файла .proto. В нем я вижу значения заголовка (поле 3 пусто, поэтому его не видно) и зарегистрированную информацию. Это заставляет меня думать, что сериализация верна, но я неправильно десериализирую ее на Python.
Это мой текущий код, используемый для десериализации сообщение в Python:
import PSessionLogs_pb2
with open('$PROTOBUF_LOG_FILENAME$', 'rb') as f:
read_metric = PSessionLogs_pb2.PSessionLogs()
read_metric.ParseFromString(f.read())
Кроме того, я использовал proto c, чтобы сгенерировать .py эквивалент файла .proto для десериализации в автономном режиме.