问题标签 [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 回答
135 浏览

c++ - nanopb oneof - 编码问题

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

protobuff(部分..)

选项文件:

0 投票
1 回答
58 浏览

c - 在 nanopb 中解码重复的子消息

我浏览了许多其他帖子,但似乎没有一个可以解决我的问题。

nanoPB在 C 中使用,在 json 中创建消息并将它们转换pb为发送到我的设备。

鉴于此原始消息和选项文件

我将创建一个如下所示的 json 文件:

并使用 python 脚本并将其序列化为 protobuf(为了简洁而截断)

标准输出被重定向到一个文件,所以它被保存了。如果我将该文件提供给我的C函数

如果在文件中填充了错误消息,则pb_decode_delimited调用失败。bounds.pbparent stream too short

我不完全理解为什么流中没有足够的数据。我相信消息被正确编码,因为我可以在 python 中反序列化它。我的怀疑是需要设置一个标志或某些选项,以便我可以正确地拥有一个重复的子消息,其中包含重复的字段。

0 投票
0 回答
29 浏览

python - 如何在 python protobufs 中找到字符串的最大长度?

我有一个 (proto2) .proto 文件,其定义类似于以下内容:

如何在 python 中找到“myString”的最大长度?要获取枚举的值,我可以执行 myProto.myCoolEnum.Value() 之类的操作,但我还没有找到任何类似的方法来获取字符串的最大大小。

0 投票
1 回答
67 浏览

c - 使用 C 在 nanopb 中对字节类型内的字符串进行编码/解码

我有一个.proto看起来像这样的文件:

我使用这个原型编码来发送改变的结构。这个结构基本上包含整数和字符串(一个以 null 结尾的 char 数组)。

发件人发送结构做这样的事情:

然后,接收者获取消息,使用 nanopb 对其进行解码,然后:

那时,如果我尝试读取整数的值,则没有问题(flow_msg->dst_addr例如),但如果我想读取字符串值,我会得到一个空指针,因为它flow_msg->src_ap_name是空的。

我不知道应该如何正确编码/解码字符串值......真的不知道我在这里错过了什么......任何线索?

0 投票
1 回答
87 浏览

c - 从 nanopb 读取 Proto Buffer 消息时出现 DecodeError

我为 IoT 设备实现了一个小型 HttpClient,并希望使用 Proto Buffer 作为一种通信格式。由于平台的限制,我使用的是 nanopb。这是C中的相关代码:

我创建了一个暴露端点的小型烧瓶服务器。当我尝试解码消息时,我收到以下错误:google.protobuf.message.DecodeError: Error parsing message with type 'pb.MEvent'

它的代码:

我尝试使用 io.ByteStream 然后读取它,我还尝试使用 ASCII 和 UTF-8 对字节进行编码,但这些方法都不起作用。

您能帮我找出问题所在吗?错误消息没有那么有用。

更新

这是 proto 文件的内容:

以下是一些数据点:

0 投票
1 回答
33 浏览

c - 编码 NanoPB 变量字符串

我有一个在运行时通过从 EEPROM 读取确定的字符串:

问题是“nuts”正在被编码,但变量值eeprom_buffer不是。我需要一些关于为什么会发生这种情况的建议,好吗?

这是我的encode_string功能:

0 投票
1 回答
272 浏览

protocol-buffers - 使用 HTTPClient 的 C 客户端 gRPC 的 HTTP/2 客户端前言字符串丢失或损坏

我收到“HTTP/2 客户端前言字符串丢失或损坏”。

我的想法是它与标题设置不正确有关。很可能是 WifiClient/WifiSecureClient 的实现。我已经考虑这个问题好几个星期了,我被困住了。有什么建议吗?

[更新:下面的答案]

客户端是使用 nanopb 协议缓冲区编译器生成的:

Arduino客户端:

服务器是使用标准 java 协议缓冲区编译器生成的。我唯一改变的是添加一个 TempEvent(如下)。

示例 java 客户端可以正常工作。我的问题在于在 ESP8266-01 wifi 模块上使用 nanopb 的简单客户端,该模块使用 gRPC 发送数据。

客户端能够访问服务器:

为了调试这个,我想先看看我是否可以使用 grpcurl,但我得到了这个:

我开始研究在我的实现代码中使用的 WifiClient.h 的实现,但是有没有人有任何想法来简单地测试它而不深入研究所有内容?我在想这应该超级简单......但结果证明生成一个简单的客户端比我想象的要复杂得多。我觉得我在这里错过了一些东西。

来自这里的其他论坛:“客户端和服务器不同意。通常这是因为一个是纯文本,另一个使用 TLS。但也可能是由于某些环境中的 HTTP/1 与 HTTP/2。”

在查看了 Go Lang 实现之后,我只是尝试使用 WiFiClientSecure client.setInsecure(); // 没用,十六进制转储在下面。

0 投票
1 回答
33 浏览

c++ - 如何清除 C++ 中的流以供 nanoPB 协议缓冲区使用?

我在平台IO中的ESP32项目中使用nanopb。这是一个 arduino 风格的 C++ 代码库。

我正在使用一些 protobufs 对数据进行编码以进行传输。我已经设置了 protobufs 将在根级别使用的内存,以避免每次发送消息时重新分配内存。

然后我有了我的函数,通过protobufs(使用nanoPB)将数据编码到这个流中......

好的。所以第一次发生这种编码动作时,这是我在串行监视器中获得的数据......

这很好 - 一切看起来都很好。但是我第二次打电话encodeABCounts(),第三次,第四次,我得到了这个......

因此,当新数据进入时,它并没有清除缓冲区/流。每次添加新数据时,缓冲区/流只会变得更长。

如何在不重新分配内存的情况下将流/缓冲区重置为可以对新数据进行编码并停留在其中的状态?

谢谢!

0 投票
1 回答
16 浏览

protocol-buffers - nanopb 未应用选项

我有以下原型定义

和选项文件

我使用以下命令运行 protoc

并且它正确地选择了选项(不知道为什么它会打印两次相同的东西)

现在,当我检查生成的 时simple.pb.h,我看到了

int32_t lucky_numbers[10];正如文件所示,我期待着。知道我哪里出错了吗?

0 投票
1 回答
19 浏览

protocol-buffers - Nanopb:将已编码的消息添加为重复字段

我有以下形式的消息:

我想通过附加已经编码的 InnerMessage 实例来组成 OuterMessage 的实例。有没有一种合法的方法可以用 nanopbs 做到这一点?