class Server: def __init__(self): self.message = bytes(0) self.transmitter = Transmitter(SERIAL) self.location = 'imgs/foto_nova.png' def set_location(self): # name = input('SPECIFY NAME TO SAVE FILE WITHOUT EXTENSION: ') name = 'foto_new2' while len(name) < 1: print('INVALID FILE NAME') name = input('SPECIFY NAME TO SAVE FILE WITHOUT EXTENSION: ') self.location = 'imgs/{}.png'.format(name) def send_confirmation(self): packet = Datagram() packet.set_head( message_type=3, message_id=1, num_payloads=0, payload_index=0, payload_size=0, error_type=0, restart_index=0 ) packet.set_EOP() self.transmitter.send(packet.get_datagram()) def confirm_handshake(self): handshake_received = self.transmitter.receive(expected_type='handshake') print(handshake_received) while not handshake_received: print('HANDSHAKE NOT SENT BY CLIENT - LISTENING ON SERIAL PORT {}'.format(SERIAL)) handshake_received = self.transmitter.receive(expected_type='handshake') print('HANDSHAKE RECEIVED') self.send_confirmation() print('HANDSHAKE CONFIRMED') def send_error(self): packet = Datagram() packet.set_head( message_type=0, message_id=1, num_payloads=0, payload_index=0, payload_size=0, error_type=0, restart_index=0 ) packet.set_EOP() self.transmitter.send(packet.get_datagram()) def receive_packet(self): response = self.transmitter.receive(expected_type='data') if not response: return 0 return response # response => tuple(payload, payload_index, num_packets) def receive_message(self): buffer = bytes() last_payload = 0 while True: response = self.receive_packet() if not response: print('ENCOUNTERED ERROR RECEIVING DATA') self.send_error() break (payload, payload_index, num_packets) = response if payload_index != last_payload + 1: print('PAYLOAD OUT OF ORDER') self.send_error() break last_payload = payload_index buffer += payload self.send_confirmation() print('\n\n\n') print(buffer) print(payload_index, num_packets) print('\n\n\n') if payload_index == num_packets: break with open(self.location, 'wb') as f: f.write(buffer) def disable(self): self.transmitter.disable()
class Client: def __init__(self): self.message = bytes(0) self.transmitter = Transmitter(SERIAL) def set_message(self): # file = input('What file do you want to send? ') file = 'imgs/fofinha.png' while not path.exists(file): print("INVALID PATH") file = input('WHAT FILE DO YOU WANT TO SEND? ') with open(file, 'rb') as f: byte_file = f.read() self.message = byte_file def send_packet(self, payload, num_payloads, payload_index): packet = Datagram() packet.set_head(message_type=1, message_id=1, num_payloads=num_payloads, payload_index=payload_index, payload_size=len(payload), error_type=0, restart_index=0) packet.set_payload(payload=payload) packet.set_EOP(0) self.transmitter.send(packet.get_datagram()) def receive_confirmation(self): return self.transmitter.receive(expected_type='confirmation') def send_handshake(self): packet = Datagram() packet.set_head(message_type=2, message_id=1, num_payloads=0, payload_index=0, payload_size=0, error_type=0, restart_index=0) packet.set_EOP() self.transmitter.send(packet.get_datagram()) def assert_server_status(self): self.send_handshake() print('ASSERTING SERVER CONNECTION') confirmed = self.receive_confirmation() while not confirmed: print('SERVER DISCONNECTED') retry = input('RETRY CONNECTION? (y/n) ') if retry == 'y': self.send_handshake() print('ASSERTING SERVER CONNECTION') confirmed = self.receive_confirmation() else: self.disable() sys.exit() print('SERVER AWAKE') def send_message(self): num_bytes = len(self.message) num_packets = num_bytes // 114 + 1 if num_bytes % 114 != 0 else num_bytes // 114 print('BEGINNING TRANSMISSION') print('BYTES TO SEND: {}'.format(num_bytes)) print('NUMBER OF PAYLOADS: {}'.format(num_packets)) for i in range(1, num_packets + 1): payload = self.message[(i - 1) * 114:i * 114] self.send_packet(payload=payload, payload_index=i, num_payloads=num_packets) if not self.receive_confirmation(): break def disable(self): self.transmitter.disable()