首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >nanopb -编码问题

nanopb -编码问题
EN

Stack Overflow用户
提问于 2021-10-04 08:12:00
回答 1查看 135关注 0票数 1

我正在尝试使用oneof对消息进行编码-但大小似乎不太好。这看起来像是忽略了oneof部分-并且没有将其编码到流中。编码函数都返回"TRUE“-这意味着它们按照我的请求进行了编码,这意味着我编码错误……我错过了一些非常愚蠢的东西。

代码语言:javascript
复制
static auto encode(const pb_msgdesc_t *fields, const void *msg) -> std::vector<pb_byte_t>
{
    size_t size = 0;
    bool ok;
    ok = pb_get_encoded_size(&size, fields, msg);
    printf("pb_get_encoded_size=%d, Encoding data as %lx bytes\n", ok, size);
    auto buff = std::vector<pb_byte_t>(size);
    auto stream = pb_ostream_from_buffer(buff.data(), buff.size());
    ok = pb_encode(&stream, fields, msg);
    printf("pb_encode=%d, Encoding data as %lx bytes\n", ok, stream.bytes_written);
    return buff;
}

auto nano_pb_test() -> void
{
    std::vector<pb_byte_t> pb_res;
    {
        WifiCredResult2 wifi_result;
        wifi_result.ip = (int32_t)3232235920; // https://www.browserling.com/tools/ip-to-dec -> 192.168.1.144
        wifi_result.mac = { 6, { 0x30, 0x31, 0x32, 0x33, 0x34, 0x35}};

        ToAppMessage2 toAppMessage2 = ToAppMessage2_init_zero;
        toAppMessage2.type = ToAppMessageType_CONNECT_WIFI_RESULT;
        toAppMessage2.result = ToAppResultType_NETWORK_IS_LOCAL_ONLY;
        toAppMessage2.esp_error = 0x7002;
        toAppMessage2.which_payload = WifiCredResult2_ip_tag;
        toAppMessage2.payload.wifi = wifi_result;
        pb_res = encode(ToAppMessage2_fields, &toAppMessage2);
    }
    {
        ToAppMessage2 toAppMessage3 = ToAppMessage2_init_zero;
        toAppMessage3.payload.wifi.ip = 12;
        pb_istream_t istream = pb_istream_from_buffer((const pb_byte_t *)pb_res.data(), pb_res.size());

        if (!pb_decode(&istream, ToAppMessage2_fields, &toAppMessage3)) {
            printf("nanopb failed parsing:\n");
        } else {
            printf("result = %d, esp: %x, ip=%d\n", toAppMessage3.result, toAppMessage3.esp_error, toAppMessage3.payload.wifi.ip);
        }
    }
}

协议缓冲区(部分..)

代码语言:javascript
复制
enum ToAppMessageType {
...
}

enum ToAppResultType {
...
}

message Details {
    string project_id = 1;
    string url1   = 2;
    string url2    = 5;
}

message Result2 {
    int32 ip = 1;
    bytes mac = 2;
}

message ToAppMessage2 {
    ToAppMessageType type = 1;
    ToAppResultType result = 2;
    int32 error = 3;

    oneof payload {
        WifiCredResult2 wifi = 4;
        PairResult pair = 5;
    }
}

选项文件:

代码语言:javascript
复制
WifiCredResult2.mac max_size:6
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-10-04 08:52:40

我想你的问题出在这里:

代码语言:javascript
复制
toAppMessage2.which_payload = WifiCredResult2_ip_tag;

这将表明您的payload of包含一个WifiCredResult2.ip类型的项,但该of中没有这样的项,因此不会进行任何编码。看来你想要的是:

代码语言:javascript
复制
toAppMessage2.which_payload = ToAppMessage2_wifi_tag;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69432829

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档