Python 从UDP数据包获取音频文件

Python 从UDP数据包获取音频文件,python,networking,udp,hex,wireshark,Python,Networking,Udp,Hex,Wireshark,出于绝望将此贴在这里。感谢您的帮助。多谢各位 背景故事: 我正在帮我的朋友买一台他从中国买来的设备。该设备应该使用UDP向我的服务器发送音频文件。假设您需要一些Python代码自动执行此操作,下面是我验证和解码数据包的方法: import struct def decode_packet(packet): framehead, version, command, datalen = struct.unpack_from('!HBBH', packet) valid = (

出于绝望将此贴在这里。感谢您的帮助。多谢各位

背景故事:


我正在帮我的朋友买一台他从中国买来的设备。该设备应该使用UDP向我的服务器发送音频文件。

假设您需要一些Python代码自动执行此操作,下面是我验证和解码数据包的方法:

import struct

def decode_packet(packet):
    framehead, version, command, datalen = struct.unpack_from('!HBBH', packet)

    valid = (
        framehead == 0x55aa and
        version == 0x00 and
        command == 0x1e and
        len(packet) <= datalen + 11
    )
    if not valid:
        # ignore other protocols using this address/port
        print(
            '  header invalid',
            f'{framehead:04x} {version:02x} {command:02x} {datalen:04x}'
        )
        return

    if len(packet) < datalen + 11:
        print('  warning: packet was truncated')

    offset, = struct.unpack_from('!I', packet, 6)
    if datalen == 4:
        print(f'  end of data: file size={offset}')
        return

    data = packet[10:10+datalen]
    print(f'  got data: offset={offset} len={len(data)} hex(data)={data.hex()}')

    if len(packet) == datalen + 11:
        print(f'  hex(checksum)={packet[datalen + 10:].hex()}')
假设您可以使其正常工作,您可以将其放入一些代码中,以侦听正确端口上的数据包:

import socket

def server(portnum):
    with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as sock:
        sock.bind(('', portnum))

        while True:
            packet, addr = sock.recvfrom(10240)
            print(f'received {len(packet)} bytes from {addr[0]}')
            decode_packet(packet)

再说一次,没什么用。您可能希望将数据写入文件,而不是将其打印出来,但您可以拉出偏移量,并获得数据传输完成时的信号

0000cf6c看起来像一个十六进制值,它等于53100(53.1KB)。要获得整个数据,您需要所有数据包(我认为上面的数据只有一个数据包)。您还需要捕获整个数据包(
-s0
使用tcpdump-不确定wireshark)。感谢您的回复!出于某种原因,这是它发送给我的唯一数据包。我会继续玩它,看看能得到什么。在发送更多数据之前,设备可能希望确认已收到数据包。也许检查一下文件,看看有没有什么else@SamMason在上一次评论之后,我真的试过了!在每个数据包被发送到服务器后,我发送了一个确认消息,根据Wireshark的说法,每个911字节总共有50个数据包。谢谢你的回复!我会检查代码。我很快就想问你为什么使用sock.recvfrom(10240)?我目前使用的是sock.recvfrom(4096),这是我在网上看到的一个例子。我认为实际值并不重要,只要它比您预期收到的任何数据包都大。巨型数据包可以是9000字节,10KB是继此之后的下一个最好的整数。。。也就是说,任何超过1500的数据都可以(以太网的限制)请注意,您不希望传递任何太疯狂的数据,例如128MiB!将分配该大小的缓冲区(然后在接收到较少数据时调整大小),但在这里可能没有问题,因此如果我想将接收到的这些字节写入文件,我需要写入二进制文件?如何保存传入的字节并转换为音频文件?至于写入,它只是标准的
open(name,'wb')
seek(offset)
write(data)
,没有什么特别需要的。你们需要弄清楚数据的格式以便回放,希望这是有文档记录的,进行反向工程可能会很尴尬!
import socket

def server(portnum):
    with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as sock:
        sock.bind(('', portnum))

        while True:
            packet, addr = sock.recvfrom(10240)
            print(f'received {len(packet)} bytes from {addr[0]}')
            decode_packet(packet)