我為 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);
[...]
我創建了一個暴露端點的小型燒瓶服務器。當我嘗試解碼訊息時,出現以下錯誤: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
uj5u.com熱心網友回復:
資料: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 | 構建/raw_decode/raw_decode 在 0:欄位標記 1,線型別 5(32BIT),fixed32 值(4 個位元組):0x3e27d798 在 5:欄位標記 2,線型別 5(32BIT),fixed32 值(4 個位元組):0xbdadf7bf 在 10:欄位標記 3,線型別 5(32BIT),fixed32 值(4 個位元組):0x411f7046 在 15:欄位標記 4,線型別 5(32BIT),fixed32 值(4 個位元組):0x3b7033b5 在 20:欄位標記 5,導線型別 5 (32BIT) 錯誤:無法決議fixed32:io錯誤 最新讀取的位元組數(21 到 21):
看來你的訊息被截短了。您在此行保留的緩沖區空間量不夠大:
uint8_t m_buffer[21];
如果您檢查它的回傳值,pb_encode()它可能也在回傳false并stream.errmsg指示緩沖區已滿。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/372061.html
