#!/usr/bin/env python import asyncio from time import sleep import framing from header import Onbeat_Header PACKET_LEN=255*4 + 32 DATA_LEN=223*4 HEADER_LEN=32 async def tcp_client(file_2_send: str, callsign: str, rs_coding: bool = True): port = 50001 reader, writer = await asyncio.open_connection( '127.0.0.1', port) with open(file_2_send, "rb") as file_to_send: seq = 0 sent: list[list[int]] = [] while message := file_to_send.read(DATA_LEN if rs_coding == True else (PACKET_LEN - HEADER_LEN)): sent.append([i for i in message]) frame = bytes(framing.encode_packet([i for i in message], callsign, seq, rs_coding)) writer.write(frame) seq += 1 sleep(0.1) else: frame = bytes(framing.encode_packet([], callsign, seq, rs_coding)) for _ in range(0,16): writer.write(frame) sleep(0.1) sent.append([]) output: list[tuple[Onbeat_Header, list[int]]] = [] packet_loss = 0 while message := await reader.read(PACKET_LEN): try: received = framing.decode_packet([i for i in message]) output.append(received) if received[0].pkt_len == 0: break except Exception as e: packet_loss += 1 print(e) return sent, output rs_coding = False filename = "loremipsum" sent, output = asyncio.run(tcp_client(filename, "HA5PLS", rs_coding)) output.sort(key=lambda packet: packet[0].pkt_sequence_id) output.pop() def hamming_dist(msg:int, got:int): return bin(msg ^ got).count('1') total_errors = sum([sum([hamming_dist(msg, got) for msg, got in zip(sent[pkt[0].pkt_sequence_id], pkt[1])]) for pkt in output]) rcv_len = sum([pkt[0].pkt_len for pkt in output]) * 8 ber = total_errors/rcv_len print(f"Total errors: {total_errors}, BER: {ber}") # file : bytes = b'' # filesize = 0 # for pkt in output: # payload = bytes(pkt[1]) # file += payload # filesize += pkt[0].pkt_len # print(file.decode(errors="ignore")) # print(f"Lost {packet_loss} packets during the transfer, filesize: {filesize}")