Пример #1
0
class enlace(object):
    """ This class implements methods to the interface between Enlace and Application
    """
    def __init__(self, name):
        """ Initializes the enlace class
        """
        self.fisica = fisica(name)
        self.rx = RX(self.fisica)
        self.tx = TX(self.fisica)
        self.connected = False
        self.payload = b'\x00'
        self.package = None
        self.dataSize = 0
        self.headSize = 16
        self.clientSynchComplete = False
        self.serverSynchComplete = False
        self.file = []
        self.packageExpected = 1

        self.mensagemTipo1 = {'enviada': False, 'recebida': False}
        self.mensagemTipo2 = {'enviada': False, 'recebida': False}
        self.mensagemTipo3 = {'enviada': False, 'recebida': False}
        self.mensagemTipo4 = {'enviada': False, 'recebida': False}
        self.mensagemTipo5 = {'enviada': False, 'recebida': False}
        self.mensagemTipo6 = {'enviada': False, 'recebida': False}
        self.mensagemTipo7 = {'enviada': False, 'recebida': False}
        self.mensagemTipo8 = {'enviada': False, 'recebida': False}
        self.mensagemTipo9 = {'enviada': False, 'recebida': False}

    def enable(self):
        """ Enable reception and transmission
        """
        self.fisica.open()
        self.rx.threadStart()
        self.tx.threadStart()

    def disable(self):
        """ Disable reception and transmission
        """
        self.rx.threadKill()
        self.tx.threadKill()
        time.sleep(1)
        self.fisica.close()

    ################################
    # Application  interface       #
    ################################
    def sendData(self, data):
        """ Send data over the enlace interface
        """
        self.tx.sendBuffer(data)

    def getData(self, last_message=0):
        """ Get n data over the enlace interface
        Return the byte array and the size of the buffer
        """
        # print('entrou na leitura e tentara ler ' + str(size) )

        data = self.rx.getNData()
        if data == 0 or data is None:
            data = self.tx.createPACKAGE(0)
            messageType = self.checkMessageType(data, last_message)
        else:
            messageType = self.checkMessageType(
                data)  #Verifica o tipo da mensagem no buffer
        payloadSize = 1
        if messageType == 4:
            try:
                recievePack = data
                CRC16, packageNumber, packageTotal, erro8, packageExpected, dataSize, data = self.rx.unpackage(
                    recievePack)
                self.checkAcknoledgement(CRC16, data, dataSize, packageNumber,
                                         packageTotal, packageExpected)
                return data, len(data), dataSize
            except:
                pass

        return data, len(data), payloadSize

    def clientSynch(self):
        # Cria pacote vazio com mensagem tipo 1
        pack1 = self.tx.createPACKAGE(1)
        while self.mensagemTipo2['recebida'] == False:

            # Envia mensagem tipo 1
            self.sendData(pack1)
            print("Mensagem tipo 1: Enviada")
            time.sleep(0.1)

            self.getData(1)  # Le o Buffer de recebimento
            timeout = self.rx.timeout
            if timeout >= 5:
                print("[ERRO] - Não recebimento da mensagem tipo 2")
                return
        #Cria pacote vazio com mensagem tipo 3
        pack3 = self.tx.createPACKAGE(3)
        # Envia mensagem tipo 3
        self.sendData(pack3)
        print("Mensagem tipo 3: Enviada")
        self.mensagemTipo3['enviada'] == True
        self.clientSynchComplete = True

    def serverSynch(self):
        while self.mensagemTipo1['recebida'] == False:
            time.sleep(0.1)
            self.getData()

        # Cria pacote vazio com mensagem tipo 2
        pack2 = self.tx.createPACKAGE(2)
        self.sendData(pack2)
        print("Mensagem tipo 2: Enviada")  # Envia mensagem tipo 2

        time.sleep(0.1)
        while self.mensagemTipo3['recebida'] == False:
            self.getData(2)
            timeout = self.rx.timeout
            if timeout >= 5:
                print("[ERRO] - Não recebimento da mensagem tipo 3")
                return
        self.serverSynchComplete = True

    def splitPack(self, payload, payloadLimit=128):
        subPacks = [
            payload[i:i + payloadLimit]
            for i in range(0, len(payload), payloadLimit)
        ]
        return subPacks

    def clientSendPackages(self, packages):
        self.packageExpected = 1
        nPackages = len(packages)
        for i in range(nPackages):
            self.mensagemTipo5['recebida'] = False
            self.mensagemTipo6['recebida'] = False
            atualPack = i + 1
            subPack = packages[i]
            pack = self.tx.createPACKAGE(4, subPack, atualPack, nPackages)
            #self.rx.printer(pack)
            self.sendData(pack)
            print("Pacote {}/{} enviados".format(i + 1, nPackages))
            while self.mensagemTipo5['recebida'] == False:
                time.sleep(0.2)
                self.getData(4)
                timeout = self.rx.timeout
                if timeout >= 5:
                    print("[ERRO] - Não recebimento da mensagem tipo 5 ou 6")
                    return
                if self.mensagemTipo8["recebida"] == True:
                    self.sendData(pack)
                    print("Pacote enviado novamente")

        self.sendEndingMassage()

    def checkAcknoledgement(self, CRC16, data, payloadSize, packageNumber,
                            packageTotal, packageExpected):
        print("Len data: {}  PayloadSize: {}".format(len(data), payloadSize))
        if len(data) == payloadSize:
            crc_isRight = self.rx.checkCRC16(data, CRC16)
            print("CRC-16 HEADER: {}  CRC-16 CHECK: {}".format(
                CRC16, self.fisica.calculaCRC16(data)))
            if packageNumber == self.packageExpected:
                if ((packageNumber < packageTotal)
                        or (packageNumber == packageTotal)):
                    if crc_isRight == True:
                        self.packageExpected += 1
                        mensagemTipo5 = self.tx.createPACKAGE(5)
                        self.sendData(mensagemTipo5)
                        self.mensagemTipo5['enviada'] = True
                        print("Mensagem tipo 5 enviada")
                        self.file.append(data)
                    else:
                        mensagemTipo9 = self.tx.createPACKAGE(
                            9, error8=1, packageExpected=packageExpected)
                        self.sendData(mensagemTipo9)
                        self.mensagemTipo9['enviada'] = True
                        print("Mensagem tipo 9 enviada")
                else:
                    mensagemTipo8 = self.tx.createPACKAGE(
                        8, error8=1, packageExpected=packageExpected)
                    self.sendData(mensagemTipo8)
                    self.mensagemTipo8['enviada'] = True
                    print("Mensagem tipo 8 enviada")
            else:
                mensagemTipo8 = self.tx.createPACKAGE(
                    8, error8=1, packageExpected=packageExpected)
                self.sendData(mensagemTipo8)
                self.mensagemTipo8['enviada'] = True
                print("Mensagem tipo 8 enviada")

        else:
            mensagemTipo6 = self.tx.createPACKAGE(6)
            self.sendData(mensagemTipo6)
            self.mensagemTipo6['enviada'] = True
            print("Mensagem tipo 6 enviada")

    def checkMessageType(self, message, last_message=0):
        messageType = 0
        try:
            messageType = message[9]
        except:
            print("DEU RUIM AQUI")
        #print(messageType)

        if messageType == 0 and last_message != 0:
            if last_message == 4:
                print("[ERRO] - Não recebimento da mensagem tipo 5 ou 6")
            else:
                print("[ERRO] - Não recebimento da mensagem tipo {}".format(
                    last_message + 1))

        if messageType == 1:
            print("Mensagem tipo 1: Recebida")
            self.mensagemTipo1['recebida'] = True

        elif messageType == 2:
            print("Mensagem tipo 2: Recebida")
            self.mensagemTipo2['recebida'] = True

        elif messageType == 3:
            print("Mensagem tipo 3: Recebida")
            self.mensagemTipo3['recebida'] = True

        elif messageType == 4:
            print("Mensagem tipo 4: Recebida")
            self.mensagemTipo4['recebida'] = True
            return 4
        elif messageType == 5:
            print("Mensagem tipo 5: Recebida")
            self.mensagemTipo5['recebida'] = True
            return 5

        elif messageType == 6:
            print("Mensagem tipo 6: Recebida")
            self.mensagemTipo6['recebida'] = True
            return 6

        elif messageType == 7:
            # Encerra comunicação
            print("Mensagem tipo 7: Recebida")
            print("-------------------------")
            print("Comunicação encerrada")
            print("-------------------------")
            self.mensagemTipo7['recebida'] = True
            self.disable()
        elif messageType == 8:
            print("Mensagem tipo 8: Recebida")
            self.mensagemTipo8['recebida'] = True
        elif messageType == 9:
            print("Mensagem tipo 9: Recebida")
            self.mensagemTipo9['recebida'] = True

        else:
            pass
            #print("ERROR: Mensagem tipo {}".format(messageType))
            #print("ERROR: Ultima Mensagem {}".format(last_message))

    def sendEndingMassage(self):
        pack7 = self.tx.createPACKAGE(7)
        self.sendData(pack7)
        self.mensagemTipo7['enviada'] = True
        print("Mensagem tipo 7: Enviada")
        print("-------------------------")
        print("Comunicação encerrada")
        print("-------------------------")
        self.disable()
Пример #2
0
class enlace(object):
    """ This class implements methods to the interface between Enlace and Application
    """
    def __init__(self, name):
        """ Initializes the enlace class
        """
        self.fisica = fisica(name)
        self.rx = RX(self.fisica)
        self.tx = TX(self.fisica)
        self.connected = False
        self.payload = b'\x00'
        self.package = None
        self.dataSize = 0
        self.headSize = 16
        self.clientSynchComplete = False
        self.serverSynchComplete = False

        self.mensagemTipo1 = {'enviada': False, 'recebida': False}
        self.mensagemTipo2 = {'enviada': False, 'recebida': False}
        self.mensagemTipo3 = {'enviada': False, 'recebida': False}
        self.mensagemTipo4 = {'enviada': False, 'recebida': False}
        self.mensagemTipo5 = {'enviada': False, 'recebida': False}
        self.mensagemTipo6 = {'enviada': False, 'recebida': False}
        self.mensagemTipo7 = {'enviada': False, 'recebida': False}

    def enable(self):
        """ Enable reception and transmission
        """
        self.fisica.open()
        self.rx.threadStart()
        self.tx.threadStart()

    def disable(self):
        """ Disable reception and transmission
        """
        self.rx.threadKill()
        self.tx.threadKill()
        time.sleep(1)
        self.fisica.close()

    ################################
    # Application  interface       #
    ################################
    def sendData(self, data):
        """ Send data over the enlace interface
        """
        self.tx.sendBuffer(data)

    def getData(self, last_message=0):
        """ Get n data over the enlace interface
        Return the byte array and the size of the buffer
        """
        # print('entrou na leitura e tentara ler ' + str(size) )

        data = self.rx.getNData()
        if data == 0:
            data = self.tx.createPACKAGE(0)
            messageType = self.checkMessageType(data, last_message)
        else:
            messageType = self.checkMessageType(
                data)  #Verifica o tipo da mensagem no buffer
        payloadSize = 1
        if messageType == 4:
            #print(data)
            recievePack = data
            self.data, self.dataSize = self.rx.unpackage(recievePack)
            self.checkAcknoledgement(self.data, self.dataSize)
            return self.data, len(self.data), self.dataSize

        return data, len(data), payloadSize

    def findEOP(self, dados):
        EOPbytes = 129
        EOPbytes = EOPbytes.to_bytes(4, byteorder="big")
        print("EOP: {}".format(EOPbytes))
        achou = False
        for byte in dados:
            #print(byte)
            if byte == EOPbytes:
                achou = True
                print("EOPbytes encontrado no index {}".format(
                    dados.index(byte)))

        if not achou:
            print("[ERRO] - EOPbytes NOT ENCONTRADO")
        print("Tamanho dos dados: {}".format(len(dados)))
        pass

    def clientSynch(self):
        while self.mensagemTipo2['recebida'] == False:
            # Cria pacote vazio com mensagem tipo 1
            pack1 = self.tx.createPACKAGE(1)

            # Envia mensagem tipo 1
            self.sendData(pack1)
            print("Mensagem tipo 1: Enviada")
            time.sleep(0.1)

            while self.mensagemTipo2[
                    'recebida'] == False:  # Acada segundos verifica se recebeu a mensagem tipo 2
                data, size, payloadSize = self.getData(
                    1)  # Le o Buffer de recebimento
                timeout = self.rx.timeout
                if timeout >= 5:
                    print("[ERRO] - Não recebimento da mensagem tipo 2")
                    return
        #Cria pacote vazio com mensagem tipo 3
        pack3 = self.tx.createPACKAGE(3)
        # Envia mensagem tipo 3
        self.sendData(pack3)
        print("Mensagem tipo 3: Enviada")
        self.mensagemTipo3['enviada'] == True
        self.clientSynchComplete = True

    def serverSynch(self):
        while self.mensagemTipo1['recebida'] == False:
            time.sleep(0.1)
            data, size, payloadSize = self.getData()

        # Cria pacote vazio com mensagem tipo 2
        pack2 = self.tx.createPACKAGE(2)
        self.sendData(pack2)
        print("Mensagem tipo 2: Enviada")  # Envia mensagem tipo 2

        time.sleep(0.1)
        while self.mensagemTipo3['recebida'] == False:
            data, size, payloadSize = self.getData(2)
            timeout = self.rx.timeout
            if timeout >= 5:
                print("[ERRO] - Não recebimento da mensagem tipo 3")
                return
        self.serverSynchComplete = True

    def clientSendFile(self, file):
        time.sleep(0.2)
        pack = self.tx.createPACKAGE(4, file)
        #print(pack)
        self.rx.unpackage(pack)
        self.sendData(pack)
        self.mensagemTipo4['enviada'] = True

        time.sleep(0.2)
        while self.mensagemTipo5['recebida'] == False:
            data, size, payloadSize = self.getData(4)
            timeout = self.rx.timeout
            if timeout >= 5:
                print("[ERRO] - Não recebimento da mensagem tipo 5 ou 6")
                return
            if self.mensagemTipo6["recebida"] == True:
                self.sendData(pack)
                print("Mensagem tipo 4 enviada novamente")

    def checkAcknoledgement(self, data, payloadSize):
        print("Len data: {}  PayloadSize: {}".format(len(data), payloadSize))
        if len(data) == payloadSize:
            mensagemTipo5 = self.tx.createPACKAGE(5)
            self.sendData(mensagemTipo5)
            self.mensagemTipo5['enviada'] = True
            print("Mensagem tipo 5 enviada")

        else:
            mensagemTipo6 = self.tx.createPACKAGE(6)
            self.sendData(mensagemTipo6)
            self.mensagemTipo5['enviada'] = True
            print("Mensagem tipo 6 enviada")

    def checkMessageType(self, message, last_message=0):
        messageType = 0
        try:
            messageType = message[9]
        except:
            print("DEU RUIM AQUI")
        if messageType == 0 and last_message != 0:
            if last_message == 4:
                print("[ERRO] - Não recebimento da mensagem tipo 5 ou 6")
            else:
                print("[ERRO] - Não recebimento da mensagem tipo {}".format(
                    last_message + 1))

        if messageType == 1:
            print("Mensagem tipo 1: Recebida")
            self.mensagemTipo1['recebida'] = True

        elif messageType == 2:
            print("Mensagem tipo 2: Recebida")
            self.mensagemTipo2['recebida'] = True

        elif messageType == 3:
            print("Mensagem tipo 3: Recebida")
            self.mensagemTipo3['recebida'] = True

        elif messageType == 4:
            print("Mensagem tipo 4: Recebida")
            self.mensagemTipo4['recebida'] = True
            return 4
        elif messageType == 5:
            print("Mensagem tipo 5: Recebida")
            self.mensagemTipo5['recebida'] = True
            self.sendEndingMassage()
            return 5

        elif messageType == 6:
            print("Mensagem tipo 6: Recebida")
            self.mensagemTipo6['recebida'] = True
            return 6

        elif messageType == 7:
            # Encerra comunicação
            print("Mensagem tipo 7: Recebida")
            print("-------------------------")
            print("Comunicação encerrada")
            print("-------------------------")
            self.mensagemTipo7['recebida'] = True
            self.disable()
        else:
            pass
            #print("ERROR: Mensagem tipo {}".format(messageType))
            #print("ERROR: Ultima Mensagem {}".format(last_message))

    def sendEndingMassage(self):
        pack7 = self.tx.createPACKAGE(7)
        self.sendData(pack7)
        self.mensagemTipo7['enviada'] = True
        print("Mensagem tipo 7: Enviada")
        print("-------------------------")
        print("Comunicação encerrada")
        print("-------------------------")
        self.disable()