В настоящее время я пытаюсь импортировать сигнал многоадресной передачи UDP (сигнал ЭЭГ) в Python. Хотя я получаю сигнал, вывод состоит из массива букв, цифр и символов, которые невозможно отобразить правильно, поэтому что-то не совсем правильно.Импорт сигнала многоадресной передачи UDP в 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)
Теперь, последняя строка (печать sock.recv (51)), кажется, инструктировать Python для вывода содержимого буфера приема в виде строки ASCII. Мне сказали, что мне нужно преобразовать данные буфера в массив байтов, а затем получить элементы из массива, который мне нужен. Скажем, например, у меня есть массив из 51 элемента, и я хочу знать, что такое напряжение на канале 5, тогда я бы получил элементы 18 (старший байт) и 19 (младший байт) из массива и преобразовал их в короткое целое число (16-битное значение). Мне сказали, что я могу использовать функцию struct.unpack Python для этого: https://docs.python.org/3.0/library/struct.html.
У меня есть только базовые навыки программирования на Python, поэтому все это для меня новая территория. После прочтения документации мне кажется, что для функции struct.unpack требуются два аргумента. Первый указывает, каким образом данные были собраны в первую очередь. В моем случае это «4sl»; Я пишу четыре символа, за которыми следует длинное целое число с байтовым вектором. Второй аргумент должен указать, какие данные необходимо распаковать. Использование struct.unpack («4sl», sock.recv (51) возвращает сообщение об ошибке, которое «unpack требует строковый аргумент длиной 8». Это имеет смысл, поскольку sock.recv (51) просто дает мне живое содержимое буфер приема, который намного превышает эту длину.Я должен признать, что я немного потерял. Я был бы очень благодарен, если бы кто-нибудь мог мне помочь.
Спасибо очень! Сигнал, который я обрабатываю, отправляет пакеты, каждый из которых содержит 51 байт. Я предполагаю, что, используя следующий код дает мне распакованные пакеты: байтовой строки = sock.recv (51) сигнал = struct.unpack_from («Ъ» * 51, байтовой строки) сигнала печати Еще раз спасибо за вашу помощь! – Philo