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

出于绝望而将其发布在这里。任何帮助表示赞赏。谢谢。

背景故事:

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

jing81024 回答:从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()}')

它显然会打印出很多东西,但这对于查看设备是否实际上遵循了已记录的协议非常有帮助。似乎没有,因为+4上的data length似乎没有被应用。您可以使用以下方法进行测试:

decode_packet(bytes.fromhex('55aa001e038400000000a9b6ad98d2923...'))

假设您可以使其正常运行,可以将其放入一些代码中,以侦听正确端口上的数据包:

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)
再次

并没有做什么。您希望将数据写到文件中而不是打印出来,但是您可以拉出偏移量,并且在数据完成传输时会收到信号

本文链接:https://www.f2er.com/3154022.html

大家都在问