小規模なシステムでprotobuf-embedded-cを使用して、そこから別のデータを PC に転送しています。問題は、組み込みライブラリを両端で使用するとすべてが機能することです。PC で Google C++ を使用すると、動作しなくなります。すべてのメッセージに長さのプレフィックスがある埋め込みライブラリに問題を追跡したと思いますが、C++ ライブラリではこれをうまく行うことができないようです。これをデバッグするために使用したテストアプリケーションは次のとおりです。
person.proto:
enum PhoneType {
MOBILE = 0;
HOME = 1;
WORK = 2;
}
message PhoneNumber {
required float number = 1;
required PhoneType type = 2;
}
main.cpp:
#include <stdint.h>
#include <stdio.h>
#define __PROTOBUF_CPP_IMPL
#ifdef __PROTOBUF_CPP_IMPL
#include "person.pb.h"
#else
extern "C"{
#include "person.h"
}
#endif
int main(int argc, char *argv[])
{
static const uint32_t outputbuflen = 1024;
uint8_t outputbuffer[outputbuflen];
uint32_t writtenlenght = 0;
#ifdef __PROTOBUF_CPP_IMPL
// C++ implementation.
printf("Google C++ implementation;\n");
PhoneNumber number;
number.set_number(0800123123.0);
number.set_type(MOBILE);
writtenlenght = number.ByteSize();
numberSerializeToArray(outputbuffer, writtenlenght);
#else
// Embedded c implementation.
printf("embedded-c implementation:\n");
PhoneNumber number;
number._number = 0800123123.0;
number._type = _MOBILE;
writtenlenght = PhoneNumber_write_delimited_to(&number, outputbuffer, 0);
#endif
for(uint32_t i = 0; i < writtenlenght; i++){
printf("%.2X ", outputbuffer[i]);
}
printf("\n");
return 0;
}
本当の問題: 組み込みライブラリと正常に通信するには、Google protobuf C++/Java ライブラリでどのメソッドを使用する必要がありますか? 簡単な答えは、おそらくすべてのメッセージにプレフィックスを追加する (解析時に読み取る) ことですが、これはコードを壊します。より良い組み込みライブラリを探すべきですか?
更新: nanopb と呼ばれるこの素晴らしい小さなライブラリを試してみましたが、今のところ問題なく動作します。結論: protobuf-embedded-c は、Google の protobuf 実装と互換性がありません!