コード例 #1
0
ファイル: server.py プロジェクト: jzsiggy/py_uart_transfer
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()
コード例 #2
0
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()