Filtrando mensagens no SPADE

Esse tutorial é de uma versão antiga do SPADE (Python 2.7)

No código a seguir demonstro como filtrar as mensagens que são recebidas por um comportamento. O comportamento em si é bastante simples, consistindo de um comportamento cíclico chamado M1 e que fica aguardando receber uma mensagem. Quando a mensagem é recebida ele simplesmente imprime M1.

Observe que a adição do comportamento (linha 13) está associada a um template de mensagem (especificado nas linhas 10, 11 e 12). Nesse template eu filtrei que o comportamento somente deveria reagir a performativa “inform” (linha 11). Com essa filtragem, se o agente receber mensagens de qualquer tipo que não seja um inform, o comportamento não tratará o recebimento dessa mensagem.

import spade

class Teste(spade.Agent.Agent):
    class M1(spade.Behaviour.Behaviour):         
        def _process(self):
            msg = self._receive(True)
            print "M1"
                   
    def _setup(self):
        template1 = spade.Behaviour.ACLTemplate()
        template1.setPerformative("inform")
        t1 = spade.Behaviour.MessageTemplate(template1)            
        self.addBehaviour(self.M1(),t1)
            
teste = Teste("teste@127.0.0.1", "secret") 
teste.start()
time.sleep(30)
teste.stop()

Estendo a seguir o exemplo anterior adicionando dois comportamentos (M1 e M2). Ambos escrevem seu nome quando recebem uma mensagem. Observe agora que a adição desses comportamentos (linhas 19 e 25) utilizam dois templates diferentes. Ambos exigem uma performativa “inform”, mas também restringem a mensagem pelo conteúdo (linhas 17 e 23). Quando um “inform” tendo com conteúdo a letra “T” for enviado para o agente, somente o comportamento M1 será executado.

import spade

class Teste(spade.Agent.Agent):
    class M1(spade.Behaviour.Behaviour):         
        def _process(self):
            msg = self._receive(True)
            print "M1"
            
    class M2(spade.Behaviour.Behaviour):     
        def _process(self):
            msg = self._receive(True)
            print "M2"
                   
    def _setup(self):
        template1 = spade.Behaviour.ACLTemplate()
        template1.setPerformative("inform")
        template1.setContent("T")
        t1 = spade.Behaviour.MessageTemplate(template1)            
        self.addBehaviour(self.M1(),t1)

        template2 = spade.Behaviour.ACLTemplate()
        template2.setPerformative("inform")
        template2.setContent("A")
        t2 = spade.Behaviour.MessageTemplate(template2)    
        self.addBehaviour(self.M2(),t2)
            
teste = Teste("teste@127.0.0.1", "secret") 
teste.start()
time.sleep(30)
teste.stop()

O código a seguir adiciona outros dois comportamentos cíclicos ao código anterior. Veja que o comportamento M3 é adicionado com um template que apenas filtra pela performativa “inform”, enquanto o comportamento M4 é adicionado sem nenhum template para filtrar. Isso significa que qualquer mensagem do tipo “inform” será executado no comportamento M3, enquanto qualquer mensagem recebida pelo agente também irá executar o comportamento de M4. Em outras palavras, M4 será executado para qualquer mensagem recebida pelo agente, se a mensagem for um “inform” e o conteúdo for a letra “T” então os comportamentos M1 e M3 também serão executados (M1 por ter seus dois critérios atendidos e o M3 pela mensagem ser um”inform”, única filtragem aplicada ao comportamento).

import spade

class Teste(spade.Agent.Agent):
    class M1(spade.Behaviour.Behaviour):         
        def _process(self):
            msg = self._receive(True)
            print "M1"
            
    class M2(spade.Behaviour.Behaviour):     
        def _process(self):
            msg = self._receive(True)
            print "M2"

    class M3(spade.Behaviour.Behaviour):         
        def _process(self):
            msg = self._receive(True)
            print "M3"

    class M4(spade.Behaviour.Behaviour):         
        def _process(self):
            msg = self._receive(True)
            print "M4"

    def _setup(self):
        template1 = spade.Behaviour.ACLTemplate()
        template1.setPerformative("inform")
        template1.setContent("T")
        t1 = spade.Behaviour.MessageTemplate(template1)            
        self.addBehaviour(self.M1(),t1)

        template2 = spade.Behaviour.ACLTemplate()
        template2.setPerformative("inform")
        template2.setContent("A")
        t2 = spade.Behaviour.MessageTemplate(template2)    
        self.addBehaviour(self.M2(),t2)

        template3 = spade.Behaviour.ACLTemplate()
        template3.setPerformative("inform")
        t3 = spade.Behaviour.MessageTemplate(template3)    
        self.addBehaviour(self.M3(),t3)

        self.addBehaviour(self.M4())
            
teste = Teste("teste@127.0.0.1", "secret") 
teste.start()
time.sleep(30)
teste.stop()
Share

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.