73 lines
2.2 KiB
Python
73 lines
2.2 KiB
Python
#!/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}")
|