Ich versuche, eine Nachricht zwischen einem Framework in CPP und einem anderen in Python zu senden. Ich folgte das gleiche Verfahren gezeigt auf: Serialize C++ object to send via sockets to Python - best approach?
Mein Server-Code in Python ist:
import socket
from DiceData_pb2 import DiceData
UDP_PORT=1555
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind(("", UDP_PORT))
dicedata = DiceData()
while True:
data, addr = sock.recvfrom(1024)
print data
dicedata.ParseFromString(data)
print ("gyrox = {0}".format(dicedata.gyrox))
print("gyroy = {0}".format(dicedata.gyrox))
print("gyroz = {0}".format(dicedata.gyroz))
print("accelx = {0}".format(dicedata.accelx))
print("accely = {0}".format(dicedata.accely))
print("accelz = {0}".format(dicedata.accelz))
print("roll = {0}".format(dicedata.roll))
print("pitch = {0}".format(dicedata.pitch))
print("yaw = {0}".format(dicedata.yaw))
print("side = {0}".format(dicedata.side))
print("certainty = {0}".format(dicedata.certainty))
print("time = {0}".format(dicedata.time))
Die .proto Datei ist folgende:
package prototest;
message DiceData {
required float gyrox = 1;
required float gyroy = 2;
required float gyroz = 3;
required float accelx = 4;
required float accely = 5;
required float accelz = 6;
required float roll = 7;
required float pitch = 8;
required float yaw = 9;
required int32 side = 10;
required float certainty = 11;
required string time = 12;
}
Ich weiß, dass die Kommunikation funktioniert, weil der Server die erste Nachricht erhält und als Müll ausgibt. Doch nachdem er die ParseFromString Linie erreicht, wird der folgende Fehler tritt auf:
Traceback (most recent call last):
File "server.py", line 13, in <module>
dicedata.ParseFromString(data)
File "/usr/local/lib/python2.7/dist-packages/google/protobuf/message.py", line 185, in ParseFromString
self.MergeFromString(serialized)
File "/usr/local/lib/python2.7/dist-packages/google/protobuf/internal/python_message.py", line 1095, in MergeFromString
raise message_mod.DecodeError(e)
google.protobuf.message.DecodeError: unpack requires a string argument of length 4
niemanden weiß, wie kann ich dieses Problem lösen? Ich weiß, dass die Zeichenfolge nicht leer ist, weil auf der vorherigen Zeile Müll gedruckt wird, aber ich kann nicht in der Lage sein, die Zeichenfolge zurück in die Datenstruktur zu konvertieren.