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():
    """
       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 == Ontologia.Peticion_Transporte:
                logger.info("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 == Ontologia.Peticion_Recomendados:
                logger.info("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 counter_offer(offer):
    logger.info('Asking counter-offer to ' + offer.address)
    gr = Graph()
    subject = Ontologia['contra-oferta']
    gr.add((subject, RDF.type, Ontologia.Contraoferta))
    new_price = offer.price - 2
    gr.add((subject, Ontologia.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 = Ontologia['peticion-oferta']
    gr.add((subject, RDF.type, Ontologia.Pedir_oferta_transporte))
    gr.add((subject, Ontologia.Destino, Literal(destino)))
    gr.add((subject, Ontologia.Plazo_maximo_entrega, Literal(fecha)))
    gr.add((subject, Ontologia.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'], Ontologia.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 == Ontologia.Peticion_retorno:
                logger.info(
                    "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=Ontologia.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
Exemple #7
0
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)

        # 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
    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)