簡體   English   中英

從 nanopb 讀取 Proto Buffer 消息時出現 DecodeError

[英]DecodeError when reading Proto Buffer message from nanopb

我為 IoT 設備實現了一個小型 HttpClient,並希望使用 Proto Buffer 作為一種通信格式。 由於平台的限制,我使用的是 nanopb。 這是C中的相關代碼:

#include <pb_encode.h>
#include "device_data.pb.h"
#include <ESP8266HTTPClient.h>

[...]
pb_MEvent m_event = pb_MEvent_init_zero;
uint8_t m_buffer[21];
pb_ostream_t stream = pb_ostream_from_buffer(m_buffer, 21);
pb_encode(&stream, pb_MEvent_fields, &m_event);

int httpCode = httpClient.POST(m_buffer, stream.bytes_written);
[...]

我創建了一個小型 flask 服務器,它公開了一個端點。 當我嘗試解碼消息時,出現以下錯誤: google.protobuf.message.DecodeError: Error parsing message with type 'pb.MEvent'

它的代碼:

from flask import Flask, request

from device_data_pb2 import MEvent

app = Flask(__name__)

@app.route("/", methods = ['POST', "GET"])
def hello_world():
    m_event = MEvent()

    m_event.ParseFromString(request.data)
    print(m_event)

if __name__ == '__main__':
    app.run(host='0.0.0.0', port= 5000)

我嘗試使用 io.ByteStream 然后讀取它,我還嘗試使用 ASCII 和 UTF-8 對字節進行編碼,但這些方法都不起作用。

您能幫我找出問題所在嗎? 錯誤消息沒有那么有用。

更新

這是 proto 文件的內容:

syntax = "proto2";
package pb;

message MEvent {
    required float accelX = 1;
    required float accelY = 2;
    required float accelZ = 3;
    required float gyroX = 4;
    required float gyroY = 5;
    required float gyroZ = 6;
    required int64 msec = 7;
}

以下是一些數據點:

DATA:
0.16 -0.08 9.96 0.00 -0.00 0.02 0
HEX:
0d:98:d7:27:3e:15:bf:f7:ad:bd:1d:46:70:1f:41:25:b5:33:70:3b:2d

DATA:
0.16 -0.09 9.96 0.00 -0.00 0.02 0
HEX:
0d:cd:7d:20:3e:15:56:ab:bc:bd:1d:5f:6b:1f:41:25:79:22:a0:3b:2d


DATA:
0.15 -0.10 9.96 0.00 -0.00 0.02 0
HEX:
0d:89:0a:1e:3e:15:21:05:c4:bd:1d:de:52:1f:41:25:b5:33:70:3b:2d

數據:0.16 -0.08 9.96 0.00 -0.00 0.02 0 十六進制:0d:98:d7:27:3e:15:bf:f7:ad:bd:1d:46:70:1f:41:25:b5:33:70 :3b:2d

我正在使用nanopb/tests/raw_decode來分析這個。 Marc Gravell 的解碼實用程序曾經非常適合此功能,但由於某種原因,它不再適用於損壞的數據。

user@host:~/nanopb/tests$ echo 0d:98:d7:27:3e:15:bf:f7:ad:bd:1d:46:70:1f:41:25:b5:33:70:3b:2d \
| tr -d ':' | xxd -r -p | build/raw_decode/raw_decode

At 0: field tag 1, wire type 5 (32BIT), fixed32 value (4 bytes): 0x3e27d798
At 5: field tag 2, wire type 5 (32BIT), fixed32 value (4 bytes): 0xbdadf7bf
At 10: field tag 3, wire type 5 (32BIT), fixed32 value (4 bytes): 0x411f7046
At 15: field tag 4, wire type 5 (32BIT), fixed32 value (4 bytes): 0x3b7033b5
At 20: field tag 5, wire type 5 (32BIT)
ERROR: Failed to parse fixed32: io error
LATEST BYTES READ (21 to 21): 

看來您的消息被縮短了。 您在此行保留的緩沖區空間量不夠大:

uint8_t m_buffer[21];

如果您檢查pb_encode()的返回值,它可能也返回false並且stream.errmsg表示緩沖區已滿。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM