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