8

小規模なシステムで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 実装と互換性がありません!

プロトブフの比較。

4

2 に答える 2

2

オフセットを 0 ではなく -1 として指定します。例:

writtenlenght = PhoneNumber_write_delimited_to(&number, outputbuffer, -1);

または、単に使用できますPhoneNumber_write(&number, outputbuffer, 0);

于 2012-06-27T10:49:17.460 に答える
0

protobuf-embedded-c の生成された C ファイルには、

int $name$_read(void *_buffer, $if(empty)$$else$struct $name$ *_$name$, $endif$int offset, int limit);
int $name$_write($if(empty)$$else$struct $name$ *_$name$, $endif$void *_buffer, int offset);

サイズプレフィックスなしでメッセージの読み取り/書き込みを行うように見えます。これらが生成された H ファイルに公開されていない理由はわかりませんが、自分で追加できるはずです。

于 2012-06-03T20:00:38.110 に答える