问题标签 [nanopb]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
153 浏览

protocol-buffers - Protobuf (C++) 为可选字段抛出“缺少必需参数”错误

我在使用 nanopb 的嵌入式设备和使用 protobuf-c 的台式电脑之间进行通信,但在解析编码消息时出错。嵌入式设备发送消息“响应”,其中包含不同消息类型 (ResponseContent) 的可选字段。另一条消息具有必填字段。这是消息定义

为什么 Response 消息中的 ResponseContent 类型是可选的,并且 has_response_content 参数设置为false时会弹出错误“缺少必填字段” ?注意:显然这发生在 *bool ParseFromArray(const void * data, int size)* 而不是 *bool ParsePartialFromArray(const void * data, int size)*

0 投票
1 回答
474 浏览

python - 反序列化带有标头和重复字段的流式协议缓冲区消息

我正在反序列化使用协议缓冲区(和 NanoPB)在 C 中序列化的日志文件。

日志文件有一个简短的标头,由以下部分组成:实体、版本和标识符。在标头之后,数据流应该是连续的,它应该记录来自传感器的字段,而不是标头值(这应该只在开始时出现一次)。相同的 .proto 文件用于序列化文件。对于标头和流数据,我没有单独的 .proto 文件。

在我实施之后,我认为它应该如下所示:

当我在 C 中实现序列化时,我最初发布了这个问题来弄清楚如何构造 .proto 文件。最后我使用了类似的方法,但没有包括:[(nanopb).max_count = 1];

最后,我在 Python 中选择了以下 .proto (传感器可以多于 5 个):

此时,我可以在使用设备登录时序列化一条消息,根据文件大小,日志似乎可以工作,但我无法在 Python 脱机上对其进行反序列化,以检查我的实现是否正确。而且我不能在 C 中做到这一点,因为它是一个嵌入式应用程序,我想用 Python 离线进行后处理。

另外,我已经检查了这个在线 protobuf 反序列化器,我可以在其中传递序列化文件并在不需要 .proto 文件的情况下对其进行反序列化。在其中,我可以看到标题值(字段 3 为空,因此看不到)和记录的信息。所以这让我认为序列化是正确的,但我在 Python 上错误地反序列化它。

解串器的输出

这是我当前用于在 Python 中反序列化消息的代码:

除此之外,我还使用 protoc 生成了 .proto 文件的 .py 等价文件以脱机反序列化。

0 投票
1 回答
73 浏览

embedded - 如何在 gsm 调制解调器通信中使用 nanopb,其中特定字符(如 CTRL+Z)用作 AT 命令中的 msg 终止?

在寻找序列化-反序列化选项时,我遇到了 nanopb,它适用于使用 google 协议缓冲区的 32 位控制器。

当我对在 gsm 调制解调器上尝试 mqtt 通信感到好奇时,我意识到我无法让 nanopb 的编码机制知道如何处理转义字符/特殊字符,例如 CTRL+Z,因为它们都被编码以十六进制格式。(例如,十六进制的 CTRL+Z 将是 0x1A)并且 gsm 调制解调器使用 0x1A 作为消息终止字符。因此,当通过 AT 命令向调制解调器发送 nanopb 编码消息时,调制解调器将包含 0x1A 的编码消息解释为 CTRL+Z,这是它不应该的。

在这种情况下可以使用 nanopb 吗?还是我做错了什么?

0 投票
1 回答
595 浏览

c - c:具有 nanopb (protobuf) 的重复字段的默认值

我正在尝试使用具有一些默认值的重复字段创建一条消息。我开始很慢,重复了一个简单的 int (我的最终目标是重复的消息,所有字段都有一些默认值)

所以,开始我的原型是:

protobuf 已编译,但没有跟踪到我的默认值。

0 投票
0 回答
106 浏览

c++ - 如何使用 nanopb(4.0 版)对重复字段进行编码

可能非常简单,但我花了大约 4 个小时梳理文档,没有什么是足够清楚的,或者是为我可能没有使用的版本编写的。

我有这样的消息设置(我省略了时间戳,因为它没有问题):

编译为

我想将数组中的整数放入 AudioEntry 字段。我该怎么做呢?编码和东西都很好。

我将添加一些我已经尝试过的示例,但是到目前为止,我尝试过的任何事情似乎对编译器都没有任何意义。

0 投票
1 回答
729 浏览

protocol-buffers - Nanopb - 解码失败:零标签

这是我第一次在这里写作,如果我做错了什么,请原谅。

我需要有关“解码失败:零标签”状态的帮助。

我想使用 ESP-NOW 发送数组这是我的编码方面:

在我打印时编码后:

它向我显示了正确的值-因此这意味着 postavke.baterija[0] 具有类似 postavke.baterija[1] 的值,例如它向我显示 87 ,85 它取决于。

但问题是当我想解码它时。它告诉我:“解码失败:零标签”这是代码:

如果我不使用这个

`

它解码其他所有内容,但不解码“postavke.baterija”数组

这是我在 .proto 文件中的操作方式

}

这是我的 .options 文件

请帮我!!错在哪里?为什么不想解码?

谢谢!

0 投票
1 回答
282 浏览

protocol-buffers - nanopb-generator.py 给出错误“makedirs() 得到了一个意外的关键字参数‘exist_ok’”

我用python3创建了一个virtualenv。在虚拟环境中,我的文件夹中有 2 个原始文件以及 nanopb 包。结构是

作为第一步,我使用命令将 types.proto 和 api.proto 编译成 api.pb

生成 pb 文件后,我执行以下命令,

这给出了以下错误

知道我在这里做错了什么。对protobuf来说很新。

谢谢

0 投票
1 回答
543 浏览

protocol-buffers - nanopb 在 protobuf 中的编译问题

我正在使用 nanopb 库

我寻求您的建议来解决构建问题 - 我正在使用 protobuf 3.12,nanopb 0.4.2, puython3,gcc 。我编译了 c 和 python 的 protoc,但在构建时仍然遇到问题。

请告诉我我错过了什么。我应该只使用 Python2 吗?
另外不建议在 nanopb 中使用 protobuf 的哪些功能?nanopb 是否同时支持 proto2 和 proto3 语法?

0 投票
1 回答
1162 浏览

protocol-buffers - nanopb中的编码和解码问题

最近开始探索 nanopb - 如果我的问题听起来很愚蠢,请道歉。当我修改 nanopb 的简单示例时,我在分配和检索字符串和整数时遇到了一些问题。让我在我的问题之前给出我的步骤 -

  1. 我定义了 simple.proto 文件
  1. 还定义了 simple.option

然后我像往常一样编译:protoc -osimple.pb simple.proto

  1. 这是我的代码:

3a) 使用与如何对 pb_callback_t 类型的字符串进行编码中相同的字符串编码解码实用程序函数

3b)这是我基于 simple.c 示例的主要代码片段 -

  1. 构建并运行后的输出:

我的查询(还在代码中添加了我的内联注释):

  1. 在原始 simple.c message.lucky_number=13 分配有效,但这里 message.uptime 分配不起作用,它采用默认值。同样,将布尔值分配给 message.isSecured 也不起作用。请告诉我错在哪里。
  2. 我在 pb_encode 之前使用了 Device_init_default,因为有些具有默认值,而在 pb_decode 调用之前使用了 Device_init_zero,因为它将在解码后填充。我的方法正确吗?
  3. 除了 encode_string 和 decode_string util 之外,还有什么更简单的方法可以使用 strcpy 分配字符串值并通过 printf("%s",strvar) 以 C 方式打印它?
  4. 该字符串仅在 pb_decode 调用之前打印,但正常运行时间默认值在 pb_decode 调用之后打印。布尔值分配也不起作用。为什么 ?我的错误是什么?
  5. 我在https://github.com/nanopb/nanopb/blob/master/tests/callbacks/encode_callbacks.c中看到了编码字符串和 int 函数 如何编码和解码 float 和 boolean ?

感谢期待

0 投票
0 回答
73 浏览

protocol-buffers - 基于 nanopb 的 TCP 客户端无法与 Java TCP Netty 服务器交互

探索 nanopb 客户端服务器示例并尝试使用其他 protobuf 库。我的问题是: nanopb 生成的 protobuf 是否与使用 google 的 protobuf-java 以其他语言(如 java)生成的 protobuf 兼容?用 nanopb 编码的 protobuf 可以由 java 中的 google protobuf 库解码,反之亦然?我在 C protobuf 客户端和 Java Protobuf 服务器之间的套接字通信中遇到了问题。C 客户端代码遵循 nanopb network_server 示例,客户端服务器共享相同的原始消息。C 客户端和 C 服务器运行良好,Java 客户端和 Java 服务器也运行良好。但是,当 C 客户端连接到 Netty TCP 服务器时,它没有显示任何输出。

options 定义了 max_size。

C 客户端代码片段:

Java TCP 服务器(基于 Netty)片段:

C 客户端的服务器输出为空白,但显示 Java Netty 客户端的客户端发送数据。任何建议为什么我的代码失败?感谢期待。