def acceptOffer(offer): resp = send_message( build_message(Graph(), ACL['accept-proposal'], sender=AgenteNegociador.uri), offer.address) msg = get_message_properties(resp) return msg['performative'] == ACL.inform
def comunicacion(): global dsgraph global mss_cnt gr = None logger.info('Peticion de info recibida') # Extraemos el mensaje que nos envian mensaje = request.args['content'] gm = Graph() gm.parse(data=mensaje) msgdic = get_message_properties(gm) # Comprobacion del mensaje if msgdic is None: gr = build_message(Graph(), ACL['no_entendido'], sender=AgenteComprador.uri, msgcnt=get_n_message()) else: performative = msgdic['performative'] if performative != ACL.request: gr = build_message(Graph(), ACL['no_entendido'], sender=AgenteComprador.uri, msgcnt=get_n_message()) else: content = msgdic['content'] accion = gm.value(subject=content, predicate=RDF.type) logger.info('Recibida una petición en AgenteComprador') print('Recibida una petición en AgenteComprador') if accion == ECSDI.Peticion_compra: logger.info('Recibida peticion compra') compra = None for item in gm.subjects(RDF.type, ECSDI.Compra): compra = item gm.remove((content, None, None)) for item in gm.subjects(RDF.type, ACL.FipaAclMessage): gm.remove((item, None, None)) registerSells(gm) payDelivery(compra) logger.info('Envio la factura de la venda con id ' + compra + 'al usuario comprador.') gr = sendSell(gm, compra) logger.info('Respondemos a la peticion') return gr.serialize(format='xml'), 200 pass
def comunicacion(): global dsgraph global mss_cnt gr = None logger.info('Peticion de recomendacion recibida') # Extraemos el mensaje que nos envian mensaje = request.args['content'] gm = Graph() gm.parse(data=mensaje) msgdic = get_message_properties(gm) #Comprobacion del mensaje if msgdic is None: gr = build_message(Graph(), ACL['no_entendido'], sender=AgenteValoraciones.uri, msgcnt=get_count()) else: performative = msgdic['performative'] if performative != ACL.request: gr = build_message(Graph(), ACL['no_entendido'], sender=AgenteValoraciones.uri, msgcnt=get_count()) else: content = msgdic['content'] accion = gm.value(subject=content, predicate=RDF.type) if accion == ECSDI.Peticion_Valorados: get_all_sells() if compras.__len__() == 0: g = Graph() serialize = g.serialize(format='xml') return serialize, 200 gr = findValProducts() logger.info('Respondemos a la peticion') print('Respondemos a la peticion') serialize = gr.serialize(format='xml') return serialize, 200 elif accion == ECSDI.Peticion_valorar: print('Valoramos los productos') for item in gm.subjects(RDF.type, ACL.FipaAclMessage): gm.remove((item, None, None)) for item in gm.subjects(RDF.type, ECSDI.Peticion_valorar): gm.remove((item, None, None)) guardarValoraciones(gm) serialize = gm.serialize(format='xml') return serialize, 200
def comunicacion(): """ Entrypoint de comunicacion del agente """ message = request.args['content'] gm = Graph() gm.parse(data=message) msgdic = get_message_properties(gm) # Comprobamos que sea un mensaje FIPA ACL if not msgdic: # Si no es, respondemos que no hemos entendido el mensaje gr = build_message(Graph(), ACL['not-understood'], sender=ExternalTransportAgent1.uri, msgcnt=mss_cnt) else: if msgdic['performative'] == ACL['accept-proposal']: logger.info('Nuestra oferta ha sido aceptada') print('Nuestra oferta ha sido aceptada') return build_message( Graph(), perf=ACL.inform, sender=ExternalTransportAgent1.uri).serialize() if msgdic['performative'] == ACL['reject-proposal']: logger.info('La oferta ha sido rechazada') print('La oferta ha sido rechazada') ExternalTransportAgent1.reset() return build_message( Graph(), perf=ACL.inform, sender=ExternalTransportAgent1.uri).serialize() if msgdic['performative'] == ACL['counter-proposal']: logger.info('Transporte 1 recibe una contraoferta') print('Transporte 1 recibe una contraoferta') return counterproposal(gm, msgdic['content']).serialize() if msgdic['performative'] == ACL['call-for-proposal']: logger.info('Tranporte 1 recibe una solicitud de propuestas') print('Transporte 1 recibe una solicitud de propuestas') return proposal(gm, msgdic['content']).serialize() else: # Extraemos el objeto del contenido que ha de ser una accion de la ontologia # de registro return build_message( Graph(), ACL['not-understood'], sender=ExternalTransportAgent1.uri).serialize() return
def comunicacion(): """ Communication Entrypoint """ logger.info('Peticion de informacion recibida') global dsGraph message = request.args['content'] gm = Graph() gm.parse(data=message) msgdic = get_message_properties(gm) if msgdic is None: # Si no es, respondemos que no hemos entendido el mensaje gr = build_message(Graph(), ACL['not-understood'], sender=AgenteNegociador.uri, msgcnt=get_count()) else: # Obtenemos la performativa if msgdic['performative'] != ACL.request: # Si no es un request, respondemos que no hemos entendido el mensaje gr = build_message(Graph(), ACL['not-understood'], sender=DirectoryAgent.uri, msgcnt=get_count()) else: # Extraemos el objeto del contenido que ha de ser una accion de la ontologia # de registro content = msgdic['content'] # Averiguamos el tipo de la accion accion = gm.value(subject=content, predicate=RDF.type) # Accion de busqueda if accion == ECSDI.Peticion_Transporte: logger.info("Negociamos con los transportistas") print("Negociamos con los transportistas") respondePeticion(gm, content) gr = Graph() # No habia ninguna accion en el mensaje else: gr = build_message(Graph(), ACL['not-understood'], sender=DirectoryAgent.uri, msgcnt=get_count()) logger.info('Respondemos a la peticion') return gr.serialize(format='xml')
def comunicacion(): global dsgraph global mss_cnt gr = None logger.info('Peticion de recomendacion recibida') # Extraemos el mensaje que nos envian mensaje = request.args['content'] gm = Graph() gm.parse(data=mensaje) msgdic = get_message_properties(gm) #Comprobacion del mensaje if msgdic is None: gr = build_message(Graph(), ACL['no_entendido'], sender=AgenteRecomendador.uri, msgcnt=get_count()) else: performative = msgdic['performative'] if performative != ACL.request: gr = build_message(Graph(), ACL['no_entendido'], sender=AgenteRecomendador.uri, msgcnt=get_count()) else: content = msgdic['content'] accion = gm.value(subject=content, predicate=RDF.type) if accion == ECSDI.Peticion_Recomendados: logger.info("Enviamos una serie de productos recomendados") print("Enviamos una serie de productos recomendados") compras = get_all_sells() if compras.__len__() == 0: gr = Graph() serialize = gr.serialize(format='xml') return serialize, 200 gr = findRecProducts(compras) logger.info('Respondemos a la peticion') serialize = gr.serialize(format='xml') return serialize, 200
def comunicacion(): global dsgraph global mss_cnt gr = None logger.info('Peticion de info recibida') # Extraemos el mensaje que nos envian mensaje = request.args['content'] gm = Graph() gm.parse(data=mensaje) msgdic = get_message_properties(gm) # Comprobacion del mensaje if msgdic is None: gr = build_message(Graph(), ACL['no_entendido'], sender=AgentePublicador.uri, msgcnt=get_count()) else: performative = msgdic['performative'] if performative != ACL.request: gr = build_message(Graph(), ACL['no_entendido'], sender=AgentePublicador.uri, msgcnt=get_count()) else: content = msgdic['content'] accion = gm.value(subject=content, predicate=RDF.type) # Aqui realizariamos lo que pide la accion if accion == ECSDI.Registrar_productos: gr = recordExternalProduct(gm) logger.info('Respondemos a la peticion') print('Productos externos publicados') return gr.serialize(format='xml'), 200 pass
def counter_offer(offer): logger.info('Asking counter-offer to ' + offer.address) gr = Graph() subject = ECSDI['contra-oferta'] gr.add((subject, RDF.type, ECSDI.Contraoferta)) new_price = offer.price - 2 gr.add((subject, ECSDI.Precio_envio, Literal(new_price))) resp = send_message(build_message(gr, ACL['counter-proposal'], content=subject, sender=AgenteNegociador.uri), offer.address) msg = get_message_properties(resp) if 'performative' not in msg or msg['performative'] == ACL.refuse: logger.warn('An agent rejected us :(') return None elif msg['performative'] == ACL.agree: return Offer(address=offer.address, price=new_price) else: logger.error('I can\'t understand:(') return None
def requestOffer(agent, peso, fecha, destino): gr = Graph() subject = ECSDI['peticion-oferta'] gr.add((subject, RDF.type, ECSDI.Pedir_oferta_transporte)) gr.add((subject, ECSDI.Destino, Literal(destino))) gr.add((subject, ECSDI.Plazo_maximo_entrega, Literal(fecha))) gr.add((subject, ECSDI.Peso_envio, Literal(peso))) resp = send_message(build_message(gr, ACL['call-for-proposal'], content=subject, receiver=agent.uri, sender=AgenteNegociador.uri), agent.address) msg = get_message_properties(resp) if 'performative' not in msg or msg['performative'] == ACL.refuse: logger.warn('Nos ha rechazado un agente') return None elif msg['performative'] == ACL.propose: precio = resp.value(msg['content'], ECSDI.Precio_envio) return Offer(address=agent.address, price=precio.toPython()) logger.error('No se entiende') return None
def comunicacion(): global dsgraph global mss_cnt gr = None logger.info('Peticion de info recibida') # Extraemos el mensaje que nos envian mensaje = request.args['content'] gm = Graph() gm.parse(data=mensaje) msgdic = get_message_properties(gm) # Comprobacion del mensaje if msgdic is None: gr = build_message(Graph(), ACL['no_entendido'], sender=AgenteDevoluciones.uri, msgcnt=get_count()) else: performative = msgdic['performative'] if performative != ACL.request: gr = build_message(Graph(), ACL['no_entendido'], sender=AgenteDevoluciones.uri, msgcnt=get_count()) else: content = msgdic['content'] accion = gm.value(subject=content, predicate=RDF.type) # peticion de devolucion if accion == ECSDI.Peticion_retorno: logger.info( "Recibida una peticion de retorno en AgenteDevoluciones") print("Recibida una peticion de retorno en AgenteDevoluciones") for item in gm.subjects(RDF.type, ACL.FipaAclMessage): gm.remove((item, None, None)) venta = [] for item in gm.objects(subject=content, predicate=ECSDI.CompraRetornada): venta.append(item) payDelivery() gm.remove((content, None, None)) gr = returnSell(gm, venta) else: gr = build_message(Graph(), ACL['not-understood'], sender=DirectoryAgent.uri, msgcnt=get_count()) logger.info('Respondemos a la peticion') serialize = gr.serialize(format='xml') return serialize, 200
def register(): """ Entry point del agente que recibe los mensajes de registro La respuesta es enviada al retornar la funcion, no hay necesidad de enviar el mensaje explicitamente Asumimos una version simplificada del protocolo FIPA-request en la que no enviamos el mesaje Agree cuando vamos a responder :return: """ def process_register(): # Si la hay extraemos el nombre del agente (FOAF.Name), el URI del agente # su direccion y su tipo logger.info('Peticion de registro') agn_add = gm.value(subject=content, predicate=DSO.Address) agn_name = gm.value(subject=content, predicate=FOAF.name) agn_uri = gm.value(subject=content, predicate=DSO.Uri) agn_type = gm.value(subject=content, predicate=DSO.AgentType) # Añadimos la informacion en el grafo de registro vinculandola a la URI # del agente y registrandola como tipo FOAF.Agent dsgraph.add((agn_uri, RDF.type, FOAF.Agent)) dsgraph.add((agn_uri, FOAF.name, agn_name)) dsgraph.add((agn_uri, DSO.Address, agn_add)) dsgraph.add((agn_uri, DSO.AgentType, agn_type)) logger.info('Registrado agente: ' + agn_name + ' - tipus:' + agn_type) # Generamos un mensaje de respuesta return build_message(Graph(), ACL.confirm, sender=DirectoryAgent.uri, receiver=agn_uri, msgcnt=mss_cnt) def process_search(): # Asumimos que hay una accion de busqueda que puede tener # diferentes parametros en funcion de si se busca un tipo de agente # o un agente concreto por URI o nombre # Podriamos resolver esto tambien con un query-ref y enviar un objeto de # registro con variables y constantes # Solo consideramos cuando Search indica el tipo de agente # Buscamos una coincidencia exacta # Retornamos el primero de la lista de posibilidades logger.info('Peticion de busqueda') agn_type = gm.value(subject=content, predicate=DSO.AgentType) rsearch = dsgraph.triples((None, DSO.AgentType, agn_type)) if rsearch is not None: agn_uri = rsearch.next()[0] agn_add = dsgraph.value(subject=agn_uri, predicate=DSO.Address) agn_name = dsgraph.value(subject=agn_uri, predicate=FOAF.name) gr = Graph() gr.bind('dso', DSO) rsp_obj = agn['Directory-response'] gr.add((rsp_obj, DSO.Address, agn_add)) gr.add((rsp_obj, DSO.Uri, agn_uri)) gr.add((rsp_obj, FOAF.name, agn_name)) return build_message(gr, ACL.inform, sender=DirectoryAgent.uri, msgcnt=mss_cnt, receiver=agn_uri, content=rsp_obj) else: # Si no encontramos nada retornamos un inform sin contenido return build_message(Graph(), ACL.inform, sender=DirectoryAgent.uri, msgcnt=mss_cnt) global dsgraph global mss_cnt # Extraemos el mensaje y creamos un grafo con él message = request.args['content'] gm = Graph() gm.parse(data=message) msgdic = get_message_properties(gm) # Comprobamos que sea un mensaje FIPA ACL if not msgdic: # Si no es, respondemos que no hemos entendido el mensaje gr = build_message(Graph(), ACL['not-understood'], sender=DirectoryAgent.uri, msgcnt=mss_cnt) else: # Obtenemos la performativa if msgdic['performative'] != ACL.request: # Si no es un request, respondemos que no hemos entendido el mensaje gr = build_message(Graph(), ACL['not-understood'], sender=DirectoryAgent.uri, msgcnt=mss_cnt) else: # Extraemos el objeto del contenido que ha de ser una accion de la ontologia # de registro content = msgdic['content'] # Averiguamos el tipo de la accion accion = gm.value(subject=content, predicate=RDF.type) # Accion de registro if accion == DSO.Register: gr = process_register() # Accion de busqueda elif accion == DSO.Search: gr = process_search() # No habia ninguna accion en el mensaje else: gr = build_message(Graph(), ACL['not-understood'], sender=DirectoryAgent.uri, msgcnt=mss_cnt) mss_cnt += 1 return gr.serialize(format='xml')
def rejectOffer(offer): resp = send_message( build_message(Graph(), ACL['reject-proposal'], sender=AgenteNegociador.uri), offer.address) msg = get_message_properties(resp)
def comunicacion(): global dsgraph global mss_cnt gr = None logger.info('Peticion de info recibida') # Extraemos el mensaje que nos envian mensaje = request.args['content'] gm = Graph() gm.parse(data=mensaje) msgdic = get_message_properties(gm) #Comprobacion del mensaje if msgdic is None: gr = build_message(Graph(), ACL['no_entendido'], sender=AgenteBuscador.uri, msgcnt=get_count()) else: performative = msgdic['performative'] if performative != ACL.request: gr = build_message(Graph(), ACL['no_entendido'], sender=AgenteBuscador.uri, msgcnt=get_count()) else: content = msgdic['content'] accion = gm.value(subject=content, predicate=RDF.type) if accion == ECSDI.Peticion_Busqueda: logger.info( 'Agente Buscador recibe una peticion de búsqueda, la tratamos' ) print( 'Agente Buscador recibe una peticion de búsqueda, la tratamos' ) restricciones = gm.objects(content, ECSDI.Restricciones) restricciones_vec = {} for restriccion in restricciones: if gm.value(subject=restriccion, predicate=RDF.type) == ECSDI.Restriccion_Marca: marca = gm.value(subject=restriccion, predicate=ECSDI.Marca) logger.info('MARCA: ' + marca) restricciones_vec['brand'] = marca elif gm.value( subject=restriccion, predicate=RDF.type) == ECSDI.Restriccion_modelo: modelo = gm.value(subject=restriccion, predicate=ECSDI.Modelo) logger.info('MODELO: ' + modelo) restricciones_vec['modelo'] = modelo elif gm.value(subject=restriccion, predicate=RDF.type) == ECSDI.Rango_precio: preu_max = gm.value(subject=restriccion, predicate=ECSDI.Precio_max) preu_min = gm.value(subject=restriccion, predicate=ECSDI.Precio_min) if preu_min: logger.info('Preu minim: ' + preu_min) restricciones_vec['min_price'] = preu_min.toPython( ) if preu_max: logger.info('Preu maxim: ' + preu_max) restricciones_vec['max_price'] = preu_max.toPython( ) gr = findProducts(**restricciones_vec) logger.info('Respondemos a la peticion') serialize = gr.serialize(format='xml') return serialize, 200
def comunicacion(): """ Entrypoint de comunicacion del agente Simplemente retorna un objeto fijo que representa una respuesta a una busqueda de hotel Asumimos que se reciben siempre acciones que se refieren a lo que puede hacer el agente (buscar con ciertas restricciones, reservar) Las acciones se mandan siempre con un Request Prodriamos resolver las busquedas usando una performativa de Query-ref """ global dsgraph global mss_cnt logger.info('Peticion de informacion recibida') # Extraemos el mensaje y creamos un grafo con el message = request.args['content'] gm = Graph() gm.parse(data=message) msgdic = get_message_properties(gm) # Comprobamos que sea un mensaje FIPA ACL if msgdic is None: # Si no es, respondemos que no hemos entendido el mensaje gr = build_message(Graph(), ACL['not-understood'], sender=InfoAgent.uri, msgcnt=mss_cnt) else: # Obtenemos la performativa perf = msgdic['performative'] if perf != ACL.request: # Si no es un request, respondemos que no hemos entendido el mensaje gr = build_message(Graph(), ACL['not-understood'], sender=InfoAgent.uri, msgcnt=mss_cnt) else: # Extraemos el objeto del contenido que ha de ser una accion de la ontologia de acciones del agente # de registro # Averiguamos el tipo de la accion if 'content' in msgdic: content = msgdic['content'] accion = gm.value(subject=content, predicate=RDF.type) # Aqui realizariamos lo que pide la accion # Por ahora simplemente retornamos un Inform-done gr = build_message( Graph(), ACL['inform-done'], sender=InfoAgent.uri, msgcnt=mss_cnt, receiver=msgdic['sender'], ) mss_cnt += 1 logger.info('Respondemos a la peticion') return gr.serialize(format='xml')
def communication(): global dsgraph gr = None logger.info('Peticion de informacion recibida') # Extraemos el mensaje y creamos un grafo con el message = request.args['content'] gm = Graph() gm.parse(data=message) msgdic = get_message_properties(gm) # Comprobamos que sea un mensaje FIPA ACL if msgdic is None: # Si no es, respondemos que no hemos entendido el mensaje gr = build_message(Graph(), ACL['not-understood'], sender=AgenteCentroLogistico.uri, msgcnt=get_n_message()) else: # Obtenemos la performativa perf = msgdic['performative'] if perf != ACL.request: # Si no es un request, respondemos que no hemos entendido el mensaje gr = build_message(Graph(), ACL['not-understood'], sender=AgenteCentroLogistico.uri, msgcnt=get_n_message()) else: # Extraemos el objeto del contenido que ha de ser una accion de la ontologia de acciones del agente # de registro # Averiguamos el tipo de la accion content = msgdic['content'] accion = gm.value(subject=content, predicate=RDF.type) # Aqui realizariamos lo que pide la accion if accion == ECSDI.Enviar_venta: logger.info('Recibimos la peticion para enviar la venta') print('Recibimos la peticion para enviar la venta') products = obtainProducts(gm) gr = create_and_sendProducts(products) elif accion == ECSDI.Recoger_devolucion: logger.info( 'Recibimos la peticion de recoger la devolucion, para ello contratamos un envio' ) print( 'Recibimos la peticion de recoger la devolucion, para ello contratamos un envio' ) date = dateToMillis(datetime.datetime.utcnow() + datetime.timedelta(days=9)) for item in gm.objects(subject=content, predicate=ECSDI.compra_a_devolver): peso = crearEnvio(item, date) requestTransport(date, peso) logger.info('Eliminamos la venta de nuestro registro') ventas = Graph() ventas.parse(open('../Datos/Compras'), format='turtle') ventas.remove((item, None, None)) ventas.serialize(destination='../Datos/Compras', format='turtle') gr = Graph() else: gr = build_message(Graph(), ACL['not-understood'], sender=DirectoryAgent.uri, msgcnt=get_n_message()) logger.info('Respondemos a la peticion') return gr.serialize(format='xml'), 200 pass