JADE环境变量设置成功后,就可以尝试开发Agent了。为了开发方便,将JADE平台与Eclipse平台绑定起来。
首先要在eclipse中添加库。在窗口-首选项中,选择java,展开其子项,在构建路径—〉用户库中,新建一个库,名称不妨定为jade。选中并添加jade.jar进这个jade库里 。
选中新建->工程,命名为Learn_Jade。右击工程,选中构建路径->配置构建路径,在“库”选项卡中单击按钮,添加库,选择用户库,然后下一步把jade添加进来。结果如下图。
在src目录下新建文件夹test,再在test文件夹下新建类HelloTest。
创建Agent非常简单,只要定义一个继承jade.core.Agent类的类就行,其程序如下:
package test;
import jade.core.Agent;
public class HelloClass extends Agent{
public void setup() {
System.out.println("Hello!");
}
}
setup()方法用于实现Agent的初始化。Agent在setup()中执行的操作包括:显示一个图形界面,建立一个数据库连接,在黄页目录中注册其提供的服务以及启动初始化。
运行时,选中HelloTest.Java,右击->运行方式->运行配置,选择Java 应用程序,点击添加,名称起名为:run jade(可任意),项目名不变,Main类起名为:jade.Boot(固定,不可改变),自变量中程序自变量起名为:-gui hello:test.HelloClass(如果只想打开GUI管理器而不运行程序,则只要-gui即可),其中,hello为智能体Agent的名字,test为包名,HelloClass为类名。其他默认即可,配置完成。
点击运行,控制台输出结果。
十月 14, 2017 8:07:31 下午 jade.core.Runtime beginContainer
信息: ----------------------------------
This is JADE 4.5.0 - revision 6825 of 23-05-2017 10:06:04
downloaded in Open Source, under LGPL restrictions,
at http://jade.tilab.com/
----------------------------------------
十月 14, 2017 8:07:32 下午 jade.imtp.leap.LEAPIMTPManager initialize
信息: Listening for intra-platform commands on address:
- jicp://10.160.29.37:1099
十月 14, 2017 8:07:33 下午 jade.core.BaseService init
信息: Service jade.core.management.AgentManagement initialized
十月 14, 2017 8:07:33 下午 jade.core.BaseService init
信息: Service jade.core.messaging.Messaging initialized
十月 14, 2017 8:07:33 下午 jade.core.BaseService init
信息: Service jade.core.resource.ResourceManagement initialized
十月 14, 2017 8:07:33 下午 jade.core.BaseService init
信息: Service jade.core.mobility.AgentMobility initialized
十月 14, 2017 8:07:33 下午 jade.core.BaseService init
信息: Service jade.core.event.Notification initialized
十月 14, 2017 8:07:34 下午 jade.mtp.http.HTTPServer
信息: HTTP-MTP Using XML parser com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser
十月 14, 2017 8:07:34 下午 jade.core.messaging.MessagingService boot
信息: MTP addresses:
http://ASIA-20161230DB:7778/acc
十月 14, 2017 8:07:34 下午 jade.core.AgentContainerImpl joinPlatform
信息: --------------------------------------
Agent container Main-Container@10.160.29.37 is ready.
--------------------------------------------
Hello!
上面红色字体(这里没显示出来)的是JADE的声明、服务初始化、MTP地址、以及容器的名称,最后的“Hello!”是运行的结果。
另外,在项目中不一定非要完全运行,而且我们一般要创建的是多个Agent。一般我们也可以把它编译为类之后,运行-gui调出GUI界面,选择Main-Container右击选择Start New aAgent添加Agent即可。
还有一点需要注意的是,当运行一个项目后,要想编译运行一个新的项目或对当前项目修改后重新编译,必须将当前项目停止(点击控制台右侧的红色图标)。
JADE平台源代码以一个Java包和若干子包的层次结构组织,原则上,每个包都包含实现某一特定功能的类和接口。主要的包有:
jade.core实现了系统的核心。它包括必须由应用程序员继承的Agent类;除此之外,Behaviour类是包含在jade.core.behaviours子包里。行为实现了一个agent的任务或者意图。他们是逻辑上的活动单元,能够以各种方式组成来完成复杂执行模式,并且可以并行执行。应用程序员通过编写行为和使它们相互连接的agent执行路径来定义agent操作。
jade.lang.acl子包可以根据FIPA标准规范来处理Agent通信语言。
jade.content包含了一些类来支持用户定义的本体和内容语言。有一个单独的指南来描述如何使用JADE来支持消息内容。
jade.domain包含了由FIPA标准定义的描述Agent管理实体的所有Java类,尤其是AMS和DF agents,它们提供生命周期,白页服务,黄页服务。
jade.gui包含了一套通用的创建图形用户界面(GUIs)以显示和编辑AgentID,Agent描述,ACL消息(ACLMessages)的类。
jade.proto包含了一些用来构造标准交互协议)的类,以及一些帮助应用程序员创建他们自己协议的类。
jade.wrapper.jade.core.Profile和jade.core.Runtime类提供了JADE内部进程接口的支持,使外部Java应用程序可以把JADE当做一个链接库使用。
JADE框架根据如下步骤控制一个新agent的产生:执行了agent的构造器,赋予agent一个ID(详情见HTML文档中jade.core.AID类),注册到AMS上,处于活动状态,最终执行setup()方法。通过getAID()得到agent的标识。
任何行为都可以调用Agent.doDelete()方法来停止agent执行。
当agent准备转到删除状态,即它将要被销毁,就要执行Agent.takeDown()方法。程序员可以通过重载takeDown()方法来实现任何必须的清除行动。当调用这个方法时,agent仍然是注册到AMS上的,因此可以发送消息到其他的agent,但是只要在takeDown()方法完成之后,agent就会被注销,它的线程也会被销毁。
再看下面这个例子:
package test;
import jade.core.Agent;
import jade.core.Location;
public class HelloClass extends Agent{
public void setup(){
System.out.println("Hello World!");
System.out.println("-----About Me:-----");
System.out.println("My local name is:"+getAID().getLocalName());//由于本地agent,getAID()此时也可以省略
System.out.println("My globally unique name is:"+getName() );
System.out.println("-----About Here:-----");
Location l = here();//主容器信息
System.out.println("I am running in a location called:"+l.getName());
System.out.println("Which is identified uniquely as:"+l.getID());
System.out.println("And is contactable at:"+l.getAddress());
System.out.println("Using the protocol:"+l.getProtocol());
this.doDelete();
}
public void takeDown(){
System.out.println("Agent takedown!");
}
}
自变量输入:-gui hello:test.HelloClass 运行结果如下:
Hello World!
-----About Me:-----
My local name is:hello
My globally unique name is:[email protected]:1099/JADE
-----About Here:-----
I am running in a location called:Main-Container
Which is identified uniquely as:[email protected]
And is contactable at:10.160.29.37
Using the protocol:jicp
Agent takedown!
Agent的创建与基本使用就到此结束了,后面将学习Agent的行为。