Beispiel #1
0
def register_message(agentSender, directoryAgent, agentType):
    """
	Envia un mensaje de registro al servicio de registro
	usando una performativa Request y una accion Register del
	servicio de directorio

	:param gmess:
	:return:
	"""
    gmess = Graph()
    # Construimos el mensaje de registro. Anadimos las ontologias FOAF y DSO que aunque no son
    # necesarias para nuestro contexto, se pueden utilizar.
    gmess.bind('foaf', FOAF)
    gmess.bind('dso', DSO)
    #el reg_obj sirve como nodo sujeto de todos los atributos de la comunicacion
    reg_obj = createAction(agentSender, 'register')
    #Anadimos los atributos de la comunicacion. La accion es de registro por lo que mandamos nuestros datos
    gmess.add((reg_obj, RDF.type, DSO.Register))
    gmess.add((reg_obj, DSO.Uri, agentSender.uri))
    gmess.add((reg_obj, FOAF.Name, Literal(agentSender.name)))
    gmess.add((reg_obj, DSO.Address, Literal(agentSender.address)))
    gmess.add((reg_obj, DSO.AgentType, agentType))

    # Lo metemos en un envoltorio FIPA-ACL y lo enviamos al directorio
    gr = send_message(
        build_message(gmess,
                      perf=ACL.request,
                      sender=agentSender.uri,
                      receiver=directoryAgent.uri,
                      content=reg_obj), directoryAgent.address)
    return gr
Beispiel #2
0
def directory_search_global(agentSender, directoryAgent, type):
    """
	Busca todos los agentes del tipo type
	"""
    gmess = Graph()
    gmess.bind('foaf', FOAF)
    gmess.bind('dso', DSO)
    reg_obj = createAction(agentSender, 'search-global')
    #La accion es diferente. El servicio de directorio ya se encargara de procesar esta informacion
    gmess.add((reg_obj, RDF.type, DSO.SearchGlobal))
    gmess.add((reg_obj, DSO.AgentType, type))

    msg = build_message(gmess,
                        perf=ACL.request,
                        sender=agentSender.uri,
                        receiver=directoryAgent.uri,
                        content=reg_obj)
    gr = send_message(msg, directoryAgent.address)
    return gr
    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))
        # Es mas simple evitar el hecho de que no hayan agentes en rsearch con la
        # captura de excepciones. el rsearch.next()[0] lanzara StopIteration si no hay elementos
        candidatos = list(rsearch)
        if len(candidatos) > 0:

            agn_uri = random.choice(candidatos)[0]
            register_stat(agn_uri, agn_type)
            #agn_uri = rsearch.next()[0]
            agn_add = dsgraph.value(subject=agn_uri, predicate=DSO.Address)
            gr = Graph()
            gr.bind('dso', DSO)
            rsp_obj = createAction(DirectoryAgent, 'search-response')
            #Anadimos las direcciones y el uri del agente que se buscaba
            gr.add((rsp_obj, DSO.Address, agn_add))
            gr.add((rsp_obj, DSO.Uri, agn_uri))
            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.failure,
                                 sender=DirectoryAgent.uri,
                                 msgcnt=mss_cnt)
Beispiel #4
0
def directory_search_specific(agentSender, directoryAgent, type, uri):
    """
	Busca un agente del tipo type y con la uri especificada en el servicio de directorio
	"""
    gmess = Graph()
    gmess.bind('foaf', FOAF)
    gmess.bind('dso', DSO)
    reg_obj = createAction(agentSender, 'search-specific')
    gmess.add((reg_obj, RDF.type, DSO.SearchSpecific))
    gmess.add((reg_obj, DSO.AgentType, type))
    #La unica diferencia con el search message es esta nueva relacion,
    #que especifica la uri del agente a buscar
    gmess.add((reg_obj, DSO.AgentUri, uri))

    msg = build_message(gmess,
                        perf=ACL.request,
                        sender=agentSender.uri,
                        receiver=directoryAgent.uri,
                        content=reg_obj)
    gr = send_message(msg, directoryAgent.address)
    return gr
    def process_specificSearch():
        # 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 y la uri del agente
        # Buscamos una coincidencia exacta
        # Retornamos el primero de la lista de posibilidades

        #logger.info('Peticion de busqueda especifica')

        agn_type = gm.value(subject=content, predicate=DSO.AgentType)
        agn_uri = gm.value(subject=content, predicate=DSO.AgentUri)

        rsearch = dsgraph.triples((agn_uri, DSO.AgentType, agn_type))

        try:
            agn_uri = rsearch.next()[0]
            agn_add = dsgraph.value(subject=agn_uri, predicate=DSO.Address)
            gr = Graph()
            gr.bind('dso', DSO)
            rsp_obj = createAction(DirectoryAgent, 'search-response')
            gr.add((rsp_obj, DSO.Address, agn_add))
            gr.add((rsp_obj, DSO.Uri, agn_uri))
            return build_message(gr,
                                 ACL.inform,
                                 sender=DirectoryAgent.uri,
                                 msgcnt=mss_cnt,
                                 receiver=agn_uri,
                                 content=rsp_obj)
        except StopIteration:
            # Si no encontramos nada retornamos un inform sin contenido
            return build_message(Graph(),
                                 ACL.failure,
                                 sender=DirectoryAgent.uri,
                                 msgcnt=mss_cnt)
Beispiel #6
0
def directory_search_message(agentSender, directoryAgent, type):
    """
	Busca en el servicio de registro mandando un
	mensaje de request con una accion Seach del servicio de directorio
	"""
    gmess = Graph()

    gmess.bind('foaf', FOAF)
    gmess.bind('dso', DSO)
    #Nodo padre de la comunicacion
    reg_obj = createAction(agentSender, 'search')
    #Especificamos que queremos hacer una busqueda normal y anadimos el tipo de agente
    gmess.add((reg_obj, RDF.type, DSO.Search))
    gmess.add((reg_obj, DSO.AgentType, type))

    #Enviamos el mensaje en FIPA-ACL
    msg = build_message(gmess,
                        perf=ACL.request,
                        sender=agentSender.uri,
                        receiver=directoryAgent.uri,
                        content=reg_obj)
    gr = send_message(msg, directoryAgent.address)
    return gr