将 UDP 多播信号导入 Python

Importing UDP Multicast signal into Python

我目前正在尝试将 UDP 多播信号(EEG 信号)导入 Python。虽然我确实收到了信号,但输出由字母、数字和符号组成的数组组成,无法正常显示,所以有些地方不太对。

这是我目前的代码:

import socket
import struct

MCAST_GRP = '234.5.6.7'
MCAST_PORT = 58432

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind(('', MCAST_PORT))
mreq = struct.pack("4sl", socket.inet_aton(MCAST_GRP), socket.INADDR_ANY)

sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)

while True:
print sock.recv(51)

现在,最后一行 (print sock.recv(51)) 似乎指示 Python 将接收缓冲区的内容输出为 ASCII 字符串。有人告诉我必须将缓冲区数据转换为字节数组,然后从数组中获取我需要的元素。 例如,我有一个包含 51 个元素的数组,我想知道通道 5 上的电压是多少,然后我将从数组中获取元素 18(高字节)和 19(低字节)并将它们转换为短整数( 16 位值)。 有人告诉我可以为此使用 Python 的 struct.unpack 函数:https://docs.python.org/3.0/library/struct.html.

我自己只有基本的 Python 编程技能,所以所有这些对我来说都是新领域。阅读文档后,在我看来 struct.unpack 函数似乎需要两个参数。第一个指定首先打包数据的方式。就我而言,这是“4sl”;我正在将四个字符后跟一个长整数写入字节向量。第二个参数必须说明必须解压缩哪些数据。但是,使用 struct.unpack("4sl", sock.recv(51) returns "unpack requires a string argument of length 8" 的错误消息。这是有道理的,因为 sock.recv(51) 只是给出接收缓冲区的实时内容远远超过该长度。我必须承认我有点不知所措。如果有人能帮助我,我将非常感激。

因为你有 python 2.7 recv 将 return 一个字节数组

每个字符是一个字节

要将它们更改为 51 个整数,您只需映射到 int

bytestring = sock.recv(51)
[int(ch) for ch in bytestring]

您可以使用 struct

更巧妙地解压缩字节
struct.unpack_from("bbb",bytestring) 

将解压 3 个字节

struct.unpack_from("Hh",bytstring)

将从字节串中解压一个无符号的 short,然后解压一个有符号的 short 等等