def acceptOffer(offer): resp = send_message( build_message(Graph(), ACL['accept-proposal'], sender=TransportDealerAgent.uri), offer.address) msg = get_message_properties(resp) return msg['performative'] == ACL.inform
def communication(): """ 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=QualifierAgent.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.todo_accion: # TODO Tratar accion deseada return # 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(): """ 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=ExternalTransportAgent2.uri, msgcnt=mss_cnt) else: if msgdic['performative'] == ACL['accept-proposal']: logger.info('YEAH! Our offer has been acccepted! :D') return build_message( Graph(), perf=ACL.inform, sender=ExternalTransportAgent2.uri).serialize() if msgdic['performative'] == ACL['reject-proposal']: logger.info('Our offer has been rejected!') ExternalTransportAgent2.reset() return build_message( Graph(), perf=ACL.inform, sender=ExternalTransportAgent2.uri).serialize() if msgdic['performative'] == ACL['counter-proposal']: logger.info('Ask for counter proposal!') return counterproposal(gm, msgdic['content']).serialize() if msgdic['performative'] == ACL['call-for-proposal']: logger.info('Ask for proposal!') 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=ExternalTransportAgent2.uri).serialize() return
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=TransportDealerAgent.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=TransportDealerAgent.uri), agent.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.propose: precio = resp.value(msg['content'], ECSDI.Precio_envio) return Offer(address=agent.address, price=precio.toPython()) logger.error('I can\'t understand:(') return None
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('YEAH! Our offer has been acccepted! :D') return build_message(Graph(), perf=ACL.inform, sender=ExternalTransportAgent1.uri).serialize() if msgdic['performative'] == ACL['reject-proposal']: logger.info('Our offer has been rejected!') ExternalTransportAgent1.reset() return build_message(Graph(), perf=ACL.inform, sender=ExternalTransportAgent1.uri).serialize() if msgdic['performative'] == ACL['counter-proposal']: return counterproposal(gm, msgdic['content']).serialize() if msgdic['performative'] == ACL['call-for-proposal']: logger.info('Ask for proposal!') 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 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=TransportDealerAgent.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=TransportDealerAgent.uri), agent.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.propose: precio = resp.value(msg['content'], ECSDI.Precio_envio) return Offer(address=agent.address, price=precio.toPython()) logger.error('I can\'t understand:(') return None
def communication(): """ Communication Entrypoint """ logger.info('Peticion de informacion recibida') global dsGraph gr = None 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=LogisticHubAgent.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 disponibilidad if accion == ECSDI.Pedir_disponibilidad: gm.remove((content, None, None)) for item in gm.subjects(RDF.type, ACL.FipaAclMessage): gm.remove((item, None, None)) gr = gm logger.info('Productos disponibles') elif accion == ECSDI.Enviar_lot: logger.info('Se envia el lote de productos') gm.remove((content, None, None)) for item in gm.subjects(RDF.type, ACL.FipaAclMessage): gm.remove((item, None, None)) for item in gm.subjects(RDF.type, ECSDI.Existencia): gm.remove((item, None, None)) for item in gm.subjects(RDF.type, ECSDI.Pedir_disponibilidad): gm.remove((item, None, None)) date = dateToMillis(datetime.datetime.utcnow() + datetime.timedelta(days=9)) urlSend = writeSends(gm, date) peso = obtainTotalWeight(urlSend) requestTransport(date, peso) gr = prepareSellResponse(urlSend) elif accion == ECSDI.Recoger_venta: logger.info('Rep la venda a retornar del financial agent') date = dateToMillis(datetime.datetime.utcnow() + datetime.timedelta(days=9)) for item in gm.objects(subject=content, predicate=ECSDI.compra_a_retornar): peso = createSend(item, date) requestTransport(date, peso) removeSell(item) 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'), 200
def communication(): """ 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=BankAgent.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: # 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=BankAgent.uri, msgcnt=get_count()) else: # Extraemos el objeto del contenido que ha de ser una accion de la ontologia de acciones del agente # de registro content = msgdic['content'] # Averiguamos el tipo de la accion accion = gm.value(subject=content, predicate=RDF.type) # Accion de transferencia if accion == ECSDI.Peticion_transferencia: # Content of the message for item in gm.subjects(RDF.type, ACL.FipaAclMessage): gm.remove((item, None, None)) gr = gm logger.info('Se acepta la transferencia') # 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'), 200
def rejectOffer(offer): resp = send_message(build_message(Graph(), ACL['reject-proposal'], sender=TransportDealerAgent.uri), offer.address) msg = get_message_properties(resp)
def acceptOffer(offer): resp = send_message(build_message(Graph(), ACL['accept-proposal'], sender=TransportDealerAgent.uri), offer.address) msg = get_message_properties(resp) return msg['performative'] == ACL.inform
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)) logger.info("Agente encontrado: " + 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 communication(): """ Communication Entrypoint """ global dsGraph logger.info('Peticion de informacion recibida') message = request.args['content'] gm = Graph() gm.parse(data=message) msgdic = get_message_properties(gm) gr = None if msgdic is None: # Si no es, respondemos que no hemos entendido el mensaje gr = build_message(Graph(), ACL['not-understood'], sender=FinancialAgent.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 enviar venta if accion == ECSDI.Vull_comprar: gm.remove((content, None, None)) for item in gm.subjects(RDF.type, ACL.FipaAclMessage): gm.remove((item, None, None)) sell = None for item in gm.subjects(RDF.type, ECSDI.Compra): sell = item registerSells(gm) payDelivery(sell) deliverReceipt(sell) gr = sendSell(gm, sell) # Accion de retorno elif accion == ECSDI.Peticion_retorno: for item in gm.subjects(RDF.type, ACL.FipaAclMessage): gm.remove((item, None, None)) sell = [] for item in gm.objects(subject=content, predicate=ECSDI.CompraRetornada): sell.append(item) for item in sell: payDelivery(item) gm.remove((content, None, None)) gr = returnSell(gm, sell) # Ninguna accion a realizar 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'), 200
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=ProductsAgent.uri, msgcnt=get_count()) 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=ProductsAgent.uri, msgcnt=get_count()) 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.Registra_productes: gr = recordExternalProduct(gm) elif accion == ECSDI.Enviar_venta: logger.info("Recibe comunicación del FinancialAgent") products = obtainProducts(gm) requestAvailability(products) products = obtainProducts(gm) gr = sendProducts(products) # 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'), 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)) gr = Graph() gr.bind('dso', DSO) bag = BNode() gr.add((bag, RDF.type, RDF.Bag)) i = 0 for agn_uri in rsearch: agn_add = dsgraph.value(subject=agn_uri[0], predicate=DSO.Address) agn_name = dsgraph.value(subject=agn_uri[0], predicate=FOAF.name) rsp_obj = agn['Directory-response' + str(i)] gr.add((rsp_obj, DSO.Address, agn_add)) gr.add((rsp_obj, DSO.Uri, agn_uri[0])) gr.add((rsp_obj, FOAF.name, agn_name)) gr.add((bag, URIRef(u'http://www.w3.org/1999/02/22-rdf-syntax-ns#_' + str(i)), rsp_obj)) i += 1 logger.info("Agente encontrado: " + agn_name) if rsearch is not None: return build_message(gr, ACL.inform, sender=DirectoryAgent.uri, msgcnt=mss_cnt, content=bag) 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=TransportDealerAgent.uri), offer.address) msg = get_message_properties(resp)