2. JTAPI 的结构
4. 应用实例分析
4.1 外拨模块
4.2 消息处理模块
5. 结尾
-
什么是 JTAPI ?
谈
JTAPI ,首先得了解什么是 CTI 。 CTI(Computer Telephony Integration)
就是计算机电话集成技术,它是目前国内正火的呼叫中心热潮的核心技术。 JTAPI 主要是为 CTI 技术服务。 JTAPI(Java
Telephone API) 是一套专门为 JAVA
语言提供的与电话应用相关的程序接口,它定义了一组跨平台、跨厂家的电话应用程序对象模型。使用 JTAPI
提供的对象,我们就可以简单方便地用软件实现各种 CTI 技术。由
于 JTAPI 的诞生是由若干知名计算机、通讯厂商( Sun, Lucent Technologies, Nortel, Novell,
Intel, and IBM )联合努力的结果,利用 JTAPI 编写的 CTI 程序甚至可以操作若干种电话交换机,这些交换机包括
Lucnet 、 Nortel 等等厂家。 -
为什么要使用 JTAPI?
JTAPI 的主要特点归纳如下:
-
简化 CTI 程序的编写。
-
提供一套可以扩展的框架结构,可以平滑的使 Client/Server 结构的程序过渡到 Browser/Server 结构。
-
对已有的传统 CTI 程序接口,如 TSAPI 、 SunXTL 、以及 TAPI 进行 WEB 方向的扩展。
-
可以运行于任何 JAVA 可以运行的平台。
利用以上优点,采用 JTAPI 技术搭建的呼叫中心就可以平滑的过渡到 Internet 时代。
-
-
JTAPI 的应用场合
目
前 JTAPI
主要应用于呼叫中心领域,利用它还可以编写包括自动拨号、语音邮件、传真接收等各类软件。特别在互联网呼叫中心领域更是大有用武之地。比如
Lucent 推出的 ICC(Internet Call Center) 就是一个典型的例子。整个 ICC 系统从技术上划分,可以分为 3
部分:管理、 CTI 、工作流。三个部分都用 JAVA 开发,其中 CTI 部分使用 JTAPI1.3 。利用 JAVA 的优势, ICC
可以运行在 NT 、 SALORIS 等各种平台之上。 -
目前的版本
目前 JTAPI 的应用案例大多采用 JTAPI ver 1.2 版本,不过 JTAPI ver 1.3 也已经逐渐普及。下文将以 JTAPI1.2 为例进行讲解。
-
对
象包结构: 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
也是一样,它的特殊功能有预拨电话、得到用户数据等方法。JTAPI 电话模型树
程序员在掌握利用 JTAPI 编写 CTI 程序之前,首先得搞清 JTAPI 最基本的电话模型,这个模型是搭建 CTI 程序的基础,它可以以树状结构表现出来(如下图)。
可以说,程序员心里有了这幅树状电话模型图,从简单的外拨电话到复杂的两路来话相互切换功能都可以很方便的实现。
构
成电话模型图的元素都是 JTAPI 核心包的主要对象,每个对象都代表了 CTI
领域中的一个物理或逻辑的实体。由图可知,这些实体之间有着相互的联系。利用每个实体的功能以及实体之间的关系,程序员就可以组合出各种各样的 CTI
程序。下面简单介绍电话模型中涉及的最主要的几个实体。
-
Provider Object:
Provider
是对和 CTI 技术相关的硬件设备的一个抽象,它可能代表工控机上插的一块板块,也可能代表一台复杂的 DEFINITY ECS 。
Provider 把具体的硬件设备和程序员隔离开来,使程序员不必懂得复杂的硬件设备。这有些类似于数据库编程时遇到的 ODBC
概念,数据库程序员不必知道后台的数据库是 ORACLE 还是简单的 ACCESS
。程序员只需知道经过初始化,就能得到一个可以访问后台资源的实例即可。利用 Provider , 可以轻易的实现 CTI
程序和硬件的无关性。程序不变,后台的 PBX 可以从 Lucent Technologies 的产品换成 Nortel 的产品。
-
Call Object :
CALL 是对一次呼叫过程进行抽象,它的属性记录了这个呼叫目前的信息,调用 Call 的方法,可以引导这个呼叫的发展。
-
Address Object
简单的说, Address Object 是对电话号码的抽象。它是对一部逻辑电话的描述,和它对应的不是一部物理电话,所以一个 Address Object 可能对应了多个物理话机。
-
Terminal Object :
Terminal Object 描述了一部具体的物理话机和其相关的属性。每个 Terminal Object 至少存在一个 Address Object 与之对应。
-
Connection Object:
一
个 Connection Object 是对 Call Object 和 Address Object 之间的通讯连接的抽象。通过对
Connection Object 的属性查看,可以分析出当前 Call Object 与 Address Object 的连接状态信息。
Connection Object 的状态有 IDLE 、 ACTIVE 、 RINGING 、 DROPPED 等等。
-
软电话功能调用和电话消息处理
利用 JTAPI 进行 CTI 应用程序的编写,工作上可以分为两个部分。首先是客户端主动调用后台 PBX 资源,实现软电话功能的调用;其次是客户端对后台资源传来的大量电话消息进行分析,实现消息分发与分拣。
利
用 Call Object 能够进行各种软电话调用的工作,如 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 的子类。
下
面提供一个简单的软电话外拨程序代码。代码分为“外拨”模块,以及“监控”模块。这两个模块分别和前文提到的“ 客户端主动调用后台 PBX
资源”,以及“客户端对后台资源传来的电话消息进行分析”相对应。通过对这个例子的分析,我们可以很快掌握利用 JTAPI 开发 CTI
应用程序的基本思想。
首先是“外拨”模块,这个部分的程序流程图如上图所示,以下是代码分析。
import javax.telephony.*;
import javax.telephony.events.*;
import MyOutCallObserver;
// 整个程序的结果是实现从电话 4761111 外拨到电话 5551212
public class Outcall {
public static final void main(String args[]) {
// 产生一个 Provider 实例
Provider myprovider = null;
try {
JtapiPeer peer = JtapiPeerFactory.getJtapiPeer(null);
myprovider = peer.getProvider(null);
} catch (Exception excp) {
System.out.println("Can't get Provider: " + excp.toString());
System.exit(0);
}
// 利用 Provider 实例产生一个和电话 4761111 的 Address 实例
Address origaddr = null;
Terminal origterm = null;
try {
origaddr = myprovider.getAddress("4761111");
// 得到这个 Address 上绑定的 Terminial( 物理话机实例 ) 列表,取出第一个。
// 这一操作,可以理解为对于电话 4761111 ,有可能不止绑定了一部分机。
// 如果有若干分机,任意取出一个可用的进行后续操作。
Terminal[] terminals = origaddr.getTerminals();
if (terminals == null) {
System.out.println("No Terminals on Address.");
System.exit(0);
}
origterm = terminals[0];
} catch (Exception excp) {
// 处理异常 ;
}
// 建立一个空的 Call 对象
Call mycall = null;
try {
mycall = myprovider.createCall();
// 在这个 Call 上绑定一个 Observer ,这个 Observer 可以
// 对整个外拨过程进行消息分析。( Observer 的代码下文有讲解)
mycall.addObserver(new MyOutCallObserver());
} catch (Exception excp) {
// 处理异常
}
// 进行外拨,所需的资源有刚才得到的 Address 、 Terminal 、 Call 对象
// 以及被叫号码
try {
mycall.connect(origterm, origaddr, "5551212");
} catch (Exception excp) {
// 处理异常
}
}
}
下面对 Observer 的代码进行简单的分析
import javax.telephony.*;
import javax.telephony.events.*;
// 类 MyOutCallObserver 实现了接口 CallObserver 的若干方法
//MyOutCallObserver 对 Call 相关的各种事件进行了处理。
public class MyOutCallObserver implements CallObserver {
public void callChangedEvent(CallEv[] evlist) {
for (int i = 0; i < evlist.length; i++) {
// 判断是否得到有关 Address 的事件
if (evlist[i] instanceof AddrEv) {
// 如果是有关于 Address 的事件,则利用这个事件获得相关的 Address 实例
String name = null;
try {
Address addr = ((AddrEv )evlist[i]) getAddress();
// 从这个 Address 实例获取主叫号码
name = addr.getName();
} catch (Exception excp) {
// 处理异常
}
String msg = "Connection to Address: " + name + " is ";
// 分析这个事件的具体类型并进行相应处理
// 这个事件属于“震铃”事件,进行相应处理。
if (evlist[i].getID() == ConnAlertingEv.ID) {
System.out.println(msg + "ALERTING");
}
// 这个事件属于“来话接起”事件,进行相应处理。
else if (evlist[i].getID() == ConnConnectedEv.ID) {
System.out.println(msg + "CONNECTED");
}
// 这个事件属于“挂机”事件,进行相应处理。
else if (evlist[i].getID() == ConnDisconnectedEv.ID) {
System.out.println(msg + "DISCONNECTED");
}
}
}
}
}
可以看出, MyOutCallObserver 能够获取任何与 Call 相关的事件,在 MyOutCallObserver 适当添加代码,即可以实现对来话消息进行捕获、分析、以及处理。
综上所述,利用 JTAPI 可以方便的用 JAVA 搭建 CTI 程序。如果把 JTAPI 编写的程序放置到 APPLET 中,就能够轻松实现 B/S 模式的 CTI 应用程序。