Esempio n. 1
0
 def register_package(self, package):
     """ Register an instance of a package."""
     instance = package(self._system)
     self._logger.package_registered(instance.get_name())
     instance.check_state()
     if isinstance(instance, localpackage.LocalPackage) and instance.is_downloaded():
         self._logger.package_downloaded(instance.get_name())
     if instance.is_installed():
         self._logger.package_installed(instance.get_name())
     self._packages[instance.get_name()] = instance
Esempio n. 2
0
 def register_package(self, package):
     """ Register an instance of a package."""
     instance = package(self._system)
     self._logger.package_registered(instance.get_name())
     instance.check_state()
     if isinstance(instance,
                   localpackage.LocalPackage) and instance.is_downloaded():
         self._logger.package_downloaded(instance.get_name())
     if instance.is_installed():
         self._logger.package_installed(instance.get_name())
     self._packages[instance.get_name()] = instance
def main():
    #Inicio do clock
    ini = time.time()
    # Inicializa enlace ... variavel com possui todos os metodos e propriedades do enlace, que funciona em threading
    com = enlace(
        serialName)  # repare que o metodo construtor recebe um string (nome)
    # Ativa comunicacao
    com.enable()

    # Log
    print("-------------------------")
    print("Comunicação inicializada")
    print("  porta : {}".format(com.fisica.name))
    print("-------------------------")

    # Carrega dados
    print("gerando dados para transmissao :")

    #no exemplo estamos gerando uma lista de bytes ou dois bytes concatenados

    #exemplo 1
    #ListTxBuffer =list()
    #for x in range(1,10):
    #    ListTxBuffer.append(x)
    #txBuffer = bytes(ListTxBuffer)

    #Testando com imagem

    imagem = str(input("Qual a imagem a ser enviada?"))
    with open(imagem, "rb") as image:
        f = image.read()
        imgByte = bytearray(f)
#    numero = 47893273
#    txBuffer = numero.to_bytes(36,byteorder="big")

    pacote = package(imgByte)

    txBuffer = pacote.putInPackage()
    overhead = len(txBuffer) / len(imgByte)
    com.sendData(txBuffer)

    print("tentado transmitir .... {} bytes".format(len(txBuffer)))
    print("5")

    # espera o fim da transmissão
    while (com.tx.getIsBussy()):
        pass

    dpackage = dPackage(com)

    rxConfirm = dpackage.dePackage()
    print("pastel", rxConfirm)
    nEOP = rxConfirm[1:5]
    print("aquilo", nEOP)
    nMessage = rxConfirm[0:1]
    print("isso", nMessage)
    if (nMessage == b'\x00'):
        print("Funcionou! Index = {0}".format(
            int.from_bytes(nEOP, byteorder="big")))
    elif (nMessage == b'\x01'):
        print("EOP não encontrado!")
    elif (nMessage == b'\x11'):
        print("EOP no local errado!")
    else:
        print("Fudeu!")


#        # Transmite dado
#        print("tentado transmitir .... {} bytes".format(txLen))
#        com.sendData(txBuffer)
#
#
#
#
#        # Atualiza dados da transmissão
#        txSize = com.tx.getStatus()
#        print ("Transmitido       {} bytes ".format(txSize))
#
#    # Faz a recepção dos dados
#    print ("Recebendo dados .... ")
#    rxBuffer, nRx = com.getData(txLen)
#    print ("Lido              {} bytes ".format(nRx))
#repare que o tamanho da mensagem a ser lida é conhecida!
#    rxBuffer, nRx = com.getData(txLen)
#    open("../Imagem/toad.png",'wb').write(rxBuffer)

# log
#    print ("Lido              {} bytes ".format(nRx))

#    print (rxBuffer)

#Fim do clock
    fim = time.time()
    dt = fim - ini
    print("Overhead: {0}".format(overhead))
    print("ThroughPut: {0}".format(len(txBuffer) / dt))
    #    print("Tempo de transmissão:" + str(txLen/t))

    # Encerra comunicação
    print("-------------------------")
    print("Comunicação encerrada")
    print("-------------------------")
    com.disable()
Esempio n. 4
0
def main():
    # Inicializa enlace ... variavel com possui todos os metodos e propriedades do enlace, que funciona em threading
    com = enlace(
        serialName)  # repare que o metodo construtor recebe um string (nome)
    # Ativa comunicacao
    com.enable()
    com.fisica.flush()
    dpackage = dPackage(com)
    pacote = package(b'/x00')

    server = 1
    serverByte = server.to_bytes(1, byteorder="big")
    arquivo = open('InfoRecebe.txt', 'a')

    # Log
    print("-------------------------")
    print("Comunicação inicializada")
    print("  porta : {}".format(com.fisica.name))
    print("-------------------------")

    ocioso = True

    while ocioso:
        time.sleep(0.1)
        message1, size = com.getData(12)
        if len(message1) > 0:
            serverNumber, typeNumber, packNumber, packNumberTotal, rxBufferSize = dpackage.readHeader(
                message1)
            lixo, lixoSize = com.getData(rxBufferSize + 4)
            if (serverNumber == 1) and (typeNumber == 1):
                ocioso = False
                arquivo.write("Msg: 1 – recebida: " +
                              str(time.ctime(int(time.time()))) +
                              "– destinatário: 2 \n")
                print("recebeu mensagaem tipo 1")

    time.sleep(0.2)
    msg2 = pacote.packUniMessage(server, packNumber, packNumberTotal, 0)
    txBuffer = msg2
    txBuffered = pacote.putType(2, txBuffer)
    com.sendData(txBuffered)
    time.sleep(1)
    arquivo.write("Msg: 2 – enviada: " + str(time.ctime(int(time.time()))) +
                  " – destinatário: 2 \n")
    print("mandou mensagem tipo 2")
    com.fisica.flush()

    start = time.time()
    start1 = time.time()
    cont = 1
    concat = []
    while cont <= packNumberTotal:
        com.fisica.flush()
        com.rx.clearBuffer()
        msg3, size = com.getData(12)
        if len(msg3) >= 1:
            serverNumber, typeNumber, packNumber, packNumberTotal, rxBufferSize = dpackage.readHeader(
                msg3)
            msg3pay, size = com.getData(rxBufferSize + 4)
            payload, eop = dpackage.readPayload(msg3pay, rxBufferSize)
            erro = dpackage.checaErro(msg3pay, eop, rxBufferSize)[0]
            time.sleep(0.4)
            print(msg3)
            arquivo.write("Msg: 3 – recebida: " +
                          str(time.ctime(int(time.time()))) +
                          "– destinatário: 2 \n")
            if (typeNumber == 3) and (packNumber
                                      == cont) and (erro
                                                    == 0) and len(payload) > 0:
                msg4 = pacote.packUniMessage(server, packNumber,
                                             packNumberTotal, 0)
                txBuffer = msg4
                txBuffer = pacote.putType(4, txBuffer)
                com.sendData(txBuffer)
                concat.append(payload)
                start = time.time()
                arquivo.write("Msg: 4 – enviada:" +
                              str(time.ctime(int(time.time()))) +
                              "– destinatário: 2 \n")
                print("enviou confirmação pacote ", cont, "de",
                      packNumberTotal)
                cont += 1
                print(msg3)
            elif len(payload) > 0 and len(msg3) > 0:
                msg6 = pacote.packUniMessage(server, packNumber,
                                             packNumberTotal, 0)
                txBuffer = msg6
                txBuffer = pacote.putType(6, txBuffer)
                arquivo.write("Msg: 6 – enviada: " +
                              str(time.ctime(int(time.time()))) +
                              "– destinatário: 2 \n")
                print("enviou erro pacote ", cont, "de", packNumberTotal)
                com.sendData(txBuffer)
                print(msg3)
            end = time.time()
            delta = end - start
            if delta > 21:
                msg5 = pacote.packUniMessage(server, packNumber,
                                             packNumberTotal, 0)
                txBuffer = msg5
                txBuffer = pacote.putType(5, txBuffer)
                com.sendData(txBuffer)
                arquivo.write("Msg: 5 – enviada: " +
                              str(time.ctime(int(time.time()))) +
                              "– destinatário: 2 \n")
                print("TIME OUT")
                break
        else:
            time.sleep(1)
            msg4 = pacote.packUniMessage(server, packNumber, packNumberTotal,
                                         0)
            txBuffer = msg4
            txBuffer = pacote.putType(4, txBuffer)
            com.sendData(txBuffer)
            arquivo.write("Msg: 4 – enviada:" +
                          str(time.ctime(int(time.time()))) +
                          "– destinatário: 2 \n")
            continue
    real = b''.join(concat)
    arquivo.close()
    open("../camada/toad.png", 'wb').write(real)
    print("recebido!")

    # Encerra comunicação
    print("-------------------------")
    print("Comunicação encerrada")
    print("-------------------------")
    com.disable()
def sender(sentence, timeEnd, winSize):
    global stop_signal
    global S_HOST
    global S_PORT
    global S_ADDR

    # s_sender va fi socket-ul de comunicatie de la sender catre receiver; se va transmite prin datagrame UDP
    s_sender = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

    # fiind portul principal de transmitere, va fi conectat la un PORT, la adresa ip S_HOST
    # se gaseste un port liber dintre cele disponibile
    while True:
        try:
            s_sender.bind(S_ADDR)
            break
        except socket.error as e:
            if e.errno == errno.EADDRINUSE:
                print(f"<SENDER> Portul {S_ADDR[1]} este deja folosit!")
                S_PORT += 10
                S_ADDR = (S_HOST, S_PORT)
            else:
                print(e)
                break

    timeout = timeEnd  # timpul, in milisecunde, in care socket-ul asteapta un pachet
    window_size = winSize  # dimensiunea ferestrei glisante a transmitatorului
    pack_size = 30  # dimensiunea pachetului (lungimea maxima a sirului de caractere din pachetul sender-ului)

    pack_s = package(
        'info', '', 0
    )  # pachetul trimis de sender este de tip informatie(un sir de caractere)
    pack_r = package('ack', 1,
                     0)  # pachetul primit de la receiver va fi de tip ack
    window_s = [
    ]  # buffer-ul sender-ului (va contine window_size siruri de caractere de lungime pack_size)
    seq_num = 0  # pozitia sirurului de caractere din vectorul de propozitii
    # util in buffer, pentru a simula glisarea ferestrei

    timeout_threads = [
    ]  # vector de thread-uri pentru fiecare element din buffer

    # un thread de aici este utilizat pentru trimiterea unui nou pachet cu informatii cand timer-ul timeout expira

    # functie de trimitere a unui pachet din sender spre receiver
    def timeout_send(pack: package):

        data_snd = pack.dump_pack()
        s_sender.sendto(data_snd, R_ADDR)

        insertViewSender(
            f'TIMEOUT ENDED: Sent - Package: {pack_s.type} -- "{pack_s.info}" -- {pack_s.seq_num} '
            + f'Address: {R_ADDR} Date: {datetime.datetime.now()}\n')

    # citim un sir de propozitii
    prop = sentence

    # punem propozitia in buffer pana cand acesta este plin(dimensiunea lui egala cu dimensiunea ferestrei) sau pana
    # cand nu mai avem ce pune din propozitie
    while len(window_s) != window_size and len(prop) != 0:

        # daca propozitia nu poate incapea complet intr-o zona din buffer
        if len(prop) > pack_size:

            # punem cate o parte din propozitie intr-un frame cat ne permite zona de buffer(maxim pack_size octeti pe
            # zona)
            window_s.append(frame(prop[:pack_size], False, seq_num))
            # Frame-ul consta intr-un sir de caractere, un boolean ce va determina daca frame-ul a fost primit in
            # receiver si pozitia in secventa de trimitere a sirurilor spre receiver
            prop = prop[pack_size:]

        # daca propozitia incape complet in zona de buffer
        else:
            window_s.append(frame(prop, False, seq_num))
            prop = ''

        # pentru fiecare frame introdus este atribuit un thread de timeout(atunci cand se trimite frame-ul sub forma
        # de pachet catre receiver, daca nu primeste de la acesta in timp de timeout/1000 secunde un pachet de ack
        # corespunzator frame-ului, atunci se va trimite din nou acelasi pachet catre receiver, iar thread-ul se
        # incheie)
        pack_s.info = window_s[-1].info
        pack_s.seq_num = window_s[-1].seq_num
        timeout_threads.append(
            threading.Timer(timeout / 1000, timeout_send, args=(pack_s, )))

        # marim numarul de secvente introduse in total in fereastra
        seq_num += 1

    # functie de asteptare si preluare a pachetelor de confirmare din receptor
    def reception_fct():
        while True:
            # caut un raspuns in buffer-ul de receptie
            response, _, _ = select.select([s_sender], [], [], 1)
            if response:
                info_rcv, addr_rcv = s_sender.recvfrom(1024)
                if addr_rcv == R_ADDR:
                    pack_r.load_pack(info_rcv)
                    insertViewSender(
                        f'Received - Package: {pack_r.type} -- {pack_r.info} -- {pack_r.seq_num} " '
                        +
                        f'Address: {addr_rcv} Date: {datetime.datetime.now()}\n'
                    )

                    if pack_r.type == 'ack' and pack_r.info is True and pack_r.seq_num < seq_num:
                        # este preluat numarul de secventa din primul frame din fereastra
                        seq_begin = window_s[0].seq_num

                        # Folosind variabila de mai sus, se va determina pozitia din fereastra unde va fi pusa
                        # informatia Daca diferenta dintre numarul de secventa al pachetului primit si numarul de
                        # secventa al primului frame din fereastra este negativ, atunci este vorba de o confirmare a
                        # unui frame anterior confirmat si astfel eliminat din fereastra
                        if pack_r.seq_num - seq_begin >= 0:
                            window_s[pack_r.seq_num -
                                     seq_begin].is_ack = pack_r.info
                            if timeout_threads[pack_r.seq_num -
                                               seq_begin].is_alive():
                                timeout_threads[pack_r.seq_num -
                                                seq_begin].cancel()

                # functia de receptie se opreste daca toata propozitia a fost confirmata de receiver, astfel nu mai
                # exista niciun pachet in fereastra, iar propozitia initiala devine goala
            if len(window_s) == 0 and len(prop) == 0:
                break

    receive_thread = threading.Thread(
        target=reception_fct
    )  # thread de receptie a pachetelor de ack pentru sender
    receive_thread.start()

    while True:
        try:
            # in cazul in care este oprit sender-ul din afara(prin intermediul butonului stop din interfata)
            if stop_signal:
                for x in timeout_threads:
                    if x.is_alive():
                        x.cancel()
                receive_thread.join()
                break

            # De fiecare data in fereastra se trimite pentru fiecare frame un pachet de tip info, ce contine atat
            # informatia stocata in frame, cat si numarul de secventa a ferestrei.
            for i in range(len(window_s)):
                # Daca nu a pornit inca thread-ul de timeout(Timer-ul) sau timpul de asteptare al pachetului de
                # confirmare specific Timer-ului a expirat, mai intai este trimis din nou pachetul catre receiver,
                # apoi Timer-ul este pornit pentru pachetul trimis
                if not timeout_threads[i].is_alive(
                ) and window_s[i].is_ack is False:
                    pack_s.info = window_s[i].info
                    pack_s.seq_num = window_s[i].seq_num
                    dumped_pack_snd = pack_s.dump_pack()
                    s_sender.sendto(dumped_pack_snd, R_ADDR)

                    # fisier log pentru verificarea transmisiei/receptiei pachetelor pentru sender
                    insertViewSender(
                        f'Sent - Package: {pack_s.type} -- "{pack_s.info}" -- {pack_s.seq_num} '
                        +
                        f'Address: {R_ADDR} Date: {datetime.datetime.now()}\n')
                    try:
                        timeout_threads[i].start()
                    except RuntimeError:
                        pass

                # Daca frame-ul a primit confirmarea prin primirea pachetului de ack ca a fost preluat de receiver,
                # oprim thread-ul de timeout doar daca acesta inca lucreaza
                if window_s[i].is_ack is True and timeout_threads[i].is_alive(
                ):
                    timeout_threads[i].cancel()

            # Scoatem din fereastra, incepand de la prima pozitie, toate frame-urile confirmate, impreuna cu
            # thread-urile de asteptare aferente, pana cand gasim un frame inca in asteptare
            while len(window_s) != 0 and window_s[0].is_ack is True:
                window_s.pop(0)
                if timeout_threads[0].is_alive():
                    timeout_threads[0].cancel()
                timeout_threads.pop(0)

            # umplem fereastra cu frame-uri ce contin bucati ramase din informatia prop pana cand toata este pusa sau
            # buffer-ul este plin
            while len(window_s) != window_size and len(prop) != 0:
                # daca propozitia nu poate incapea complet intr-o zona din buffer
                if len(prop) > pack_size:
                    # punem cate o parte din propozitie intr-un frame cat ne permite zona de buffer(maxim pack_size
                    # octeti pe zona)
                    window_s.append(frame(prop[:pack_size], False, seq_num))
                    prop = prop[pack_size:]

                # daca propozitia incape complet in zona de buffer
                else:
                    window_s.append(frame(prop, False, seq_num))
                    prop = ''

                # pentru noul frame pus in fereastra, este adaugat un thread de timeout pentru acesta
                pack_s.info = window_s[-1].info
                pack_s.seq_num = window_s[-1].seq_num
                timeout_threads.append(
                    threading.Timer(timeout / 1000,
                                    timeout_send,
                                    args=(pack_s, )))

                # marim numarul de secvente introduse in total in fereastra
                seq_num += 1

            # cand nu mai este nimic de trimis in receiver(fereastra este goala si nu mai este nimic de trimis din
            # fraza), sunt incheiate toate Timer-ele pentru fiecare frame din fereastra(daca sunt active), iar thread-ul
            # de receptie al pachetelor este asteptat sa isi termine treaba
            if len(window_s) == 0 and len(prop) == 0:
                for x in timeout_threads:
                    if x.is_alive():
                        x.cancel()
                receive_thread.join()
                insertViewSender("Sender finished successfully!")
                break

        except KeyboardInterrupt:
            break
    s_sender.close()
def receiver(winSize, timeEnd, failChance):
    global stop_signal
    global R_HOST
    global R_PORT
    global R_ADDR

    # socket-ul receiver-ului
    s_receiver = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    # se conecteaza socketul la adresa cu portul disponibil(pentru a putea trimite packete de ack)
    while True:
        try:
            s_receiver.bind(R_ADDR)
            break
        except socket.error as e:
            if e.errno == errno.EADDRINUSE:
                print(f"<RECEIVER> Portul {R_ADDR[1]} este deja folosit!")
                R_PORT += 10
                R_ADDR = (R_HOST, R_PORT)
            else:
                print(e)
                break

    window_size = winSize  # dimensiunea ferestrei glisante a receptorului
    failure_chance = failChance  # sansa ca un pachet sa nu ajunga la receptor ( 0.1 = 10% )
    pack_size = 30  # dimensiunea pachetului (lungimea maxima a sirului de caractere din pachetul sender-ului)
    timeout = timeEnd  # timpul, in milisecunde, in care socket-ul asteapta un pachet(pentru sender)
    rcv_timeout = timeout * 2 / 1000  # timpul de asteptare in secunde a unui nou pachet pentru receiver pana se inchide

    pack_s = package(
        'info', '', 0
    )  # pachetul primit de la sender este de tip informatie(un sir de caractere)
    pack_r = package('ack', True,
                     0)  # pachetul trimis de receiver va fi de tip ack
    window_r = []  # buffer-ul(fereastra) receiver-ului
    sentence_pcs = [
    ]  # vectorul in care se va stoca parti din informatia transmisa
    sentence_rcv = ''  # propozitia finala, compusa dupa primirea tuturor partilor (si cand buffer-ul este gol)
    seq_num = 0  # pozitia sirurului de caractere din vectorul de propozitii
    # util in buffer, pentru a simula glisarea ferestrei

    # initial fereastra va fi umpluta cu frame-uri cu informatii nule si fara confirmare cu ack
    # iar vectorul de parti ale propozitiei primite va fi umplut cu valori nule
    for i in range(window_size):
        window_r.append(frame('', False, seq_num))
        seq_num += 1
        sentence_pcs.append('')

    while True:
        # in cazul in care este oprit receiver-ul din afara(prin intermediul butonului stop din interfata)
        # se combina propozitiile din pachetele primite pana acum si se afiseaza rezultatul in view-ul receiver-ului

        try:
            # caut un raspuns in buffer-ul de receptie
            response, _, _ = select.select([s_receiver], [], [], 1)

            # asteapta pana receptioneaza un pachet data_snd cu adresa addr_snd, venit de la sender cand se primeste
            # un raspuns de la sender, timpul de timeout al receiver-ului se reseteaza la valoarea initiala
            if response:

                # pentru a simula pierderea pachetelor in urma trimiterii acestora prin protocolul udp, este generat un
                # numar intre 0 si 1, reprezentand sansa pachetului de a ajunge in receiver
                chance = random()

                # daca aceasta este mai mare decat sansa de a fi pierdut pachetul, atunci raspunsul din buffer-ul de
                # receptie este analizat si prelucrat
                if chance > failure_chance:

                    # este resetat timpul de asteptare al receiver-ului si este preluat din buffer-ul de receptie
                    # informatia si adresa acesteia
                    rcv_timeout = (timeout * 2) / 1000
                    data_snd, addr_snd = s_receiver.recvfrom(1024)

                    # daca adresa primita coincide cu adresa sender-ului
                    if addr_snd == S_ADDR:

                        # se incarca pachetul primit de la sender spre analizare
                        pack_s.load_pack(data_snd)

                        # fisier log pentru verificarea transmisiei/receptiei in receiver
                        insertViewReceiver(
                            f'Received - Package: {pack_s.type} -- "{pack_s.info}" -- {pack_s.seq_num} '
                            +
                            f'Address: {addr_snd} Date: {datetime.datetime.now()}\n'
                        )

                        # daca pachetul contine un fragment de propozitie( type = info )
                        # si secventa de unde provine nu depaseste numarul maxim curent de secvente(seq_num)
                        if pack_s.type == 'info' and pack_s.seq_num < seq_num and pack_size >= len(
                                pack_s.info):

                            # este preluat numarul de secventa din primul frame din fereastra
                            seq_begin = window_r[0].seq_num

                            # folosind variabila de mai sus, se va determina pozitia din fereastra unde va fi pusa
                            # informatia, iar acolo este confirmat ca a fost primit, daca numarul de secventa al
                            # pachetului nu este inainte de numarul de secventa al primului frame din fereastra
                            if pack_s.seq_num - seq_begin >= 0:
                                window_r[pack_s.seq_num -
                                         seq_begin].info = pack_s.info
                                window_r[pack_s.seq_num -
                                         seq_begin].is_ack = True
                                sentence_pcs[pack_s.seq_num] = pack_s.info

                                # odata pusa informatia in vectorul de parti de date, se transmite catre sender un
                                # pachet de ack la secventa de unde a venit partea
                                pack_r.seq_num = pack_s.seq_num
                                dumped_pack_rcv = pack_r.dump_pack()
                                s_receiver.sendto(dumped_pack_rcv, S_ADDR)

                                insertViewReceiver(
                                    f'Sent - Package: ' +
                                    f'{pack_r.type} -- {pack_r.info} -- {pack_r.seq_num} '
                                    +
                                    f'Address: {S_ADDR} Date: {datetime.datetime.now()}\n'
                                )

                        # Scoatem din fereastra, incepand de la prima pozitie, toate frame-urile confirmate pana cand
                        # gasim un frame inca in asteptare. De asemenea, adaugam in locul lor, la finalul ferestrei,
                        # un nou frame cu informatie goala
                        while window_r[0].is_ack:
                            window_r.pop(0)
                            window_r.append(frame('', False, seq_num))
                            sentence_pcs.append('')
                            seq_num += 1

                # daca sansa de a intra pachetul in receiver este mai mica sau egala cu sansa de pierdere al acestuia
                else:
                    data_snd, addr_snd = s_receiver.recvfrom(1024)
                    # se afiseaza in consola(test) ca a fost pierdut
                    insertViewReceiver(
                        f'"LOST" Received - Package: ' +
                        f'{pack_s.type} -- "{pack_s.info}" -- {pack_s.seq_num} '
                        +
                        f'Address: {addr_snd} Date: {datetime.datetime.now()}\n'
                    )

                    # Cand nu mai exista pachete in receiver, se scade timpul de timeout(practic receiver-ul asteapta
                    # pachete noi care sa umple macar un frame din fereastra pana la expirarea timpului)
                    if window_r[0].info == '':
                        rcv_timeout -= 1
                        insertViewReceiver(
                            f"Waiting for new packages...(time before timeout: {rcv_timeout} s)\n"
                        )

                    # Cand timpul de asteptare a expirat, receiver-ul considera ca s_receiver a receptionat toate
                    # pachetele si astfel se termina receptia
                    if rcv_timeout <= 0:
                        insertViewReceiver(
                            "Receiver finished (timeout ended)\n")
                        break

                    if stop_signal:
                        insertViewReceiver("Receiver stopped\n")
                        break

            # daca nu exista nimic in buffer-ul socket-ului specific receiver-ului
            else:

                # Cand nu mai exista pachete in receiver, se scade timpul de timeout(practic receiver-ul asteapta
                # pachete noi care sa umple macar un frame din fereastra pana la expirarea timpului)
                if window_r[0].info == '':
                    rcv_timeout -= 1
                    insertViewReceiver(
                        f"Waiting for new packages...(time before timeout: {rcv_timeout} s)\n"
                    )

                # Cand timpul de asteptare a expirat, receiver-ul considera ca s_receiver a receptionat toate
                # pachetele si astfel se termina receptia
                if rcv_timeout <= 0:
                    insertViewReceiver("Receiver finished (timeout ended)\n")
                    break

                if stop_signal:
                    insertViewReceiver("Receiver stopped\n")
                    break
        except KeyboardInterrupt:
            break

    s_receiver.close()

    # test de verificare a integritatii propozitiei(sunt unite toate bucatile primite din receiver)
    for x in sentence_pcs:
        sentence_rcv += x
    insertViewReceiver("\nPropozitie primita in final: " + sentence_rcv + "\n")
    buttonStart.config(state=NORMAL)
    buttonStop.config(state=DISABLED)
Esempio n. 7
0
def main():
    # Inicializa enlace ... variavel com possui todos os metodos e propriedades do enlace, que funciona em threading
    com = enlace(serialName) # repare que o metodo construtor recebe um string (nome)
    # Ativa comunicacao
    com.enable()

   

    # Log
    print("-------------------------")
    print("Comunicação inicializada")
    print("  porta : {}".format(com.fisica.name))
    print("-------------------------")

    # Carrega dados
    print ("gerando dados para transmissao :")
  
      #no exemplo estamos gerando uma lista de bytes ou dois bytes concatenados
    
    #exemplo 1
    #ListTxBuffer =list()
    #for x in range(1,10):
    #    ListTxBuffer.append(x)
    #txBuffer = bytes(ListTxBuffer)
    
    #Testando com imagem
    
    imagem = str(input("Qual a imagem a ser enviada?"))
    server = int(input("Para qual server devo enviar? (número pequeno)   "))
    byteServer = server.to_bytes(1,byteorder="big")
    
    arquivo = open('InfoEnvio.txt', 'a')
    #Inicio do clock
    
    
    with open(imagem, "rb") as image:
        f = image.read()
        imgByte = bytearray(f)

        
    pacote = package(imgByte)
    
#    txBuffer = pacote.putInPackage()
    pacoteStuff = pacote.byteStuffing()
    packList, packageNumberTotal = pacote.fragmenta(pacoteStuff)
    packList = pacote.putHeader(packList, byteServer)
    packList = pacote.putEOP(packList)
    txBuffer = packList
    txBufferType = []
    for msg in txBuffer:
        msg3 = pacote.putType(3, msg)
        txBufferType.append(msg3)
        

    
    print("Arquivo empacotado...")    
    
    
    overhead = len(b''.join(txBuffer))/len(imgByte)
    
    NumberTotalByte = packageNumberTotal.to_bytes(4,byteorder="big")
    
    pacote1 = package(NumberTotalByte)
    pacote1Stuff = pacote1.byteStuffing()
    packList1, packageNumberTotal1 = pacote.fragmenta(pacote1Stuff)
    packList2 = pacote1.putHeader(packList1, byteServer)
    packList3 = pacote1.putEOP(packList2)
    mensagem1 = packList3[0]
    mensagem1Type = pacote1.putType(1,mensagem1)
    
    ini = time.time()
    recivedType2 = False
    while not recivedType2:
        com.sendData(mensagem1Type)
        print("Permissão enviada...: ")
        arquivo.write("Msg: 1 – enviada: {0} – destinatário: {1}\n".format(time.ctime(int(time.time())),server))
        time.sleep(0.4)
        headerMensagem2, headerMensagem2Size = com.getData(12)
        if (len(headerMensagem2)>0):
            print("Header recebido!")
            if (headerMensagem2[0] == 2):
                recivedType2 = True
                lixo, lenLixo = com.getData(int.from_bytes(headerMensagem2[10:12], byteorder="big")+4)
                print("Permissão concedida!")
                arquivo.write("Msg: 2 – Recebido: {0} – destinatário: {1}\n".format(time.ctime(int(time.time())),1))
        
    byteSize = headerMensagem2[10:12]
    size = int.from_bytes(byteSize, byteorder="big")
    mensagem2, mensagem2Size = com.getData(size+4)
    
    cont = 1
    timeStart = time.time()
    while cont <= packageNumberTotal:
        com.rx.clearBuffer()
        com.sendData(txBufferType[cont-1])
        print("Enviando Pacote {0} de {1}...".format(cont,packageNumberTotal))
        arquivo.write("Enviando Pacote {0} de {1}...\n".format(cont,packageNumberTotal))
        arquivo.write("Msg: 3 – enviada: {0} – destinatário: {1}\n".format(time.ctime(int(time.time())),1))
        time.sleep(0.1)
        recived4, recived4Len = com.getData(12)
        if len(recived4)>0:
            lixo2, lenLixo2 = com.getData(int.from_bytes(recived4[10:12], byteorder="big")+4)
            if (recived4[0] == 4) and (int.from_bytes(recived4[2:6], byteorder="big") == cont):
                print("Pacote {0} de confirmação recebida!".format(cont))
                arquivo.write("Pacote {0} de confirmação recebida!\n".format(cont))
                arquivo.write("Msg: 4 – Recebido: {0} – destinatário: {1}".format(time.ctime(int(time.time())),1))
                cont += 1
                timeStart = time.time()
            elif (recived4[0] == 4) and (int.from_bytes(recived4[2:6], byteorder="big") != cont):
                print("Pacote {0} de confirmação NÃO recebida!".format(cont))
                arquivo.write("Pacote {0} de confirmação NÃO recebida!\n".format(cont))
                print("Novo pacote a REenviar: {0}".format(int.from_bytes(recived4[2:6], byteorder="big")))
                arquivo.write("Novo pacote a reenviar: {0} \n".format(int.from_bytes(recived4[2:6], byteorder="big")))
                cont = int.from_bytes(recived4[2:6], byteorder="big")+1
                
            elif (recived4[0] == 6):    
                print("Erro no envio do pacote {0}.".format(int.from_bytes(recived4[2:6], byteorder="big")))
                arquivo.write("Erro no envio do pacote {0}.\n".format(int.from_bytes(recived4[2:6], byteorder="big")))
                arquivo.write("Msg: 6 – Recebida: {0} – destinatário: {1}".format(time.ctime(int(time.time())),1))
                cont = int.from_bytes(recived4[2:6], byteorder="big")+1
    #            timeStart = time.time()
            
        timeEnd = time.time()
        deltat = timeEnd - timeStart
        if deltat > 21:
            print("Timeout! Envio cancelado!")
            arquivo.write("Timeout! Envio cancelado!\n")
            msg5 = pacote.putType(5, txBuffer[cont-1])
            com.sendData(msg5)
            break
        
 
    
    print("Envio FINALIZADO!!!! NÃO QUER QUISER QUE FOI BEM SUCEDIDO!!")

     
    # espera o fim da transmissão
    while(com.tx.getIsBussy()):
        pass
    
    
    
    #Fim do clock
    fim = time.time()
    dt = fim - ini
    print("Overhead: {0}".format(overhead))
    print("ThroughPut: {0}".format(len(imgByte)/dt))
    arquivo.write("ThroughPut: {0} \n".format(len(imgByte)/dt))
#    print("Tempo de transmissão:" + str(txLen/t))
    
    # Encerra comunicação
    print("-------------------------")
    print("Comunicação encerrada")
    print("-------------------------")
    arquivo.close()
    com.disable()