CTI技术步入JAVA世界.docx
《CTI技术步入JAVA世界.docx》由会员分享,可在线阅读,更多相关《CTI技术步入JAVA世界.docx(8页珍藏版)》请在冰豆网上搜索。
![CTI技术步入JAVA世界.docx](https://file1.bdocx.com/fileroot1/2023-3/19/8abfd963-e735-4677-af37-38416b273ce0/8abfd963-e735-4677-af37-38416b273ce01.gif)
CTI技术步入JAVA世界
CTI技术步入JAVA世界
1.什么是JTAPI
a.什么是JTAPI?
谈JTAPI,首先得了解什么是CTI。
CTI(ComputerTelephonyIntegration)就是计算机电话集成技术,它是目前国内正火的呼叫中心热潮的核心技术。
JTAPI主要是为CTI技术服务。
JTAPI(JavaTelephoneAPI)是一套专门为JAVA语言提供的与电话应用相关的程序接口,它定义了一组跨平台、跨厂家的电话应用程序对象模型。
使用JTAPI提供的对象,我们就可以简单方便地用软件实现各种CTI技术。
由于JTAPI的诞生是由若干知名计算机、通讯厂商(Sun,LucentTechnologies,Nortel,Novell,Intel,andIBM)联合努力的结果,利用JTAPI编写的CTI程序甚至可以操作若干种电话交换机,这些交换机包括Lucnet、Nortel等等厂家。
b.为什么要使用JTAPI?
JTAPI的主要特点归纳如下:
1.简化CTI程序的编写。
2.提供一套可以扩展的框架结构,可以平滑的使Client/Server结构的程序过渡到Browser/Server结构。
3.对已有的传统CTI程序接口,如TSAPI、SunXTL、以及TAPI进行WEB方向的扩展。
4.可以运行于任何JAVA可以运行的平台。
利用以上优点,采用JTAPI技术搭建的呼叫中心就可以平滑的过渡到Internet时代。
c.JTAPI的应用场合
目前JTAPI主要应用于呼叫中心领域,利用它还可以编写包括自动拨号、语音邮件、传真接收等各类软件。
特别在互联网呼叫中心领域更是大有用武之地。
比如Lucent推出的ICC(InternetCallCenter)就是一个典型的例子。
整个ICC系统从技术上划分,可以分为3部分:
管理、CTI、工作流。
三个部分都用JAVA开发,其中CTI部分使用JTAPI1.3。
利用JAVA的优势,ICC可以运行在NT、SALORIS等各种平台之上。
d.目前的版本
目前JTAPI的应用案例大多采用JTAPIver1.2版本,不过JTAPIver1.3也已经逐渐普及。
下文将以JTAPI1.2为例进行讲解。
2.JTAPI的结构
·对象包结构:
JTAPI1.2由18个JAVA对象包(PACKAGE)组成,每一个包分别提供CTI应用的一个方面的功能。
比如呼叫控制包(javax.telephony.callcontrol)、用户数据包(javax.telephony.privatedata)、核心包(javax.telephony)、呼叫中心专用包(javax.telephony.callcenter)等等。
这样做的目的是可以把CTI应用也功能化、模块化,使整个CTI应用的子功能模块相对独立。
如下图所示:
·对象包分析:
JTAPI的对象包除了核心包以外都提供自己独特的功能。
核心包比较特殊,按照面向对象的理论,核心包是其它包的父类。
核心包只能够提供最基本的电话功能,而其它对象包则是核心包的扩展。
比如针对核心包中的对象Call,呼叫控制包有专门的对象CallControlCall,后者具有前者的所有属性和方法,并在前者的基础上添加了专门的属性和方法。
比如CallControlCall和Call都有方法connect(),而CallControlCall更有自己独有的方法conference()、transfer()。
简单的说,实际上核心包的对象Call可以提供基本的电话功能,如外拨、接听、挂机等。
而呼叫控制包的对象CallControlCall不仅有基本的电话功能,还有特殊的会议电话、转接电话、监听电话等功能。
同样呼叫中心专用包的电话对象CallCenterCall也是一样,它的特殊功能有预拨电话、得到用户数据等方法。
3.利用JTAPI搭建CTI程序
JTAPI电话模型树
程序员在掌握利用JTAPI编写CTI程序之前,首先得搞清JTAPI最基本的电话模型,这个模型是搭建CTI程序的基础,它可以以树状结构表现出来(如下图)。
可以说,程序员心里有了这幅树状电话模型图,从简单的外拨电话到复杂的两路来话相互切换功能都可以很方便的实现。
构成电话模型图的元素都是JTAPI核心包的主要对象,每个对象都代表了CTI领域中的一个物理或逻辑的实体。
由图可知,这些实体之间有着相互的联系。
利用每个实体的功能以及实体之间的关系,程序员就可以组合出各种各样的CTI程序。
下面简单介绍电话模型中涉及的最主要的几个实体。
∙ProviderObject:
Provider是对和CTI技术相关的硬件设备的一个抽象,它可能代表工控机上插的一块板块,也可能代表一台复杂的DEFINITYECS。
Provider把具体的硬件设备和程序员隔离开来,使程序员不必懂得复杂的硬件设备。
这有些类似于数据库编程时遇到的ODBC概念,数据库程序员不必知道后台的数据库是ORACLE还是简单的ACCESS。
程序员只需知道经过初始化,就能得到一个可以访问后台资源的实例即可。
利用Provider,可以轻易的实现CTI程序和硬件的无关性。
程序不变,后台的PBX可以从LucentTechnologies的产品换成Nortel的产品。
▪CallObject:
CALL是对一次呼叫过程进行抽象,它的属性记录了这个呼叫目前的信息,调用Call的方法,可以引导这个呼叫的发展。
▪AddressObject
简单的说,AddressObject是对电话号码的抽象。
它是对一部逻辑电话的描述,和它对应的不是一部物理电话,所以一个AddressObject可能对应了多个物理话机。
▪TerminalObject:
TerminalObject描述了一部具体的物理话机和其相关的属性。
每个TerminalObject至少存在一个AddressObject与之对应。
▪ConnectionObject:
一个ConnectionObject是对CallObject和AddressObject之间的通讯连接的抽象。
通过对ConnectionObject的属性查看,可以分析出当前CallObject与AddressObject的连接状态信息。
ConnectionObject的状态有IDLE、ACTIVE、RINGING、DROPPED等等。
a.软电话功能调用和电话消息处理
利用JTAPI进行CTI应用程序的编写,工作上可以分为两个部分。
首先是客户端主动调用后台PBX资源,实现软电话功能的调用;其次是客户端对后台资源传来的大量电话消息进行分析,实现消息分发与分拣。
利用CallObject能够进行各种软电话调用的工作,如call.connect()可以实现拨打一个电话;call.conference()可以实现与第三方会议一个电话;call.transfer()可以实现把接起的电话进行转接到第三方的操作;利用诸如以上所述的种种方法,可以任意搭建出复杂功能的CTI应用。
JTAPI利用OBSERVER的概念来进行各种消息处理。
OBSERVER直译过来是观察者的意思,顾名思义,OBSERVER就是对每个呼叫对象进行“观察”工作。
它的工作流程是“绑定到专门对象?
?
?
》观察专门对象?
?
?
》获取专门对象的信息?
?
》分析并汇报专门对象的信息”。
针对前文JTAPI对象树提到的各种对象,都有专门的OBSERVER为之“服务”。
比如对Provider,有ProviderObserver,它可以随时汇报目前被监控的Provider的状态,如Provider.OUT_OF_SERVCE,Provider.IN_SERVICE等等;针对Terminal,有TerminalObserver,它能汇报出一个Terminal的所有事件以及相关信息,CTI应用中非常重要的数据主叫号码、同步数据等就可以在这里得到。
类似的,还有AddressObserver、CallObserver等多种Observer。
所有的Observer都是javax.telephony.observer的子类。
4.应用实例分析
下面提供一个简单的软电话外拨程序代码。
代码分为“外拨”模块,以及“监控”模块。
这两个模块分别和前文提到的“客户端主动调用后台PBX资源”,以及“客户端对后台资源传来的电话消息进行分析”相对应。
通过对这个例子的分析,我们可以很快掌握利用JTAPI开发CTI应用程序的基本思想。
4.1外拨模块
首先是“外拨”模块,这个部分的程序流程图如上图所示,以下是代码分析。
importjavax.telephony.*;
importjavax.telephony.events.*;
importMyOutCallObserver;
//整个程序的结果是实现从电话4761111外拨到电话5551212
publicclassOutcall{
publicstaticfinalvoidmain(Stringargs[]){
//产生一个Provider实例
Providermyprovider=null;
try{
JtapiPeerpeer=JtapiPeerFactory.getJtapiPeer(null);
myprovider=peer.getProvider(null);
}catch(Exceptionexcp){
System.out.println("Can'tgetProvider:
"+excp.toString());
System.exit(0);
}
//利用Provider实例产生一个和电话4761111的Address实例
Addressorigaddr=null;
Terminalorigterm=null;
try{
origaddr=myprovider.getAddress("4761111");
//得到这个Address上绑定的Terminial(物理话机实例)列表,取出第一个。
//这一操作,可以理解为对于电话4761111,有可能不止绑定了一部分机。
//如果有若干分机,任意取出一个可用的进行后续操作。
Terminal[]terminals=origaddr.getTerminals();
if(terminals==null){
System.out.println("NoTerminalsonAddress.");
System.exit(0);
}
origterm=terminals[0];
}catch(Exceptionexcp){
//处理异常;
}
//建立一个空的Call对象
Callmycall=null;
try{
mycall=myprovider.createCall();
//在这个Call上绑定一个Observer,这个Observer可以
//对整个外拨过程进行消息分析。
(Observer的代码下文有讲解)
mycall.addObserver(newMyOutCallObserver());
}catch(Exceptionexcp){
//处理异常
}
//进行外拨,所需的资源有刚才得到的Address、Terminal、Call对象
//以及被叫号码
try{
mycall.connect(origterm,origaddr,"5551212");
}catch(Exceptionexcp){
//处理异常
}
}
}
4.2消息处理模块
下面对Observer的代码进行简单的分析
importjavax.telephony.*;
importjavax.telephony.events.*;
//类MyOutCallObserver实现了接口CallObserver的若干方法
//MyOutCallObserver对Call相关的各种事件进行了处理。
publicclassMyOutCallObserverimplementsCallObserver{
publicvoidcallChangedEvent(CallEv[]evlist){
for(inti=0;i//判断是否得到有关Address的事件
if(evlist[i]instanceofAddrEv){
//如果是有关于Address的事件,则利用这个事件获得相关的Address实例
Stringname=null;
try{
Addressaddr=((AddrEv)evlist[i])getAddress();
//从这个Address实例获取主叫号码
name=addr.getName();
}catch(Exceptionexcp){
//处理异常
}
Stringmsg="ConnectiontoAddress:
"+name+"is";
//分析这个事件的具体类型并进行相应处理
//这个事件属于“震铃”事件,进行相应处理。
if(evlist[i].getID()==ConnAlertingEv.ID){
System.out.println(msg+"ALERTING");
}
//这个事件属于“来话接起”事件,进行相应处理。
elseif(evlist[i].getID()==ConnConnectedEv.ID){
System.out.println(msg+"CONNECTED");
}
//这个事件属于“挂机”事件,进行相应处理。
elseif(evlist[i].getID()==ConnDisconnectedEv.ID){
System.out.println(msg+"DISCONNECTED");
}
}
}
}
}
可以看出,MyOutCallObserver能够获取任何与Call相关的事件,在MyOutCallObserver适当添加代码,即可以实现对来话消息进行捕获、分析、以及处理。
5.结尾
综上所述,利用JTAPI可以方便的用JAVA搭建CTI程序。
如果把JTAPI编写的程序放置到APPLET中,就能够轻松实现B/S模式的CTI应用程序。