Filtrando mensagens no SPADE
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()