JADE : Java Agent DEvelopment Framework http:// sharon.cselt.it/projects/jade 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 JADE • “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 JADE é lançada, AMS e DF são criados automaticamente 3 JADE – 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 JADE • 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 JADE – Alterar a variável CLASSPATH %JADE%\lib\jade.jar;JADE%\lib\jadeTools.jar;%JADE%\lib\Base64.jar; %JADE%\lib\iiop.jar; – Executar o comando: java jade.Boot [options] [agentlist] lança “main container” que inclui AMS e DF [options] -container -host HostName -port PortNumber -gui ... (p.defeito, máquina local) (p.defeito, 1099) (GUI do RMA) [agentlist] identificadores de agentes separados por espaços identificador = nome:nome_classe 6 3 Execução JADE • 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 JADE • java jade.Boot –gui nome:nomeclasse (ex: java jade.Boot –gui ping0:examples.PingAgent.PingAgent) 7 Execução JADE • Múltiplos “containers” – Na mesma máquina • • – Iniciar JADE java jade.Boot –gui Adicionar novo “container” com agente java jade.Boot –container agentId Em máquinas diferentes • • Iniciar JADE 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/JADE 8 4 JADE • 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 JADE • “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 JADE (RMA) 11 JADE • “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 JADE (DummyAgent) 13 JADE • “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 14 ClassName: jade.tools.sniffer.Sniffer 7 JADE (SnifferAgent) 15 JADE • “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 JADE (DF Gui) 17 JADE • 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 + “/JADE” 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 JADE – 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 JADE – 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 JADE (exemplo) import import import import import import import jade.core.*; jade.core.behaviours.*; jade.lang.acl.ACLMessage; jade.domain.FIPAAgentManagement.ServiceDescription; jade.domain.FIPAAgentManagement.DFAgentDescription; jade.domain.DFService; 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 JADE (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 JADE (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 JADE (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