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 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 """ pacote, lenPayload = self.tx.cria_package(data) self.tx.sendBuffer(pacote) return lenPayload def getData(self): """ Get n data over the enlace interface Return the byte array and the size of the buffer """ print('entrou na leitura e tentara ler ') data, size = self.rx.getNData() payload = self.rx.desfaz_package(data) return (payload, len(payload))
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 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.client_sync() self.client_transmission(data) self.client_encerramento() def getData(self): """ Get n data over the enlace interface Return the byte array and the size of the buffer """ print('entrou na leitura e tentara ler ') self.server_sync() payload = self.server_transmission() self.server_encerramento() return (payload, len(payload)) def client_sync(self): sync1 = False sync2 = False payload = (0).to_bytes(1, byteorder="big") sync_package = self.tx.cria_package(payload, 1, 0, 0, 0) sync_package3 = self.tx.cria_package(payload, 3, 0, 0, 0) print(sync_package) self.tx.sendBuffer(sync_package) timer = time.time() while not sync1: data, size = self.rx.getNData() payload, tipo, ok, n_pacote, total_pacotes, pacote_esperado = self.rx.desfaz_package( data) if tipo == 2 and ok: sync1 = True print("recebeu tipo 2") break run_time = time.time() - timer if run_time > 5: print("Error: not receive type 2 ---------> Reenviando tipo 1") self.tx.sendBuffer(sync_package) timer = time.time() self.tx.sendBuffer(sync_package3) timer = time.time() while not sync2: data, size = self.rx.getNData() payload, tipo, ok, n_pacote, total_pacotes, pacote_esperado = self.rx.desfaz_package( data) if tipo == 40 and ok: sync2 = True print("recebeu tipo 40") break run_time = time.time() - timer if run_time > 5.0: print("mandou tipo 3") self.tx.sendBuffer(sync_package3) timer = time.time() def server_sync(self): sync1 = False sync2 = False payload_nulo = (0).to_bytes(1, byteorder="big") sync_package2 = self.tx.cria_package(payload_nulo, 2, 0, 0, 0) sync_package40 = self.tx.cria_package(payload_nulo, 40, 0, 0, 0) while not sync1: data, size = self.rx.getNData() payload, tipo, ok, n_pacote, total_pacotes, pacote_esperado = self.rx.desfaz_package( data) if tipo == 1 and ok: sync1 = True print("recebeu tipo 1") break self.tx.sendBuffer(sync_package2) print("Enviou tipo 2") timer = time.time() while not sync2: data, size = self.rx.getNData() payload, tipo, ok, n_pacote, total_pacotes, pacote_esperado = self.rx.desfaz_package( data) if tipo == 3 and ok: sync2 = True print("recebeu tipo 3") break run_time = time.time() - timer if run_time > 5.0: print("Erro: Type 3 not received --------> Reenviando tipo 2") self.tx.sendBuffer(sync_package2) timer = time.time() self.tx.sendBuffer(sync_package40) def client_transmission(self, payload): payloadnulo = (0).to_bytes(1, byteorder="big") timer = time.time() lista_pacotes, total_pacotes = self.separa_pacotes(payload) for i in range(len(lista_pacotes)): sync_package4 = self.tx.cria_package(lista_pacotes[i], 4, i + 1, len(lista_pacotes), 0) self.tx.sendBuffer(sync_package4) print("Mandou o pacote {0}/{1}".format(i + 1, len(lista_pacotes))) while True: data, size = self.rx.getNData() payload, tipo, ok, n_pacote, n_total, pacote_esperado = self.rx.desfaz_package( data) if tipo == 5 and ok: sync1 = True print("recebeu tipo 5") break elif tipo == 6 and ok: self.tx.sendBuffer(sync_package4) print("recebeu tipo 6") timer = time.time elif tipo == 8 and ok: sync_package8 = self.tx.cria_package( lista_pacotes[pacote_esperado], 4, pacote_esperado, n_total, 0) self.tx.sendBuffer(sync_package8) run_time = time.time() - timer if run_time > 4: print( "Tipo 5 ou 6 NAO recebido ------> Reenviando tipo 4 | {0} / {1} Tamanho:{2} bytes" .format(i + 1, total_pacotes, len(lista_pacotes[i]))) self.tx.sendBuffer(sync_package4) timer = time.time() def server_transmission(self): payloadnulo = (0).to_bytes(1, byteorder="big") sync_package5 = self.tx.cria_package(payloadnulo, 5, 0, 0, 0) sync_package6 = self.tx.cria_package(payloadnulo, 6, 0, 0, 0) lista_fragmentada = [] pacote_davez = 1 while True: data, size = self.rx.getNData() payload, tipo, ok, n_pacote, total_pacotes, pacote_esperado = self.rx.desfaz_package( data) #if n_pacote != pacote_davez: # print("ERRO: Deveria ter recebido {0} e recebeu {1}".format(pacote_davez, n_pacote)) # while True: ## sync_package8 = self.tx.cria_package(payloadnulo, 8, 0, 0, pacote_davez) # self.tx.sendBuffer(sync_package8) if tipo == 4 and ok: if n_pacote != pacote_davez: print( "ERRO: Deveria ter recebido {0} e recebeu {1}".format( pacote_davez, n_pacote)) sync_package8 = self.tx.cria_package( payloadnulo, 8, 0, 0, pacote_davez) self.tx.sendBuffer(sync_package8) timer = time.time() while True: payload, tipo, ok, n_pacote, total_pacotes, pacote_esperado = self.rx.desfaz_package( data) if tipo == 4 and ok: break run_time = time.time() - timer if run_time > 5: self.tx.sendBuffer(sync_package8) pacote_davez += 1 lista_fragmentada.append(payload) self.tx.sendBuffer(sync_package5) sync1 = True print("recebeu tipo 4 | {0}/{1} CORRETO, ENVIA 5".format( n_pacote, total_pacotes)) if n_pacote == total_pacotes: break elif tipo == 4 and not ok: self.tx.sendBuffer(sync_package6) print("Recebeu tipo 4 INCORRETO, Envia 6") compilado = bytes.fromhex("FF") for fragment in lista_fragmentada: compilado += fragment compilado = compilado[1:] return compilado def client_encerramento(self): time.sleep(4) payloadnulo = (0).to_bytes(1, byteorder="big") sync_package7 = self.tx.cria_package(payloadnulo, 7, 0, 0, 0) print("enviou tipo 7") self.tx.sendBuffer(sync_package7) def server_encerramento(self): encerra = False package_arbitrario = bytes.fromhex("F5 A3 AA C3 C3 B5 B4") timer = time.time() while not encerra: data, size = self.rx.getNData() payload, tipo, ok, n_pacote, total_pacotes, pacote_esperado = self.rx.desfaz_package( data) if tipo == 7: print("recebeu tipo 7, conexao encerrada") break run_time = time.time() - timer if run_time > 10: break def separa_pacotes(self, data): lista_pacotes = [] while len(data) > 128: pacote = data[0:128] data = data[128:] lista_pacotes.append(pacote) if len(data) > 0: pacote = data lista_pacotes.append(pacote) return lista_pacotes, len(lista_pacotes)
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 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.client_sync() self.client_transmission(data) self.client_encerramento() def getData(self): """ Get n data over the enlace interface Return the byte array and the size of the buffer """ print('entrou na leitura e tentara ler ') self.server_sync() payload = self.server_transmission() self.server_encerramento() return (payload, len(payload)) def client_sync(self): sync1 = False sync2 = False payload = (0).to_bytes(1, byteorder="big") sync_package = self.tx.cria_package(payload, 1) sync_package3 = self.tx.cria_package(payload, 3) print(sync_package) self.tx.sendBuffer(sync_package) timer = time.time() while not sync1: data, size = self.rx.getNData() payload, tipo, ok = self.rx.desfaz_package(data) if tipo == 2 and ok: sync1 = True print("recebeu tipo 2") break run_time = time.time() - timer if run_time > 5: print("Error: not receive type 2 ") self.tx.sendBuffer(sync_package) print("Enviando tipo 1") timer = time.time() self.tx.sendBuffer(sync_package3) timer = time.time() while not sync2: data, size = self.rx.getNData() payload, tipo, ok = self.rx.desfaz_package(data) if tipo == 40 and ok: sync2 = True print("recebeu tipo 40") break run_time = time.time() - timer if run_time > 5.0: print("mandou tipo 3") self.tx.sendBuffer(sync_package3) timer = time.time() def server_sync(self): sync1 = False sync2 = False payload_nulo = (0).to_bytes(1, byteorder="big") sync_package2 = self.tx.cria_package(payload_nulo, 2) sync_package40 = self.tx.cria_package(payload_nulo, 40) while not sync1: data, size = self.rx.getNData() payload, tipo, ok, = self.rx.desfaz_package(data) if tipo == 1 and ok: sync1 = True print("recebeu tipo 1") break self.tx.sendBuffer(sync_package2) timer = time.time() while not sync2: data, size = self.rx.getNData() payload, tipo, ok = self.rx.desfaz_package(data) if tipo == 3 and ok: sync2 = True print("recebeu tipo 3") break run_time = time.time() - timer if run_time > 5.0: print("Erro: Type 3 note received") self.tx.sendBuffer(sync_package2) print("mandou tipo 2") timer = time.time() self.tx.sendBuffer(sync_package40) def client_transmission(self, payload): payloadnulo = (0).to_bytes(1, byteorder="big") sync_package4 = self.tx.cria_package(payload, 4) self.tx.sendBuffer(sync_package4) sync1 = False timer = time.time() while not sync1: data, size = self.rx.getNData() payload, tipo, ok = self.rx.desfaz_package(data) if tipo == 5 and ok: sync1 = True print("recebeu tipo 5") break elif tipo == 6 and ok: self.tx.sendBuffer(sync_package4) print("recebeu tipo 6") timer = time.time run_time = time.time() - timer if run_time > 5.0: print("Erro: type 5 or 6 not received") print("mandou tipo 4") self.tx.sendBuffer(sync_package4) timer = time.time() def server_transmission(self): payloadnulo = (0).to_bytes(1, byteorder="big") sync_package5 = self.tx.cria_package(payloadnulo, 5) sync_package6 = self.tx.cria_package(payloadnulo, 6) sync1 = False while not sync1: data, size = self.rx.getNData() payload, tipo, ok = self.rx.desfaz_package(data) if tipo == 4 and ok: self.tx.sendBuffer(sync_package5) sync1 = True print("recebeu tipo 4 CORRETO, ENVIA 5") break elif tipo == 4 and not ok: self.tx.sendBuffer(sync_package6) print("Recebeu tipo 4 INCORRETO, Envia 6") return payload def client_encerramento(self): time.sleep(4) payloadnulo = (0).to_bytes(1, byteorder="big") sync_package7 = self.tx.cria_package(payloadnulo, 7) print("enviou tipo 7") self.tx.sendBuffer(sync_package7) def server_encerramento(self): encerra = False while not encerra: data, size = self.rx.getNData() payload, tipo, ok = self.rx.desfaz_package(data) if tipo == 7: print("recebeu tipo 7, conexao encerrada") break
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 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 comunicacao(self, data, user): data_null = (0).to_bytes(4, byteorder="big") while True: if user == "client": print("Enviada mensagem do tipo 1") self.sendData(data_null, 0, 0, 0, 1, 0) start_time1 = time.time() size = self.waitLoop(2, 1) if size != 0: print('...') rxBuffer = self.getData(size) tipo_msg = self.getType(rxBuffer) if tipo_msg == 2: print("Mensagem tipo 2 recebida") print('----------------------') time.sleep(2.5) print("Enviada mensagem do tipo 3") self.sendData(data_null, 0, 0, 0, 3, 0) time.sleep(1) self.sendPackages(data) print("Transmissao Concluida") print("Enviando Mensagem de tipo 7 (encerramento)") time.sleep(5) self.sendData(data_null, 0, 0, 0, 7, 0) break elif tipo_msg == 7: print("Mensagem de encerramento recebida - encerrando") break else: print('--------------------') print("Erro de mensagem recebida1") print('--------------------') else: print('--------------------') print("Mensagem tipo 2 não recebida") print('--------------------') if user == "server": while True: size = self.waitLoop(2, 0) rxBuffer = self.getData(size) tipo_msg = self.getType(rxBuffer) print('tipo', tipo_msg) if tipo_msg == 1: print('--------------------') print("Mensagem de tipo 1 recebida") while True: print("Enviada mensagem do tipo 2") self.sendData(data_null, 0, 0, 0, 2, 0) self.rx.clearBuffer() size = self.waitLoop(3, 1) #rxBuffer = self.getData(size) if size == 0: print('--------------------') print("Mensagem de tipo 3 não recebida") print('--------------------') else: rxBuffer = self.getData(size) tipo_msg = self.getType(rxBuffer) if tipo_msg == 3: print('--------------------') print( "Recebida mensagem de tipo 3, esperando pacote de informações" ) print('--------------------') while True: time.sleep(0.3) size = self.waitLoop(4, 0) rxBuffer = self.getData(size) tipo_msg = self.getType(rxBuffer) if tipo_msg == 7: #mensagem do tipo 7 (dados) print( "Mensagem de encerramento recebida - encerrando" ) return data_null elif tipo_msg == 4: #mensagem do tipo 4 (dados) full_data = self.receivePackages() print('Em Espera') size = self.waitLoop(9, 0) rxBuffer = self.getData(size) tipo_msg = self.getType(rxBuffer) if tipo_msg == 7: #mensagem do tipo 7 (dados) print('--------------------') print( "Mensagem de tipo 7 recebida" ) print('--------------------') print("Conexao encerrando") return full_data else: print('--------------------') print("Erro de Mensagem recebida4") print('--------------------') elif tipo_msg == 7: print( "Mensagem de encerramento recebida - encerrando" ) return data_null else: print('--------------------') print("Erro de Mensagem recebida2") print('--------------------') elif tipo_msg == 7: print("Mensagem de encerramento recebida - encerrando") return data_null else: print("Erro de mensagem recebida3") def sendData(self, data, numero_pacote, pacotes_totais, erro_pacote, tipo_msg, crc): """ Send data over the enlace interface (self, payload, package_number, total_packages, package_error, message_type) """ pacote, lenPayload = self.tx.criaPackage(data, numero_pacote, pacotes_totais, erro_pacote, tipo_msg, crc) self.tx.sendBuffer(pacote) return lenPayload def sendPackages(self, data): print("...Inicio da transmissao dos pacotes de dados...") total_packages = int((len(data) / 128) + 1) lista_packages = [] i = 0 idx = 0 info = data while len(info) > 128: pay = info[:128] info = info[128:] lista_packages.append(pay) lista_packages.append(info) #while i<(len(data)-128): # lista_packages.append(data[i:i+127]) # i+=128 #lista_packages.append(data[i:]) print('Pacotes totais:', total_packages) print("{0} pacotes a serem enviados".format(len(lista_packages))) while idx < len(lista_packages): time.sleep(1) val = lista_packages[idx] while True: print("------------------------------") print("Pacote {0} enviado".format(idx)) print("Tamanho:", len(val)) print(self.crc16(val)) self.sendData(val, idx, total_packages, 0, 4, self.crc16(val) + 1) size = self.waitLoop(5, 1) if size != 0: break else: print("Resposta nao recebida") rxBuffer = self.getData(size) tipo_msg = self.getType(rxBuffer) if tipo_msg == 5: print("Mensagem tipo 5 recebida") idx += 1 elif tipo_msg == 6: print("Mensagem tipo 6 recebida") elif tipo_msg == 8: print("Mensagem tipo 8 recebida") if self.getExpectedPackage(rxBuffer) == -1: print("Erro de Mensagem") else: idx = self.getExpectedPackage(rxBuffer) elif tipo_msg == 7: print("Mensagem de encerramento recebida - encerrando tudo") return else: print("Erro de Mensagem") print("Transmissao dos pacotes concluida") return def receivePackages(self): print("...Inicio da recepcao dos pacotes de dados...") pacote_esperado = 0 lista_packages = bytes(0) data_null = (0).to_bytes(4, byteorder="big") while True: size = self.waitLoop(9, 0) rxBuffer = self.getData(size) if rxBuffer == 51: print("Erro de mensagem") self.sendData(data_null, 0, 0, 0, 6, 0) else: pacotes_totais = rxBuffer[1] tipo_msg = self.getType(rxBuffer) if tipo_msg == 4: if self.getPackageNumber(rxBuffer) == pacote_esperado: if self.crcIsCorrect(rxBuffer): print('_____________________') print("Pacote recebido: {0}".format( self.getPackageNumber(rxBuffer))) print( "Pacote esperado: {0}".format(pacote_esperado)) print("Correto! - Mensagem de tipo 5 enviada") self.sendData(data_null, 0, 0, 0, 5, 0) package = self.getPackage(rxBuffer) print(self.crc16(package)) lista_packages += package pacote_esperado += 1 print('Pacotes a serem recebidos:', (pacotes_totais - pacote_esperado)) if pacotes_totais - pacote_esperado == 0: print("Todos os {0} pacotes recebidos".format( pacote_esperado)) full_data = lista_packages print( "Os dados recebidos tem {0} bytes".format( len(full_data))) break else: print("Pacote corrompido - CRC incorreto") time.sleep(1) print("Enviada mensagem de tipo 6") self.sendData(data_null, 0, 0, 0, 6, 0) else: print('_____________________') print("Pacote recebido: {0}".format( self.getPackageNumber(rxBuffer))) print("Pacote esperado: {0}".format(pacote_esperado)) print("Incorreto! - Mensagem de tipo 8 enviada") time.sleep(1) self.sendData(data_null, 0, 0, pacote_esperado, 8, 0) elif tipo_msg == 7: print( 'Mensagem de tipo 7 recebida - comunicacao encerrando') break print('Transmissao dos pacotes encerrada') return full_data def getData(self, size): """ Get n data over the enlace interface Return the byte array and the size of the buffer """ buffer_data = self.rx.getNData(size) data = self.rx.desfaz_package(buffer_data) return (data) def getType(self, data): #null, tipo_msg = self.rx.desfaz_package(package) if data == 51: return data tipo_msg = data[9] return tipo_msg def getPackage(self, data): if data == 51: return data package = data[10:] return package def getPackageNumber(self, data): if data == -1: return data package_number = data[0] return package_number def getExpectedPackage(self, data): if data == -1: return data expected_type = data[2] return expected_type def crcIsCorrect(self, data): expected_crc = int.from_bytes(data[6:9], byteorder="big") true_crc = self.crc16(self.getPackage(data)) if expected_crc == true_crc: return True else: return False def waitLoop(self, type, timed): size = 10 start_time1 = time.time() if timed == 1: while (self.rx.getBufferLen() == 0 or self.rx.getBufferLen() > size ) and (time.time() - start_time1) < 5: if (type == 9): print('.') else: print("Esperando tipo {0}".format(type)) time.sleep(0.5) size = self.rx.getBufferLen() if timed == 0: while self.rx.getBufferLen() == 0 or self.rx.getBufferLen() > size: print("Recebendo") time.sleep(0.3) size = self.rx.getBufferLen() return size def crc16(self, data: bytes): return crc16.crc16xmodem(data)