diff --git a/aa.py b/aa.py new file mode 100755 index 0000000000000000000000000000000000000000..b2a0c3c83310695604bad700a37e7fe039c80f13 --- /dev/null +++ b/aa.py @@ -0,0 +1,245 @@ +#!/usr/bin/env python +#################### Protocol ################################################################# +# Marca - Tipo - Destino - Origem - Prioridade - Tamanho - Inic MSG - Mensagem - Fim MSG - CRC# +############################################################################################### + +#Marca - 1 Byte Marca inicio de transmissao, inicio de msg fim de msg +#Tipo - 0 Token, 1 - Msg, 2 - ACK, 3 - NACK +#Destino - pode variar de 1 a 4 +#Origem - pode variar de 1 a 4 +#Prioridade - pode variar de 0 a 7 +#Tamanho - tanto faz +#Marca (inicio msg) - 1 Byte +#Mensagem +#CRC - 8 bytes + +#Exemplo msg# +#~11313~oie~352D1036 +# ~ - inic transmissao +# 1 - tipo da mensagem +# 1 - destino da mensagem +# 3 - origem da mensagem +# 1 - prioridade da mensagem +# 3 - tamanho da string da mensagem +# ~ - delimitador de inicio da mensagem +# oie - mensagem +# ~ - delimitador de fim da mensagem +# 352D1036 - CRC + +import socket +import threading +import sys +import binascii +import time +import Queue + +global TOKEN +global StartTime +global HighPriority +global RECEBIDA +RECEBIDA = 1 +StartTime = 0 +HighPriority = 10 +TOKEN = 0 +SEND_PORT = 3131 # Porta que o Servidor envia +RECV_PORT = 3131 # Porta que o Servidor recebe + +class Protocol(): + + def __init__ (self): + self.marca = "~" #Marca + self.type = str(1) #Alterar Depois + self.destiny = str(0) + self.origin = str(MACHINE_ID) + self.priority = str(0) + self.msg = str(0) + self.sizemsg = str(0) + self.crc = str(0) + + #set destiny message + def setDestiny(self): + sys.stdout.write('Destino: ') + self.destiny = raw_input() + while (0 >= int(self.destiny)) or (int(self.destiny) >= 5): + print 'Entrada Invalida, Por favor escolha entre 1 a 4' + sys.stdout.write('Destino: ') + self.destiny = raw_input() + self.destiny = str(self.destiny) + + #set Priority messsage + def setPriority(self): + sys.stdout.write('Prioridade: ') + self.priority = raw_input() + while (0 >= int(self.priority)) or (int(self.priority) >= 8): + print 'Entrada Invalida, Por favor escolha entre 1 a 7' + sys.stdout.write('Prioridade: ') + self.priority = raw_input() + self.priority = 7 - int(self.priority) + + def setType (self): + if (self.msg == 'token'): + self.type = str(0) + else: + self.type = str(1) + + #set message + def setMessage(self): + sys.stdout.write('Mensagem: ') + self.msg = raw_input() + + #set sizeof message + def setSizeof (self): + self.sizemsg = len(self.msg) + self.sizemsg = str(self.sizemsg) #String convert + + #set CRC32 + def setCRC32(self): + buff = (binascii.crc32(self.msg) & 0xFFFFFFFF) + self.crc = "%08X" % buff + + def getEmpacotar(self): + return self.marca + self.type + self.destiny + self.origin + str(self.priority) + self.sizemsg + self.marca + self.msg + self.marca + self.crc + + def setDesempacota(self, msg): + self.marca = msg[0] + self.type = msg[1] + self.destiny = int(msg[2]) + self.origin = msg[3] + self.priority = msg[4] + self.msg = msg.split('~', 3)[2] + self.crc = msg.split('~', 3)[3] + + def getCRC32(self): + buff = (binascii.crc32(self.msg) & 0xFFFFFFFF) + return "%08X" % buff + + +def token (): + global TOKEN + global StartTime + global queue + global RECEBIDA + udp = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + tokenMessage = Protocol() + dest = (HOST, SEND_PORT) + while True: + EndTime = time.time() + if (EndTime - StartTime >= 2 and TOKEN == 1): + print 'MANDEI O TOKEN' + TOKEN = 0 + tokenMessage.type = str(0) + msg = tokenMessage.getEmpacotar() + udp.sendto (msg,dest) + #time.sleep(2) + if (TOKEN == 1): + #print 'ESTOU COM O TOKEN' + if (not queue.empty()): + msg = queue.get () + udp.sendto (msg[1], dest) + print 'ENVIANDO' + time.sleep(1) + while (RECEBIDA == 0): + print 'ENVIANDO NOVAMENTE A MSG' + udp.sendto (msg[1], dest) + time.sleep(1) + udp.close() + +def client (): + try: + global TOKEN + global HighPriority + protocolMessage = Protocol() + global queue + queue = Queue.PriorityQueue() + while True: + protocolMessage.setDestiny() + protocolMessage.setPriority() + protocolMessage.setMessage() + protocolMessage.type = str(1) + protocolMessage.setSizeof() + protocolMessage.setCRC32() + msg = protocolMessage.getEmpacotar() + queue.put ((protocolMessage.priority, msg)) + if (not queue.empty()): + HighPriority = queue.queue[0] + threadServer._Thread__stop() + threadToken._Thread__stop() + except: + print 'OPS, ALGO OCORREU ERRADO' + threadServer._Thread__stop() + threadToken._Thread__stop() + +def server (): + global TOKEN + global StartTime + global RECEBIDA + udp = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + orig = ('', RECV_PORT) + dest = (HOST, SEND_PORT) + udp.bind(orig) + protocolDescompactMessage = Protocol() + + while True: + msg, cliente = udp.recvfrom(1024) + protocolDescompactMessage.setDesempacota(msg) + + #A msg foi enviada com sucesso + if (msg[1] == '2' and int(MACHINE_ID) == int(protocolDescompactMessage.destiny)): + print 'A MENSAGEM FOI ENVIADA COM SUCESSO' + RECEBIDA = 1 + + #Erro no envio + elif (msg[1] == '3' and int(MACHINE_ID) == int(protocolDescompactMessage.destiny)): + RECEBIDA = 0 + + #A msg e pra mim + elif (msg[1] == '1' and int(MACHINE_ID) == int(protocolDescompactMessage.destiny)): + #protocolDescompactMessage.crc = "8888888"#caga tdo + if (protocolDescompactMessage.crc == protocolDescompactMessage.getCRC32()): + print '\n' + protocolDescompactMessage.origin + ' Escreveu: ' + protocolDescompactMessage.msg + + #envia ack + protocolDescompactMessage.type = str(2) + protocolDescompactMessage.destiny = protocolDescompactMessage.origin + msg = protocolDescompactMessage.getEmpacotar() + udp.sendto (msg, dest) + else: + print 'ERRO DE MENSAGEM' + + #envia nack + protocolDescompactMessage.type = str(3) + protocolDescompactMessage.destiny = protocolDescompactMessage.origin + msg = protocolDescompactMessage.getEmpacotar() + udp.sendto (msg, dest) + + #A msg n e pra mim + elif (msg[1] == '1' or msg[2] == '2' or msg[3] == '3'): + udp.sendto (msg, dest) + + #Recebi o token + if (protocolDescompactMessage.type == '0' and TOKEN == 0): + print 'RECEBI O TOKEN' + TOKEN = 1 + StartTime = time.time() + + + udp.close() + +#------------------MAIN-----------------# + +if len(sys.argv) > 1: + TOKEN = 1 + print 'COMECEI COM O TOKEN' + StartTime = time.time() +print 'ID Dessa maquina, escolha entre 1 e 4' +MACHINE_ID = raw_input () +print "Ip da proxima maquina" +HOST = raw_input() +if TOKEN == 1: + StartTime = time.time() +threadServer = threading.Thread(target=server) +threadClient = threading.Thread(target=client) +threadToken = threading.Thread(target=token) +threadServer.start() +threadClient.start() +threadToken.start()