问题标签 [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 投票
1 回答
558 浏览

protocol-buffers - nanopb oneof size requirements

I came across nanopb and want to use it in my project. I'm writing code for an embedded device so memory limitations are a real concern.

My goal is to transfer data items from device to device, each data item has an 32bit identifier and an value. The value can be anything from 1 char to float to long string. I'm wondering what would be the most efficient way of declaring the messages for this type of problem.

I was thinking something like this:

But as I understood this is converted in to C union, which is the size of the largest element. Say I limit the string to 50 chars, then the union is always 50 bytes long, even if I would need 4 bytes for a float.

Have I understood this correctly or is there some other way to accomplish this?

Thanks!

0 投票
1 回答
329 浏览

nanopb - nanopb 编码总是大小为 0(但没有编码失败)

我有一个非常简单的原型:

...我的主循环中有以下代码用于 arduino 程序:

出于某种原因,我可以打印 test_msg.val 并且它会显示123,但是当我尝试对其进行编码时(按照这样的示例它总是为空/大小为 0。

这是 nanopb 的配置问题吗?我想知道编码方法是否需要我不使用的东西?

0 投票
1 回答
904 浏览

c - nanopb (Protocol Buffers library) 重复子消息编码

我们使用nanopb库作为我们的 Protocol Buffers 库。我们定义了以下消息:

simple.proto

simple.options

所以我们知道repField有一个固定的大小 300 并因此定义它。

生成的部分如下所示:

simple.pb.c

和一部分simple.pb.h

我们尝试通过执行以下操作对消息进行编码:

但是这stream.bytes_written是错误的,这意味着它没有正确编码,尽管status=1.

在它的文档pb_encode()说:

[...] 但是,子消息必须被序列化两次:首先计算它们的大小,然后将它们实际写入输出。这会对回调字段造成一些限制,这些字段必须在每次调用时返回相同的数据。

但是,我们不确定如何解释这句话 - 究竟要遵循哪些步骤来实现这一点。

所以我们的问题是:

  • 使用nanopb库对包含固定大小(重复)子消息的消息进行编码的正确方法是什么?

谢谢!

0 投票
1 回答
197 浏览

c - 在 Nanopb 的“重复”数据中使用“重复”

当有多个嵌套的“重复”字段时,如何使用 NanoPB 正确编码数据?

这是我的架构:

我已经制作了一个工作版本,其中SensorData字段嵌入在DeviceData基于来自 NanoPB 源的 server.c 示例的消息中。这样我只有一个重复的字段,一切正常。但是,通过这种方式,我必须为sensorid每个“样本”重复“分隔”字段,而不是只给它一次,然后循环遍历一组SensorData消息。但是我正在努力用 NanoPB 进行编码,解码部分是在 Python 中。有人可以给我一个例子,在这种情况下如何正确编码数据?

0 投票
1 回答
5848 浏览

c - 如何使用 nanopb 和 protobuf 将 nanopb .proto 文件编译成 .h 和 .c 文件(`protoc` 编译问题)

旧标题:如何使用 nanopb 和 protobuf 将 nanopb/examples/simple/simple.proto 文件编译成 simple.h 和 simple.c

关于这个库:https ://github.com/nanopb/nanopb

我的目标是遵循本教程:https ://jpa.kapsi.fi/nanopb/docs/concepts.html将nanopb/examples/simple/simple.proto转换为 .h 和 .c 源文件。我需要简单的说明才能在 Ubuntu 上执行此操作。我已经尝试了几天,但无法让它工作。

教程说要做的命令是:

我克隆了 nanopb 存储库,cd 到nanopb/examples/simple中,然后用上面的命令simple.proto代替message.proto,我运行了以下命令:

它运行良好,生成了一个 simple.pb 文件。

然而,第二部分失败了。从nanopb/examples/simple文件夹中运行时,我得到:

运行make什么都不做(说它已经完成了):

请注意,我正在运行protoc从 Google protobuf 存储库从源代码构建的最新版本:https ://github.com/protocolbuffers/protobuf 。

我也在这里向 nanopb 寻求帮助,但无法弄清楚,并且觉得这里缺少一些基本的东西,因为我知道的不够多:https ://github.com/nanopb/nanopb/issues /417。感觉就像我在做一些应该很简单的事情,并且在我之前至少有 1448 多人已经完成了(nanopb 上的星星数量)。

0 投票
1 回答
614 浏览

nanopb - 为什么当我用 max_count 对 nanopb 中的重复字段进行编码时,bytes.written 在另一方面是零(空),它不能被编码

我正在使用arduino对按摩进行编码,我已经尝试过编码和解码所需的成功,但是对于重复,在我编码后,缓冲区的大小为0,所以我不能将我的缓冲区发送到其他arduino

这是我的代码

文件.ino

0 投票
1 回答
2678 浏览

c - 当它是 pb_callback_t 类型时如何对字符串进行编码

我正在使用 Nanopb,其中生成的 proto 文件中的字符串变量被转换为 pb_callback_t

所以,到目前为止,我正在尝试使用 nanopb 回调的测试示例;

但是在这个例子中,字符串“Hello world!” 是相当硬编码的xD,我怎样才能将字符串从main动态传递给该函数?

0 投票
1 回答
326 浏览

c - 如何使用 Nanopb 将 subMsg 添加到重复的 msg?

我只是想将一条消息添加到另一条消息中(最多 60 次)

我的 .proto 文件如下所示;

我试图制作一个回调函数来添加重复的数据,但无法使其工作。

我以为我可以像最后一行代码显示的那样调用重复编码,但我不允许。

回调本身应该将 60 条相同的消息(功能)添加到功能文件中。

有人能帮我一下吗?

0 投票
1 回答
924 浏览

c - 使用 ProtoBuf 将数据流式传输到带有标题的日志文件

我正在尝试将数据流式传输到微控制器上 SD 卡上的日志文件,该微控制器从某些传感器读取并将值存储在文件中。

为了序列化数据,我将使用 NanoPB,它是 C 的 protobuf 实现,非常节省资源。

日志文件的结构如下: 它需要写一个由 GUID 和固件版本组成的短标题。在标头之后,数据流应该是连续的,它应该记录来自传感器的字段,而不是标头值(这应该只在开始时出现一次)。

限制是我只能使用一个 .proto 文件进行序列化和反序列化,并且我想避免使用 .proto 中的“重复”字段然后使用 nanopb 的 C 实现而出现的 Pb_callback 函数。https://jpa.kapsi.fi/nanopb/docs/concepts.html

我尝试过的实现如下(字段只是示例):

}

我们的想法是拥有一个处理后看起来像这样的日志文件:

但是,如果所有字段都在同一条消息中,则每次重复都会记录 GUID 和固件。而如果我将其拆分为 2 条消息,我将无法使用一个 proto 文件一次性反序列化它们。我需要知道前两条消息的长度,对它们进行反序列化,然后从那里开始记录日志。

0 投票
1 回答
768 浏览

c - 协议缓冲区 nanopb 序列化字符串和解码错误 utf-8 字符

我目前正在尝试使用 nanopb 序列化字符串并在 python/java 中解码消息。我没有麻烦的整数,我可以序列化和反序列化。但是当涉及到字符串时,我不断收到同样的错误:'utf-8' codec can't decode byte 0xff in position 2: 'utf-8' codec can't decode byte 0xff in position 2: invalid start byte in场地:

我认为这可能是 Python 解码问题,所以我修改 with open('FileSerialized.bin', 'rb') as f:

我尝试使用 Java 中的解析器,但它给出了同样的错误。因此,我认为问题在于我在 C 中编码消息的方式。我正在执行以下操作:

在 nanopb 提供了 .proto 的转换之后:

我尝试通过执行以下操作来填充 char 数组:

尝试解码后,我在尝试读取 Value2 时发现错误。