2. Introducción. > FIPA-ACL. Envío/Recepción de mensajes. > ACL-Message. > Intercambio de mensajes. Selección de mensajes. Páginas amarillas (DF Agent). Páginas blancas (AMS Agent). Tabla de Contenidos
3. La comunicación determina el comportamiento social de los agentes. Los agentes intercambian datos y conocimiento. Para ello, usan un lenguaje de comunicación (ACL): KQML FIPA-ACL (utilizado por Jade) Introducción
4. Los mensajes FIPA-ACL contiene: La directiva de comunicación (performative). Argumentos Contenido semántico de los argumentos: Construidos a partir de una ontología: vocabulario común a los agentes. Todos los mensajes deben contener al menos la performativa. FIPA-ACL
7. Paso asíncrono de mensajes Cada agente tiene una cola de mensajes única donde se colocan los mensajes enviados por otros agentes. La lectura de los mensajes es a voluntad del agente: Leer el primer mensaje de la cola. Leer el primer mensaje que satisfaga un requisito Envío/recepción de mensajes
9. Cada vez que se coloca un mensaje en la cola el agente receptor es avisado. La cola de mensajes es compartida por todos los comportamientos. Un comportamiento puede ser bloqueado en espera de la recepción de un mensaje: sincronización. Envío/recepción de mensajes
10. Los mensajes son instancias de la clase jade.lang.acl.ACLMessage setPerformative(int): toma como parámetro una constante representativa de un tipo de acción performativa y la establece como performativa del mensaje. getPerformative(): devuelve un entero equivalente a la constante que representa a la performativa del mensaje. createReply(): crea un mensaje de respuesta para el mensaje sobre el que es aplicado, poniendo los valores oportunos en campos como receiver, conversation-id, etc. addReceiver(AID): toma como parámetro un AID y lo añade a la lista de receptores. getAllReceiver(): devuelve un iterador sobre la lista de receptores. setContent(String): recibe como parámetro una cadena y la pone como contenido del mensaje getContent(): devuelve una cadena con el contenido del mensaje ACLMessage
11. Pasos: Crear un objeto ACLMessage. Usar métodos de ACLMessage para rellenar los campos necesarios. Llamar al método send() de la clase Agent. El método send() recibe como parámetro un ACLMessage, añade el valor oportuno al campo sender (remitente) y envía el mensaje a los destinatarios Enviar un mensaje
13. Se usará el método receive() de la clase Agent. receive(): obtiene el primer mensaje de la cola de mensajes y lo devuelve (devuelve null si la cola está vacía). Recibir un mensaje
14. Ejemplo: ACLMessage mensaje = receive(); Mensaje recibido: emisor1: Preparandose para enviar un mensaje a receptor emisor1: Enviando hola a receptor receptor: acaba de recibir el siguiente mensaje: (REQUEST :sender ( agent-identifier :name emisor1@luna:1099/JADE :addresses (sequence http://luna:7778/acc )) :receiver (set ( agent-identifier :name receptor@luna:1099/JADE ) ) :content "Hola, que tal receptor ?" :language Español ) Recibir un mensaje
15. Clase que representa al agente Emisor. Se encarga de emitir el mensaje "Hola que tal receptor?". Ejemplo de intercambio de mensajes entre dos agentes:
20. Nota importante: Si hubiésemos lanzado primero el emisor no se habría obtenido ninguna salida porque al no estar registrado el receptor del mensaje en el AMS, este enviaría un mensaje FAILURE al agente emisor. Problema: si el Receptor no recibe ningún mensaje, éste está ejecutándose continuamente, consumiendo CPU. Posibles soluciones: Solución 1: Usar el método block() de la clase Behaviour. Ejemplo de intercambio de mensajes entre dos agentes:
24. Diferencia entre las dos soluciones: block(): Solo bloquea un comportamiento del agente hasta que llegue un mensaje. El bloqueo no se produce hasta que termina el comportamiento sobre el que se aplica. blockingReceive(): Bloquea instantáneamente todos los comportamientos del agente hasta que llegue un mensaje. Además devuelve el mensaje recibido que liberó el bloqueo. Ejemplo de intercambio de mensajes entre dos agentes:
25. Existen dos formas: Indicando como receptor al emisor del mensaje anterior. Haciendo uso de createReply(). (En ambos casos se tendrá que modificar el método action() ) Responder a mensajes
26. Método action() de la clase Emisor: Indicando como receptor al emisor del mensaje anterior.
27. Método action() de la clase Receptor: Indicando como receptor al emisor del mensaje anterior.
28. Método action() de la clase Receptor: La clase Emisor no varía. Haciendo uso de createReply().
29. Para seleccionar los mensajes que un agente desea recibir utilizamos la clase MessageTemplate. Permite definir filtros para cada atributo del mensaje ACLMessage. Se utiliza como parámetro en los métodos receive y blockingReceive. Se definen un conjunto de métodos estáticos que nos devuelven como resultado un objeto de tipo MessageTemplate Selección de mensajes
30. Diferentes opciones de filtrado: MatchPerformative(performative) donde performative puede ser: ACLMessage.INFORM ACLMessage.PROPOSE ACLMessage.QUERY_REF ... MatchSender(AID) MatchConversationID(String): Permite dedicar un comportamiento a gestionar una conversación/negociación. and(Template1, Template2): realiza un and lógico entre los dos filtros. or (Template1, Template2): realiza un or lógico entre los dos filtros. not(Template): invierte el filtro. MatchOntology(String): devuelve un filtro según el nombre de la ontología que le pasemos como parámetro. MatchProtocol(String): devuelve un filtro según el nombre del protocolo que le pasamos. MatchLanguage(String): devuelve un filtro según el lenguaje introducido. MatchContent(String): crea una plantilla según el contenido del mensaje. MatchReplyWith(String): devuelve un filtro según el campo replywith. Selección de mensajes
31. Existe el método match(ACLMessage) que devuelve verdadero si el mensaje que le pasamos como parámetro cumple el filtro definido en el objeto MessageTemplate. Ejemplo anterior: El agente Receptor podría solo estar interesado en recibir mensajes del tipo REQUEST, en Español y procedentes exclusivamente del agente "emisor“. Selección de mensajes
34. Permite a los agentes publicar los servicios que proporcionan, para que otros agentes puedan acceder a ellos. Un agente puede interactuar con el DF intercambiando mensajes ACL usando un lenguaje de contenido apropiado (SL0) y una ontología apropiada (FIPA-agent-management). Páginas Amarillas (DF Agent)
35. Publicar servicios: El agente debe proporcionar al DF una descripción, incluyendo su AID, los protocolos, lenguajes y ontologías que el resto de agentes necesitan conocer para interactuar con él así como la lista de servicios publicados. Para cada servicio se proporciona una descripción, incluyendo: tipo de servicio, nombre, protocolos, lenguajes y ontologías; y una serie de propiedades específicas del servicio. Antes de finalizar su ejecución el agente debe eliminar del DF sus servicios. Páginas Amarillas (DF Agent)
36. Para facilitar el trabajo JADE proporciona la clase jade.domain.DFService en la que nos podemos encontrar los siguientes métodos: staticDFAgentDescription register: registra los servicios de un agente en el DF. staticvoid deregister: elimina del registro del DF los servicios del agente. Los servicios se definen con los siguientes métodos de la clase ServiceDescription: void setName: modifica el nombre del servicio. void setOwnership: modifica el propietario del servicio. void setType: modifica el tipo de servicio. void addLanguages: añade lenguaje del servicio. void addOntologies: añade ontología del servicio. void addProtocols: añade protocolo del servicio. void addProperties: añade propiedades del servicio. La descripcion del agente se modifica con los siguientes métodos de la clase DFAgentDescription: void setName: modifica el AID de la descripción del agente. void addServices: añade el servicio pasado por parámetro a la descripción del agente. void removeServices: elimina el servicio pasado por parámetro a la descripción del agente. void addLanguages: añade lenguajes que el agente entiende. void addOntologies: añade ontologías que el agente entiende. void addProtocols: añade protocolos que el agente entiende. Páginas Amarillas (DF Agent)
37. Ejemplo: clase Ofrece y clase Pide Clase Ofrece: representa a uno de los agentes que ofrece servicios. Páginas Amarillas (DF Agent)
38. Ejemplo: clase Ofrece y clase Pide Clase Ofrece: representa a uno de los agentes que ofrece servicios. Páginas Amarillas (DF Agent) MétodotakeDown()
41. Busqueda de servicios: Un agente que busca servicios debe proporcionar una plantilla de descripción de la clase DFAgentDescription. El resultado de la búsqueda es la lista de todas las descripciones que encajan con la plantilla proporcionada. Para realizar las acciones anteriores jade proporciona diversos métodos de búsqueda que se encuentran en la clase DFService. Páginas Amarillas (DF Agent)
42. Garantiza que cada agente en la plataforma tenga un único nombre. Encargado de proporcionar los servicios de páginas blancas y ciclo de vida, y de mantener el directorio de los identificadores de agentes (AID: AgentIdentifier) y su estado. Cada agente debe registrarse con el AMS para obtener un AID válido (en JADE la realizan los agentes de manera automática en el agente AMS). Páginas Blancas (AMS Agent)
43. Para acceder a los servicios del agente AMS hay que importar la clase jade.domain.AMSService. Esta clase contiene los siguientes métodos: staticvoid register: registra al agente en el AMS. Tanto esta operación como la operación deregister se realizan automáticamente en JADE cuando se ejecutan los métodos setup() y takeDown() respectivamente, por lo tanto no suelen ser usados normalmente. staticvoid deregister: elimina el registro del agente en el AMS. staticvoid modify: modifica los datos del agente en el AMS. staticAMSAgentDescription[] search: devuelve la descripción de los agentes registrados en el agente AMS. Páginas Blancas (AMS Agent)