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