CTI技術(shù)步入JAVA世界的階梯
—JTAPI簡(jiǎn)介
華勝天成公司 呂華 2001/05/29
目錄
4.1 外撥模塊
4.2 消息處理模塊
5. 結(jié)尾
什么是JTAPI?
談JTAPI,首先得了解什么是CTI。CTI(Computer Telephony Integration)就是計(jì)算機(jī)電話集成技術(shù),它是目前國(guó)內(nèi)正火的呼叫中心熱潮的核心技術(shù)。JTAPI主要是為CTI技術(shù)服務(wù)。JTAPI(Java Telephone API)是一套專門為JAVA語(yǔ)言提供的與電話應(yīng)用相關(guān)的程序接口,它定義了一組跨平臺(tái)、跨廠家的電話應(yīng)用程序?qū)ο竽P。使?/font>JTAPI提供的對(duì)象,我們就可以簡(jiǎn)單方便地用軟件實(shí)現(xiàn)各種CTI技術(shù)。
由于JTAPI的誕生是由若干知名計(jì)算機(jī)、通訊廠商(Sun, Lucent Technologies, Nortel, Novell, Intel, and IBM)聯(lián)合努力的結(jié)果,利用JTAPI編寫的CTI程序甚至可以操作若干種電話交換機(jī),這些交換機(jī)包括Lucnet、Nortel等等廠家。
為什么要使用JTAPI?
JTAPI的主要特點(diǎn)歸納如下:
簡(jiǎn)化CTI程序的編寫。
提供一套可以擴(kuò)展的框架結(jié)構(gòu),可以平滑的使Client/Server結(jié)構(gòu)的程序過(guò)渡到Browser/Server結(jié)構(gòu)。
對(duì)已有的傳統(tǒng)CTI程序接口,如TSAPI、SunXTL、以及TAPI進(jìn)行WEB方向的擴(kuò)展。
可以運(yùn)行于任何JAVA可以運(yùn)行的平臺(tái)。
利用以上優(yōu)點(diǎn),采用JTAPI技術(shù)搭建的呼叫中心就可以平滑的過(guò)渡到Internet時(shí)代。
JTAPI的應(yīng)用場(chǎng)合
目前JTAPI主要應(yīng)用于呼叫中心領(lǐng)域,利用它還可以編寫包括自動(dòng)撥號(hào)、語(yǔ)音郵件、傳真接收等各類軟件。特別在互聯(lián)網(wǎng)呼叫中心領(lǐng)域更是大有用武之地。比如Lucent 推出的ICC(Internet Call Center)就是一個(gè)典型的例子。整個(gè)ICC系統(tǒng)從技術(shù)上劃分,可以分為3部分:管理、CTI、工作流。三個(gè)部分都用JAVA開(kāi)發(fā),其中CTI部分使用JTAPI1.3。利用JAVA的優(yōu)勢(shì),ICC可以運(yùn)行在NT、SALORIS等各種平臺(tái)之上。
目前的版本
目前JTAPI的應(yīng)用案例大多采用JTAPI ver 1.2版本,不過(guò)JTAPI ver 1.3也已經(jīng)逐漸普及。下文將以JTAPI1.2為例進(jìn)行講解。
對(duì)象包結(jié)構(gòu):JTAPI1.2由18個(gè)JAVA對(duì)象包(PACKAGE)組成,每一個(gè)包分別提供CTI應(yīng)用的一個(gè)方面的功能。比如呼叫控制包(javax.telephony.callcontrol)、用戶數(shù)據(jù)包(javax.telephony.privatedata)、核心包(javax.telephony)、呼叫中心專用包(javax.telephony.callcenter)等等。這樣做的目的是可以把CTI應(yīng)用也功能化、模塊化,使整個(gè)CTI應(yīng)用的子功能模塊相對(duì)獨(dú)立。如下圖所示:
對(duì)象包分析:JTAPI的對(duì)象包除了核心包以外都提供自己獨(dú)特的功能。核心包比較特殊,按照面向?qū)ο蟮睦碚,核心包是其它包的父類。核心包只能夠提供最基本的電話功能,而其它?duì)象包則是核心包的擴(kuò)展。比如針對(duì)核心包中的對(duì)象Call,呼叫控制包有專門的對(duì)象CallControlCall,后者具有前者的所有屬性和方法,并在前者的基礎(chǔ)上添加了專門的屬性和方法。比如CallControlCall和Call都有方法connect(),而CallControlCall更有自己獨(dú)有的方法conference()、transfer()。簡(jiǎn)單的說(shuō),實(shí)際上核心包的對(duì)象Call可以提供基本的電話功能,如外撥、接聽(tīng)、掛機(jī)等。而呼叫控制包的對(duì)象CallControlCall不僅有基本的電話功能,還有特殊的會(huì)議電話、轉(zhuǎn)接電話、監(jiān)聽(tīng)電話等功能。同樣呼叫中心專用包的電話對(duì)象CallCenterCall也是一樣,它的特殊功能有預(yù)撥電話、得到用戶數(shù)據(jù)等方法。
JTAPI電話模型樹(shù)
程序員在掌握利用JTAPI編寫CTI程序之前,首先得搞清JTAPI最基本的電話模型,這個(gè)模型是搭建CTI程序的基礎(chǔ),它可以以樹(shù)狀結(jié)構(gòu)表現(xiàn)出來(lái)(如下圖)。
可以說(shuō),程序員心里有了這幅樹(shù)狀電話模型圖,從簡(jiǎn)單的外撥電話到復(fù)雜的兩路來(lái)話相互切換功能都可以很方便的實(shí)現(xiàn)。
構(gòu)成電話模型圖的元素都是JTAPI核心包的主要對(duì)象,每個(gè)對(duì)象都代表了CTI領(lǐng)域中的一個(gè)物理或邏輯的實(shí)體。由圖可知,這些實(shí)體之間有著相互的聯(lián)系。利用每個(gè)實(shí)體的功能以及實(shí)體之間的關(guān)系,程序員就可以組合出各種各樣的CTI程序。下面簡(jiǎn)單介紹電話模型中涉及的最主要的幾個(gè)實(shí)體。
Provider Object:
Provider是對(duì)和CTI技術(shù)相關(guān)的硬件設(shè)備的一個(gè)抽象,它可能代表工控機(jī)上插的一塊板塊,也可能代表一臺(tái)復(fù)雜的DEFINITY ECS。Provider把具體的硬件設(shè)備和程序員隔離開(kāi)來(lái),使程序員不必懂得復(fù)雜的硬件設(shè)備。這有些類似于數(shù)據(jù)庫(kù)編程時(shí)遇到的ODBC概念,數(shù)據(jù)庫(kù)程序員不必知道后臺(tái)的數(shù)據(jù)庫(kù)是ORACLE還是簡(jiǎn)單的ACCESS。程序員只需知道經(jīng)過(guò)初始化,就能得到一個(gè)可以訪問(wèn)后臺(tái)資源的實(shí)例即可。利用Provider ,可以輕易的實(shí)現(xiàn)CTI程序和硬件的無(wú)關(guān)性。程序不變,后臺(tái)的PBX可以從Lucent Technologies的產(chǎn)品換成Nortel的產(chǎn)品。
Call Object:
CALL是對(duì)一次呼叫過(guò)程進(jìn)行抽象,它的屬性記錄了這個(gè)呼叫目前的信息,調(diào)用Call的方法,可以引導(dǎo)這個(gè)呼叫的發(fā)展。
Address Object
簡(jiǎn)單的說(shuō),Address Object是對(duì)電話號(hào)碼的抽象。它是對(duì)一部邏輯電話的描述,和它對(duì)應(yīng)的不是一部物理電話,所以一個(gè)Address Object可能對(duì)應(yīng)了多個(gè)物理話機(jī)。
Terminal Object:
Terminal Object描述了一部具體的物理話機(jī)和其相關(guān)的屬性。每個(gè)Terminal Object至少存在一個(gè)Address Object與之對(duì)應(yīng)。
Connection Object:
一個(gè)Connection Object是對(duì)Call Object和Address Object之間的通訊連接的抽象。通過(guò)對(duì)Connection Object的屬性查看,可以分析出當(dāng)前Call Object與Address Object的連接狀態(tài)信息。Connection Object的狀態(tài)有IDLE、ACTIVE、RINGING、DROPPED等等。
軟電話功能調(diào)用和電話消息處理
利用JTAPI進(jìn)行CTI應(yīng)用程序的編寫,工作上可以分為兩個(gè)部分。首先是客戶端主動(dòng)調(diào)用后臺(tái)PBX資源,實(shí)現(xiàn)軟電話功能的調(diào)用;其次是客戶端對(duì)后臺(tái)資源傳來(lái)的大量電話消息進(jìn)行分析,實(shí)現(xiàn)消息分發(fā)與分揀。
利用Call Object能夠進(jìn)行各種軟電話調(diào)用的工作,如call.connect()可以實(shí)現(xiàn)撥打一個(gè)電話;call. conference()可以實(shí)現(xiàn)與第三方會(huì)議一個(gè)電話;call.transfer()可以實(shí)現(xiàn)把接起的電話進(jìn)行轉(zhuǎn)接到第三方的操作;利用諸如以上所述的種種方法,可以任意搭建出復(fù)雜功能的CTI應(yīng)用。
JTAPI利用OBSERVER的概念來(lái)進(jìn)行各種消息處理。OBSERVER直譯過(guò)來(lái)是觀察者的意思,顧名思義,OBSERVER就是對(duì)每個(gè)呼叫對(duì)象進(jìn)行“觀察”工作。它的工作流程是“綁定到專門對(duì)象》觀察專門對(duì)象》獲取專門對(duì)象的信息》分析并匯報(bào)專門對(duì)象的信息”。
針對(duì)前文JTAPI對(duì)象樹(shù)提到的各種對(duì)象,都有專門的OBSERVER為之“服務(wù)”。比如對(duì)Provider,有ProviderObserver,它可以隨時(shí)匯報(bào)目前被監(jiān)控的Provider的狀態(tài),如Provider.OUT_OF_SERVCE, Provider.IN_SERVICE等等;針對(duì)Terminal,有TerminalObserver,它能匯報(bào)出一個(gè)Terminal的所有事件以及相關(guān)信息,CTI應(yīng)用中非常重要的數(shù)據(jù)主叫號(hào)碼、同步數(shù)據(jù)等就可以在這里得到。類似的,還有AddressObserver、CallObserver等多種Observer。所有的Observer都是javax.telephony.observer的子類。
下面提供一個(gè)簡(jiǎn)單的軟電話外撥程序代碼。代碼分為“外撥”模塊,以及“監(jiān)控”模塊。這兩個(gè)模塊分別和前文提到的“ 客戶端主動(dòng)調(diào)用后臺(tái)PBX資源”,以及“客戶端對(duì)后臺(tái)資源傳來(lái)的電話消息進(jìn)行分析”相對(duì)應(yīng)。通過(guò)對(duì)這個(gè)例子的分析,我們可以很快掌握利用JTAPI開(kāi)發(fā)CTI應(yīng)用程序的基本思想。
首先是“外撥”模塊,這個(gè)部分的程序流程圖如上圖所示,以下是代碼分析。
import javax.telephony.*;
import javax.telephony.events.*;
import MyOutCallObserver;
//整個(gè)程序的結(jié)果是實(shí)現(xiàn)從電話4761111外撥到電話5551212
public class Outcall {
public static final void main(String args[]) {
// 產(chǎn)生一個(gè)Provider實(shí)例
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實(shí)例產(chǎn)生一個(gè)和電話4761111的Address實(shí)例
Address origaddr = null;
Terminal origterm = null;
try {
origaddr = myprovider.getAddress("4761111");
//得到這個(gè)Address上綁定的Terminial(物理話機(jī)實(shí)例)列表,取出第一個(gè)。
//這一操作,可以理解為對(duì)于電話4761111,有可能不止綁定了一部分機(jī)。
//如果有若干分機(jī),任意取出一個(gè)可用的進(jìn)行后續(xù)操作。
Terminal[] terminals = origaddr.getTerminals();
if (terminals == null) {
System.out.println("No Terminals on Address.");
System.exit(0);
}
origterm = terminals[0];
} catch (Exception excp) {
//處理異常;
}
//建立一個(gè)空的Call 對(duì)象
Call mycall = null;
try {
mycall = myprovider.createCall();
//在這個(gè)Call上綁定一個(gè)Observer,這個(gè)Observer可以
//對(duì)整個(gè)外撥過(guò)程進(jìn)行消息分析。(Observer的代碼下文有講解)
mycall.addObserver(new MyOutCallObserver());
} catch (Exception excp) {
//處理異常
}
//進(jìn)行外撥,所需的資源有剛才得到的Address、Terminal、Call對(duì)象
//以及被叫號(hào)碼
try {
mycall.connect(origterm, origaddr, "5551212");
} catch (Exception excp) {
//處理異常
}
}
}
下面對(duì)Observer的代碼進(jìn)行簡(jiǎn)單的分析
import javax.telephony.*;
import javax.telephony.events.*;
//類MyOutCallObserver實(shí)現(xiàn)了接口CallObserver的若干方法
//MyOutCallObserver對(duì)Call相關(guān)的各種事件進(jìn)行了處理。
public class MyOutCallObserver implements CallObserver {
public void callChangedEvent(CallEv[] evlist) {
for (int i = 0; i < evlist.length; i++) {
//判斷是否得到有關(guān)Address的事件
if (evlist[i] instanceof AddrEv) {
//如果是有關(guān)于Address的事件,則利用這個(gè)事件獲得相關(guān)的Address實(shí)例
String name = null;
try {
Address addr = ((AddrEv )evlist[i]) getAddress();
//從這個(gè)Address實(shí)例獲取主叫號(hào)碼
name = addr.getName();
} catch (Exception excp) {
//處理異常
}
String msg = "Connection to Address: " + name + " is ";
//分析這個(gè)事件的具體類型并進(jìn)行相應(yīng)處理
//這個(gè)事件屬于“震鈴”事件,進(jìn)行相應(yīng)處理。
if (evlist[i].getID() == ConnAlertingEv.ID) {
System.out.println(msg + "ALERTING");
}
//這個(gè)事件屬于“來(lái)話接起”事件,進(jìn)行相應(yīng)處理。
else if (evlist[i].getID() == ConnConnectedEv.ID) {
System.out.println(msg + "CONNECTED");
}
//這個(gè)事件屬于“掛機(jī)”事件,進(jìn)行相應(yīng)處理。
else if (evlist[i].getID() == ConnDisconnectedEv.ID) {
System.out.println(msg + "DISCONNECTED");
}
}
}
}
}
可以看出,MyOutCallObserver能夠獲取任何與Call相關(guān)的事件,在MyOutCallObserver適當(dāng)添加代碼,即可以實(shí)現(xiàn)對(duì)來(lái)話消息進(jìn)行捕獲、分析、以及處理。
綜上所述,利用JTAPI可以方便的用JAVA搭建CTI程序。如果把JTAPI編寫的程序放置到APPLET中,就能夠輕松實(shí)現(xiàn)B/S模式的CTI應(yīng)用程序。
華勝天成公司供稿,CTI論壇編輯 2001/05/29
華勝天成攜手八百客 共同開(kāi)拓移動(dòng)商務(wù)市場(chǎng) 2009-09-25 |
華勝天成率先獲三大國(guó)際質(zhì)量體系認(rèn)證 2009-09-15 |
沖入三甲,華勝天成IT服務(wù)引擎全面加速 2009-08-27 |
中移動(dòng)主機(jī)和存儲(chǔ)招標(biāo)完成 華勝天成成為贏家 2009-08-21 |
華勝天成徐靜江:統(tǒng)一通信急需產(chǎn)業(yè)鏈整合“領(lǐng)頭羊” 2009-06-08 |