问题标签 [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.
c++ - nanopb oneof - 编码问题
我正在尝试使用oneof
- 对消息进行编码,但大小似乎不合适。看起来这忽略了oneof
部分 - 而不是将其编码到流中。编码函数都返回“TRUE” - 这意味着它们按照我的要求编码,这意味着我编码错误......我错过了一些非常愚蠢的东西。
protobuff(部分..)
选项文件:
c - 在 nanopb 中解码重复的子消息
我浏览了许多其他帖子,但似乎没有一个可以解决我的问题。
我nanoPB
在 C 中使用,在 json 中创建消息并将它们转换pb
为发送到我的设备。
鉴于此原始消息和选项文件
我将创建一个如下所示的 json 文件:
并使用 python 脚本并将其序列化为 protobuf(为了简洁而截断)
标准输出被重定向到一个文件,所以它被保存了。如果我将该文件提供给我的C
函数
如果在文件中填充了错误消息,则pb_decode_delimited
调用失败。bounds
.pb
parent stream too short
我不完全理解为什么流中没有足够的数据。我相信消息被正确编码,因为我可以在 python 中反序列化它。我的怀疑是需要设置一个标志或某些选项,以便我可以正确地拥有一个重复的子消息,其中包含重复的字段。
python - 如何在 python protobufs 中找到字符串的最大长度?
我有一个 (proto2) .proto 文件,其定义类似于以下内容:
如何在 python 中找到“myString”的最大长度?要获取枚举的值,我可以执行 myProto.myCoolEnum.Value() 之类的操作,但我还没有找到任何类似的方法来获取字符串的最大大小。
c - 使用 C 在 nanopb 中对字节类型内的字符串进行编码/解码
我有一个.proto
看起来像这样的文件:
我使用这个原型编码来发送改变的结构。这个结构基本上包含整数和字符串(一个以 null 结尾的 char 数组)。
发件人发送结构做这样的事情:
然后,接收者获取消息,使用 nanopb 对其进行解码,然后:
那时,如果我尝试读取整数的值,则没有问题(flow_msg->dst_addr
例如),但如果我想读取字符串值,我会得到一个空指针,因为它flow_msg->src_ap_name
是空的。
我不知道应该如何正确编码/解码字符串值......真的不知道我在这里错过了什么......任何线索?
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 文件的内容:
以下是一些数据点:
c - 编码 NanoPB 变量字符串
我有一个在运行时通过从 EEPROM 读取确定的字符串:
问题是“nuts”正在被编码,但变量值eeprom_buffer
不是。我需要一些关于为什么会发生这种情况的建议,好吗?
这是我的encode_string
功能:
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(); // 没用,十六进制转储在下面。
c++ - 如何清除 C++ 中的流以供 nanoPB 协议缓冲区使用?
我在平台IO中的ESP32项目中使用nanopb。这是一个 arduino 风格的 C++ 代码库。
我正在使用一些 protobufs 对数据进行编码以进行传输。我已经设置了 protobufs 将在根级别使用的内存,以避免每次发送消息时重新分配内存。
然后我有了我的函数,通过protobufs(使用nanoPB)将数据编码到这个流中......
好的。所以第一次发生这种编码动作时,这是我在串行监视器中获得的数据......
这很好 - 一切看起来都很好。但是我第二次打电话encodeABCounts()
,第三次,第四次,我得到了这个......
因此,当新数据进入时,它并没有清除缓冲区/流。每次添加新数据时,缓冲区/流只会变得更长。
如何在不重新分配内存的情况下将流/缓冲区重置为可以对新数据进行编码并停留在其中的状态?
谢谢!
protocol-buffers - nanopb 未应用选项
我有以下原型定义
和选项文件
我使用以下命令运行 protoc
并且它正确地选择了选项(不知道为什么它会打印两次相同的东西)
现在,当我检查生成的 时simple.pb.h
,我看到了
int32_t lucky_numbers[10];
正如文件所示,我期待着。知道我哪里出错了吗?
protocol-buffers - Nanopb:将已编码的消息添加为重复字段
我有以下形式的消息:
我想通过附加已经编码的 InnerMessage 实例来组成 OuterMessage 的实例。有没有一种合法的方法可以用 nanopbs 做到这一点?