AGENT COMMUNICATION
JADE代理提供的最重要功能之一就是通信能力。所采用的通信模式是异步消息传递。每个代理都有一种邮箱(代理消息队列),JADE运行时在其中发布其他代理发送的消息。每当在消息队列中发布消息时,都会通知接收代理。但是,当代理实际从消息队列中提取消息进行处理时,完全取决于程序员。

JADE代理交换的消息具有由ACL语言定义的格式,该语言由
FIPA(http://www.fipa.org)代理互操作性国际标准。 此格式包括
字段数,包括以下几个内容:
- sender : 消息的发送者,通过Agent标记AID来表示
- receivers : 接受Agent消息的Agent,可以指定多个接收者
- communicative intention (or “performative”): 指示发送者通过发送消息要实现的目标。 如果发送者希望接收者执行一个操作,则执行器可以是REQUEST;如果发送者希望接收者知道一个事实,QUERY_IF,则发送者希望接收者执行一个动作INFORM。
发送者想知道给定条件是否成立,CFP(Call For Proposals),PROPOSE,ACCEPT_PROPOSAL,REJECT_PROPOSAL,发送者和接收者是否正在进行协商等。 - content : 消息中包含的实际信息(比如,在REQUEST中要执行的操作,发送者要公开在INFORM中的消息……)。
- language: 用于表示内容的语法(发送方和接收方都必须能够编码/解码以符合此语法的表达式,以使通信有效)。
- ontology: 内容中使用的符号的词汇及其含义(发送方和接收方都必须将符号的含义赋予相同的含义才能使通信有效)。
- 其他一些常量用于控制多个并发会话并指定用于接收答复的超时,例如conversation-id, reply-with, in-reply-to, reply-by。
ACLMessage 接收/发送信息
// SenderAgent.java
package cn.bcrab.agent;
import jade.core.AID;
import jade.core.Agent;
import jade.core.behaviours.*;
import jade.lang.acl.ACLMessage;
public class SenderAgent extends Agent{
@Override
protected void setup() {
Behaviour b = new CyclicBehaviour() {
@Override
public void action() {
doWait(1000);
ACLMessage msg = receive();
if (msg!=null){
System.out.println("SenderAgent receive content from : "+ msg.getSender().getName());
System.out.println("SenderAgent receive content is : "+ msg.getContent());
}
block();
}
};
this.addBehaviour(b);
ACLMessage aclMessage = new ACLMessage(ACLMessage.INFORM); //实例化通知
AID aid = new AID("Receiver", AID.ISLOCALNAME);
aclMessage.addReceiver(aid); //将接收者添加到ACL消息中
aclMessage.setContent("Hi Receiver, I am going to send you something."); //设置发送内容
send(aclMessage); // 发送操作
}
}
// ReceiverAgent.java
package cn.bcrab.agent;
import jade.core.Agent;
import jade.core.behaviours.*;
import jade.lang.acl.ACLMessage;
public class ReceiverAgent extends Agent{
@Override
protected void setup() {
Behaviour b = new CyclicBehaviour() {
@Override
public void action() {
ACLMessage aclMessage = receive();
if(aclMessage!=null){
System.out.println("--------------ReceiverAgent print info---------------" );
System.out.println("ReceiverAgent local name is:" + getLocalName());
System.out.println("ReceiverAgent received content is:" + aclMessage.getContent());
System.out.println("ReceiverAgent received content from:" + aclMessage.getSender().getLocalName());
System.out.println("---------------------------------------------------" );
ACLMessage reply = aclMessage.createReply();
reply.setPerformative(ACLMessage.INFORM);
reply.setContent("OK, I got it.");
send(reply);
}
block();
}
};
this.addBehaviour(b);
}
}
Program arguments:
-gui
-name
Platform
-agents
Receiver:cn.bcrab.agent.ReceiverAgent
Sender.bcrab.agent.SenderAgent
没办法启动两个Agent, 不知道为什么,只能先只启动 ReceiverAgent, SenderAgent通过GUI 界面去启动。
Program arguments 修改为:
-gui
-name
Platform
-agents
Receiver:cn.bcrab.agent.ReceiverAgent

运行效果
--------------ReceiverAgent print info---------------
ReceiverAgent local name is:receiver
ReceiverAgent received content is:Hi Receiver, I am going to send you something.
ReceiverAgent received content from:sender
---------------------------------------------------
SenderAgent receive content from : receiver@Platform
SenderAgent receive content is : OK, I got it.
相关代码
https://gitee.com/2010jing/JADE-tutorial/tree/tutorial04/
Reference
网友评论