从 UDP 数据包中获取音频文件
Getting audio file from a UDP packet
出于绝望,将此张贴在这里。任何帮助表示赞赏。谢谢。
背景故事:
我正在帮助我的朋友使用他从中国获得的设备。该设备应该使用 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()}')
它显然会打印出很多东西,但这有助于查看设备是否真的遵循记录的协议。它似乎不是,因为 data length
上的 +4
似乎没有被应用。您可以使用以下方法进行测试:
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)
同样,没有做太多。你想将数据写入文件而不是打印出来,但你可以拉出偏移量并在数据传输完成时收到信号
出于绝望,将此张贴在这里。任何帮助表示赞赏。谢谢。
背景故事:
我正在帮助我的朋友使用他从中国获得的设备。该设备应该使用 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()}')
它显然会打印出很多东西,但这有助于查看设备是否真的遵循记录的协议。它似乎不是,因为 data length
上的 +4
似乎没有被应用。您可以使用以下方法进行测试:
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)
同样,没有做太多。你想将数据写入文件而不是打印出来,但你可以拉出偏移量并在数据传输完成时收到信号