在Python中解读F1 2012 UDP数据包
我正在做一个项目,目的是把F1 2012游戏中的数据用Python处理,然后发送给Arduino,显示成一个真实的仪表盘。
F1 2012通过UDP数据包发送数据,地址是127.0.0.1,端口是20777。
我写了一个简单的Python程序来读取这些进来的数据包:
import socket
UDP_IP = "127.0.0.1"
UDP_PORT = 20777
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind((UDP_IP, UDP_PORT))
while True:
data, addr = sock.recvfrom(1024)
print ("Message:" data)
这个程序会输出一些信息,比如:
b'\xce\xb3T@\x00\x00\x00\x001K\xa7E\xa0\xf1\xf0\xbc\xa1\xc6\x13\xc4OY\x0b\xc3\xd5\xbf.D\xca\xe2\xc2;\xb0\x9109\xf0\x19\xbd\xbb\xdd8\xbb:q\x19M\xbf\x81t.933\x19\xbf\x1e,\x19\xbf\xc2\x82\x9d\xbc\x9c\x0fM?\xa2#H\xbc\xd6\x16x\xbe\x92hr\xba:\xa8\x88=X\xd7&?q$\xc7>\x82w#><\xe9\x1d>w\xc9\xb8\xa7Bh\x010\x00\x00\x00\x00kr\xb7\xaf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80?\x00\x00\x80?\x96z\x98\xb9!f\x849\x00\x00\x00\x00\x8d\x8b5C'
我知道这个输出内容比较长,但里面包含了关于赛车的38个参数,这些参数每秒更新60次。具体内容可以在这个网站上找到,那里有一个正在做类似项目的人提供的信息。
我在StackOverflow上找过类似的问题,看到有些人也在处理类似的UDP输出,他们告诉我需要用合适的格式来解包数据。
根据这个网站的内容,数据包里的数据都是C语言中的浮点数,所以我修改了我原来的Python代码。
import socket
import struct
UDP_IP = "127.0.0.1"
UDP_PORT = 20777
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind((UDP_IP, UDP_PORT))
while True:
data, addr = sock.recvfrom(1024)
output = struct.unpack('f', data)
print ("Message:", output)
我给解包函数指定了格式'f',这是根据这个页面的信息来设置的。
现在程序出现了这个错误:
struct.error: unpack requires a bytes object of length 4
我觉得现在遇到了瓶颈,不知道该怎么继续下去了。
请帮帮我。
1 个回答
0
根据错误信息:struct.error: unpack requires a bytes object of length 4
,你需要一次传递4个字节。
把你的代码改成一次发送4个字节。
while True:
data, addr = sock.recvfrom(1024)
# data is 1024 length bytearray, break into 4 bytes and get the output
output = struct.unpack('f', data[0:4]) # 4 bytes at a time
print ("Message:", output)