: Java Agent DEvelopment Framework http:// sharon.cselt.it/projects/jade Framework para desenvolvimento de software, no projecto de sistemas multi-agente e aplicações conforme as normas da FIPA Escrito em JAVA, compreende várias packages JAVA Agent Platform Agent AMS DF Message Transport Protocol 2 1
Agent Management System (AMS) Supervisão sobre acesso e uso da plataforma. Mantém directoria de identificadores de agentes (AID) e seu estado. Todos os agentes se registam em AMS. Em uma plataforma, existe apenas um AMS. Directory Facilitator (DF) Serviços de páginas amarelas. Quando plataforma é lançada, AMS e DF são criados automaticamente 3 Plataforma pode ter vários containers, onde residem os agentes Containers não estão necessariamente na mesma máquina Em cada plataforma existe um container especial: main container, reside na máquina onde corre o servidor RMI Comunicação Receptor no mesmo container : Passagem como evento Receptor na mesma plataforma, mas noutro container : RMI Receptor numa plataforma diferente : Protocolo IIOP 4 2
Suporta mobilidade intra-plataforma e clonagem Plataforma pode estar distribuída através de múltiplas máquinas (em cada máquina está um container ) Agentes podem migrar entre containers domove(location) beforemove() / aftermove() Agentes podem ser clonados doclone(location, String) beforeclone() / afterclone() 5 Execução Alterar a variável CLASSPATH %%\lib\jade.jar;%\lib\jadetools.jar;%%\lib\base64.jar; %%\lib\iiop.jar; Executar o comando: java jade.boot [options] [agentlist] lança main container que inclui AMS e DF [options] -container -host HostName (p.defeito, máquina local) -port PortNumber (p.defeito, 1099) -gui (GUI do RMA)... [agentlist] identificadores de agentes separados por espaços identificador = nome:nome_classe 6 3
Execução Lançar agentes na plataforma i. Usando RMA seleccionar container e usar botão Start New Agent ii. A partir da linha de comando, quando se arranca java jade.boot gui nome:nomeclasse (ex: java jade.boot gui ping0:examples.pingagent.pingagent) 7 Execução Múltiplos containers Na mesma máquina Iniciar java jade.boot gui Adicionar novo container com agente java jade.boot container agentid Em máquinas diferentes Iniciar na máquina MCCARTHY java jade.boot gui Adicionar novo container com agente na máquina MARKOV java jade.boot host MCCARTHY -container agentid agente vive na máquina MARKOV, mas pertence à plataforma que corre na máquina MCCARTHY; o seu endereço é nome@mccarthy:1099/ 8 4
Ferramentas que simplificam a administração da plataforma e desenvolvimento de aplicações Remote Monitoring Agent Dummy Agent Sniffer Agent Introspector Agent Directory Facilitator GUI 9 Remote Monitoring Agent (RMA) Consola gráfica para controlo da plataforma Vizualização do estado de agentes e containers Pode existir mais que um RMA na mesma plataforma Em um container, apenas pode existir um RMA Como executar: Como um agente normal java jade.boot myconsole:jade.tools.rma.rma Usando o argumento -gui java jade.boot gui 10 5
(RMA) 11 Dummy Agent Ferramenta de monitoração e debugging Permite enviar, receber e visualizar mensagens ACL Como executar: A partir da linha de comando java jade.boot da:jade.tools.dummyagent.dummyagent A partir do menu do RMA GUI botão Start DummyAgent 12 6
(DummyAgent) 13 Sniffer Agent Quando se espia um agente (ou grupo), as mensagens dirigidas ou enviadas a este são visualizadas com notação semelhante a diagramas de sequência UML Quando um agente ou container é criado ou destruído, Sniffer é informado de imediato pelo AMS Como executar: A partir do menu do RMA GUI botão Start Sniffer nome do agente sniffer é atribuído pelo sistema botão Start New Agent Name: XXXX ClassName: jade.tools.sniffer.sniffer 14 7
(SnifferAgent) 15 Directory Facilitator (DF) GUI DF fornece serviços de páginas amarelas. Agentes podem registar os seus serviços no DF, ou questionar o DF Em cada plataforma, existe pelo menos um DF Como executar: A partir do menu do RMA GUI Tools Show the DF GUI Introspector Agent Monitoração ciclo de vida de um agente: mensagens enviadas e recebidas e fila de comportamentos. Como executar: A partir do menu do RMA GUI botão Start IntrospectorAgent 16 8
(DF Gui) 17 Classe Agent classe base para construção de agentes Início execução do agente 1. É executado o construtor 2. É atribuído um identificador ao agente, que é registado no AMS identificador = nomelocal + @ + maquina:porto + / 3. É executado o método setup() O método setup() é usado para: Modificar dados registados no AMS Atribuir serviços ao agente, e registar o agente em um ou mais domínios (DFs) Adicionar comportamentos (obrigatório pelo menos um). Estes são escalonados assim que termina método setup() 18 9
Parar execução do agente Agent.doDelete() pára execução agente Agent.takeDown() método que pode ser reescrito pelo utilizador para qualquer limpeza antes de agente ser destruído. Comunicação Passagem de mensagens assíncrona Trocados objectos da classe ACLMessage Agent.send(msg) envia uma mensagem Agent.receive() recepção mensagem Agent.blockingReceive() recepção mensagem; suspende toda a actividade do agente até que uma mensagem seja recebida 19 Implementação de comportamentos Tarefas dos agentes são implementadas como objectos Behaviour Agent.addBehaviour(Behaviour1) Agent.removeBehaviour(Behaviour1) Existe uma fila de comportamentos. Escalonamento efectuado numa política de ronda. É executado método action() de um comportamento. Quando retorna, é chamado o método done() para verificar se o comportamento terminou a sua tarefa; se sim, este é removido da fila. 20 10
(exemplo) import jade.core.*; import jade.core.behaviours.*; import jade.lang.acl.aclmessage; import jade.domain.fipaagentmanagement.servicedescription; import jade.domain.fipaagentmanagement.dfagentdescription; import jade.domain.dfservice; import jade.domain.fipaexception; public class PingPong extends Agent { class ReceiveMsgReplyBehaviour extends SimpleBehaviour { private boolean finished=false; private int n=0; public ReceiveMsgReplyBehaviour(Agent a) { super(a); } 21 (exemplo) public void action() { ACLMessage msg=blockingreceive(); if (msg!=null) { if (msg.getperformative()!=aclmessage.not_understood){ ACLMessage reply = msg.createreply(); if (msg.getperformative() ==ACLMessage.INFORM) { String content=msg.getcontent(); System.out.println("mensagem recebida:"+content); String replycont; if (content.equals("ping")) replycont="pong"; else replycont="ping"; reply.setcontent(replycont); if (n==10) finished=true; n++; } else reply.setperformative(aclmessage.not_understood); send(reply); } 22 } } 11
(exemplo) public boolean done() { return finished; } } // fim de classe ReceiveMsgReplyBehaviour protected void setup() { DFAgentDescription dfd = new DFAgentDescription(); ServiceDescription sd = new ServiceDescription(); sd.settype("agente PingPong"); sd.setname(getname()); dfd.setname(getaid()); dfd.addservices(sd); try { DFService.register(this,dfd); } catch (FIPAException e) { System.out.println(getLocalName() + "erro no registo em DF. " + e.getmessage()); dodelete(); } 23 (exemplo) ReceiveMsgReplyBehaviour Behaviour1 = new ReceiveMsgReplyBehaviour(this); addbehaviour(behaviour1); if (getname().indexof("ping0")==0) { ACLMessage msg = new ACLMessage(ACLMessage.INFORM); msg.setcontent("ping"); AID receiver =new AID("pong0",false); msg.addreceiver(receiver); send(msg); } } // fim do metodo setup() } // fim da classe PingPong 24 12