Получение аудиофайла из пакета UDP - PullRequest
0 голосов
/ 06 ноября 2019

Размещать это здесь из отчаяния. Любая помощь приветствуется. Спасибо.

Предыстория:

Я помогаю своему другу с устройством, которое он получил из Китая. Устройство предположительно отправляет аудиофайл на мой сервер по протоколу UDP.

Размер файла, отправляемого с устройства на сервер: 0000cf6c (я не знаю, как это декодировать)

Инструкции, полученные отпроизводитель:

Hex is allowed to upload files.
explain :
1)  Recording file package transfer data format: package offset (unsigned short) + package data
If the platform receives the frame with data length of 4 and packet offset > = firmware size, packet transmission ends.

MCU send :

field            lenth(byte)                            explain 
Frame head           2                                    0x55aa
version              1                                     0x00
Command word         1                                     0x1E
Data length          2                                   0x0004+m
data          offset_addr(4byte)+pack(mbyte)         offset_addr: Package offset address, pack:Package content
校验和               1                                The result of summing 
                                                       bytes from the frame 
                                                       header is the result 
                                                       of summing 256 bytes.

example :
To record a file with a file size of 530byte, (the last packet of data can be unresponsive)
(1) The first packet has a packet offset of 0x00000000 and a packet length of 
     256. 0x55aa 00 1e 0104 00000000 xx…xx XX
(2) Second packet data, packet offset is 0x00000100, packet length is 256
0x55aa 00 1e 0104 00000100 xx…xx XX
(3)The third packet data, with a packet offset of 0x00000200 and a packet length of 18
0x55aa 00 1e 0016 00000200 xx…xx XX
(4) Last packet, packet offset is 0x00000212, packet length is 0
0x55aa 00 1e 0004 00000212 xx...xx XX

Я запустил wireshark, и устройство фактически отправляет пакет. Я просто не знаю, как получить доступ к этому пакету или что я должен с ним делать. Размер пакета составляет 911 байт в соответствии с wireshark, а размер файла 0000cf6c в зависимости от устройства.

Данные пакета (необработанные):

55aa001e038400000000a9b6ad98d292325329d3c93224210300d677ee7ddffbfff7e6f73eef58f176a8512bb6766fa35d021449195ab679e905f34e8052226a201c6a17c0a2158264ef00004000000001004400a4240200ad92eff7de7bfdfff9ebc673379582af59481a441e88093724703b505552e15c94481ce3262da807c1021889740216fb236d9364ac24c6b6214629210200b673eeb7defbffefefe3c6e8408a0e875099024c280159a6d001230aad0051f5a2abece727ad697e7c9ea2956a01d2f6996c19ab2294a6e6922446420200be35ef7bdf77fff76cf935daa8de22de01bb18b884ac200dfe80cbd0ff8cb90dab8d02401d74448050072438100998ef19cd64b2299208cb6a2624330200a616de33dffbfff779f5ef6b002b715aa3c018ff2ae99ba8038823debd87bb012e4f603ff72e280d8e22b70d311d92f789d94ae34252c8d292c649120100b5d1ffb7de73bff745f38ee09a1ba212dcda802c2c04d622006a7881767043c5438e143917b1664b503ac024b521c2fe49b249b5c494cc6444a6498c0200b532ceb5defbbdf7cdf516ee02284886db34b1400e42e8b80028baf3c7669d66e66b2fbaa01505220080054d805369de2b954969928992e4984952c80200a534eeb9defbfff7cbf116003d15721613a2008a20aa20c85b5cf345f673790e476aa21cb4b46590058e0c514d0325f7cd64c9cc192294cca6c492210200bd16eefbdef7fff7bff7c50794dc05d41d18a0adad116e2840a822f0a9c138b9f658c6e8223835dcd2024ec02e6664f733cb923189986566a244322902009d14bff5de7bffeefec7ac31d483a6ab5b481a450688c2149627220fd53716bd336c9e3ab3266249c17d553f6480a8f799c949a92253994b332648240100a5f3efb3be7bbff7fee589674c0162bc8bf62470df1b2113a724624b0920f77e2d47133319832c8c5815d837444ba4fd86cdcc6c8889226646499b120100bef3de79dff7fdf768e95ef0a2d909f1534644efaf8b6d0022282b486667b2d55a9da580e336648bec9b1022f11ba6dba6a4696b4449119b929449490200bd35dffbde7bfdf7ebe18473447d29a2601fd12c45e2937290ad23622250321e7f2a89fb96be28513aa8004004dbc9de43ab335646494ca69059929002009635ee37def7fff73cf7ad31ccd3f9579198b8756d5c343816ae6ad1880f51392c9d0d97960e650c0f23026c468f63eda68d25d2a2649cb124a624490200ae32cef79efbffffa4f3e6e3a79d7ec54c

1 Ответ

1 голос
/ 06 ноября 2019

при условии, что вы хотите, чтобы какой-то код 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)

сноване так много. Вы хотите записать данные в файл, а не распечатать его, но вы можете вывести смещение и получить сигнал о завершении передачи данных

...