首頁>>廠商>>系統(tǒng)集成及應(yīng)用軟件開發(fā)商>>華勝天成

CTI技術(shù)步入JAVA世界的階梯

—JTAPI簡介

華勝天成公司 呂華 2001/05/29


目錄

1. 什么是JTAPI

2. JTAPI的結(jié)構(gòu)

3. 利用JTAPI搭建CTI程序

4. 應(yīng)用實(shí)例分析

4.1 外撥模塊

4.2 消息處理模塊

5. 結(jié)尾


1. 什么是JTAPI

    1. 什么是JTAPI

    2. JTAPI,首先得了解什么是CTICTI(Computer Telephony Integration)就是計(jì)算機(jī)電話集成技術(shù),它是目前國內(nèi)正火的呼叫中心熱潮的核心技術(shù)。JTAPI主要是為CTI技術(shù)服務(wù)。JTAPI(Java Telephone API)是一套專門為JAVA語言提供的與電話應(yīng)用相關(guān)的程序接口,它定義了一組跨平臺、跨廠家的電話應(yīng)用程序?qū)ο竽P。使?/font>JTAPI提供的對象,我們就可以簡單方便地用軟件實(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等等廠家。

    3. 為什么要使用JTAPI?

    4. JTAPI的主要特點(diǎn)歸納如下:

        1. 簡化CTI程序的編寫。

        2. 提供一套可以擴(kuò)展的框架結(jié)構(gòu),可以平滑的使Client/Server結(jié)構(gòu)的程序過渡到Browser/Server結(jié)構(gòu)。

        3. 對已有的傳統(tǒng)CTI程序接口,如TSAPI、SunXTL、以及TAPI進(jìn)行WEB方向的擴(kuò)展。

        4. 可以運(yùn)行于任何JAVA可以運(yùn)行的平臺。

      利用以上優(yōu)點(diǎn),采用JTAPI技術(shù)搭建的呼叫中心就可以平滑的過渡到Internet時代。

    5. JTAPI的應(yīng)用場合

    6. 目前JTAPI主要應(yīng)用于呼叫中心領(lǐng)域,利用它還可以編寫包括自動撥號、語音郵件、傳真接收等各類軟件。特別在互聯(lián)網(wǎng)呼叫中心領(lǐng)域更是大有用武之地。比如Lucent 推出的ICC(Internet Call Center)就是一個典型的例子。整個ICC系統(tǒng)從技術(shù)上劃分,可以分為3部分:管理、CTI、工作流。三個部分都用JAVA開發(fā),其中CTI部分使用JTAPI1.3。利用JAVA的優(yōu)勢,ICC可以運(yùn)行在NT、SALORIS等各種平臺之上。

    7. 目前的版本

目前JTAPI的應(yīng)用案例大多采用JTAPI ver 1.2版本,不過JTAPI ver 1.3也已經(jīng)逐漸普及。下文將以JTAPI1.2為例進(jìn)行講解。

2. JTAPI的結(jié)構(gòu)

  • 對象包結(jié)構(gòu):JTAPI1.218JAVA對象包(PACKAGE)組成,每一個包分別提供CTI應(yīng)用的一個方面的功能。比如呼叫控制包(javax.telephony.callcontrol)、用戶數(shù)據(jù)包(javax.telephony.privatedata)、核心包(javax.telephony)、呼叫中心專用包(javax.telephony.callcenter)等等。這樣做的目的是可以把CTI應(yīng)用也功能化、模塊化,使整個CTI應(yīng)用的子功能模塊相對獨(dú)立。如下圖所示:

  • 對象包分析:JTAPI的對象包除了核心包以外都提供自己獨(dú)特的功能。核心包比較特殊,按照面向?qū)ο蟮睦碚摚诵陌瞧渌母割。核心包只能夠提供最基本的電話功能,而其它對象包則是核心包的擴(kuò)展。比如針對核心包中的對象Call,呼叫控制包有專門的對象CallControlCall,后者具有前者的所有屬性和方法,并在前者的基礎(chǔ)上添加了專門的屬性和方法。比如CallControlCallCall都有方法connect(),而CallControlCall更有自己獨(dú)有的方法conference()、transfer()。簡單的說,實(shí)際上核心包的對象Call可以提供基本的電話功能,如外撥、接聽、掛機(jī)等。而呼叫控制包的對象CallControlCall不僅有基本的電話功能,還有特殊的會議電話、轉(zhuǎn)接電話、監(jiān)聽電話等功能。同樣呼叫中心專用包的電話對象CallCenterCall也是一樣,它的特殊功能有預(yù)撥電話、得到用戶數(shù)據(jù)等方法。

  • 3. 利用JTAPI搭建CTI程序

    JTAPI電話模型樹

    程序員在掌握利用JTAPI編寫CTI程序之前,首先得搞清JTAPI最基本的電話模型,這個模型是搭建CTI程序的基礎(chǔ),它可以以樹狀結(jié)構(gòu)表現(xiàn)出來(如下圖)。

      可以說,程序員心里有了這幅樹狀電話模型圖,從簡單的外撥電話到復(fù)雜的兩路來話相互切換功能都可以很方便的實(shí)現(xiàn)。

    構(gòu)成電話模型圖的元素都是JTAPI核心包的主要對象,每個對象都代表了CTI領(lǐng)域中的一個物理或邏輯的實(shí)體。由圖可知,這些實(shí)體之間有著相互的聯(lián)系。利用每個實(shí)體的功能以及實(shí)體之間的關(guān)系,程序員就可以組合出各種各樣的CTI程序。下面簡單介紹電話模型中涉及的最主要的幾個實(shí)體。

    Provider是對和CTI技術(shù)相關(guān)的硬件設(shè)備的一個抽象,它可能代表工控機(jī)上插的一塊板塊,也可能代表一臺復(fù)雜的DEFINITY ECS。Provider把具體的硬件設(shè)備和程序員隔離開來,使程序員不必懂得復(fù)雜的硬件設(shè)備。這有些類似于數(shù)據(jù)庫編程時遇到的ODBC概念,數(shù)據(jù)庫程序員不必知道后臺的數(shù)據(jù)庫是ORACLE還是簡單的ACCESS。程序員只需知道經(jīng)過初始化,就能得到一個可以訪問后臺資源的實(shí)例即可。利用Provider ,可以輕易的實(shí)現(xiàn)CTI程序和硬件的無關(guān)性。程序不變,后臺的PBX可以從Lucent Technologies的產(chǎn)品換成Nortel的產(chǎn)品。

    CALL是對一次呼叫過程進(jìn)行抽象,它的屬性記錄了這個呼叫目前的信息,調(diào)用Call的方法,可以引導(dǎo)這個呼叫的發(fā)展。

    簡單的說,Address Object是對電話號碼的抽象。它是對一部邏輯電話的描述,和它對應(yīng)的不是一部物理電話,所以一個Address Object可能對應(yīng)了多個物理話機(jī)。

    Terminal Object描述了一部具體的物理話機(jī)和其相關(guān)的屬性。每個Terminal Object至少存在一個Address Object與之對應(yīng)。

    一個Connection Object是對Call ObjectAddress Object之間的通訊連接的抽象。通過對Connection Object的屬性查看,可以分析出當(dāng)前Call ObjectAddress Object的連接狀態(tài)信息。Connection Object的狀態(tài)有IDLEACTIVE、RINGING、DROPPED等等。

      1. 軟電話功能調(diào)用和電話消息處理

    利用JTAPI進(jìn)行CTI應(yīng)用程序的編寫,工作上可以分為兩個部分。首先是客戶端主動調(diào)用后臺PBX資源,實(shí)現(xiàn)軟電話功能的調(diào)用;其次是客戶端對后臺資源傳來的大量電話消息進(jìn)行分析,實(shí)現(xiàn)消息分發(fā)與分揀。

    利用Call Object能夠進(jìn)行各種軟電話調(diào)用的工作,如call.connect()可以實(shí)現(xiàn)撥打一個電話;call. conference()可以實(shí)現(xiàn)與第三方會議一個電話;call.transfer()可以實(shí)現(xiàn)把接起的電話進(jìn)行轉(zhuǎn)接到第三方的操作;利用諸如以上所述的種種方法,可以任意搭建出復(fù)雜功能的CTI應(yīng)用。

    JTAPI利用OBSERVER的概念來進(jìn)行各種消息處理。OBSERVER直譯過來是觀察者的意思,顧名思義,OBSERVER就是對每個呼叫對象進(jìn)行“觀察”工作。它的工作流程是“綁定到專門對象���》觀察專門對象���》獲取專門對象的信息��》分析并匯報專門對象的信息”。

    針對前文JTAPI對象樹提到的各種對象,都有專門的OBSERVER為之“服務(wù)”。比如對Provider,有ProviderObserver,它可以隨時匯報目前被監(jiān)控的Provider的狀態(tài),如Provider.OUT_OF_SERVCE, Provider.IN_SERVICE等等;針對Terminal,有TerminalObserver,它能匯報出一個Terminal的所有事件以及相關(guān)信息,CTI應(yīng)用中非常重要的數(shù)據(jù)主叫號碼、同步數(shù)據(jù)等就可以在這里得到。類似的,還有AddressObserver、CallObserver等多種Observer。所有的Observer都是javax.telephony.observer的子類。

    4. 應(yīng)用實(shí)例分析

    下面提供一個簡單的軟電話外撥程序代碼。代碼分為“外撥”模塊,以及“監(jiān)控”模塊。這兩個模塊分別和前文提到的“ 客戶端主動調(diào)用后臺PBX資源”,以及“客戶端對后臺資源傳來的電話消息進(jìn)行分析”相對應(yīng)。通過對這個例子的分析,我們可以很快掌握利用JTAPI開發(fā)CTI應(yīng)用程序的基本思想。

    4.1外撥模塊

    首先是“外撥”模塊,這個部分的程序流程圖如上圖所示,以下是代碼分析。

    import javax.telephony.*;

    import javax.telephony.events.*;

    import MyOutCallObserver;

     

    //整個程序的結(jié)果是實(shí)現(xiàn)從電話4761111外撥到電話5551212

    public class Outcall {

    public static final void main(String args[]) {

    // 產(chǎn)生一個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)生一個和電話4761111Address實(shí)例

    Address origaddr = null;

    Terminal origterm = null;

    try {

    origaddr = myprovider.getAddress("4761111");

    //得到這個Address上綁定的Terminial(物理話機(jī)實(shí)例)列表,取出第一個。

    //這一操作,可以理解為對于電話4761111,有可能不止綁定了一部分機(jī)。

    //如果有若干分機(jī),任意取出一個可用的進(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) {

    //處理異常;

    }

    //建立一個空的Call 對象

    Call mycall = null;

    try {

    mycall = myprovider.createCall();

    //在這個Call上綁定一個Observer,這個Observer可以

    //對整個外撥過程進(jìn)行消息分析。(Observer的代碼下文有講解)

    mycall.addObserver(new MyOutCallObserver());

    } catch (Exception excp) {

    //處理異常

    }

    //進(jìn)行外撥,所需的資源有剛才得到的Address、Terminal、Call對象

    //以及被叫號碼

    try {

    mycall.connect(origterm, origaddr, "5551212");

    } catch (Exception excp) {

    //處理異常

    }

    }

    }

    4.2消息處理模塊

    下面對Observer的代碼進(jìn)行簡單的分析

    import javax.telephony.*;

    import javax.telephony.events.*;

    //MyOutCallObserver實(shí)現(xiàn)了接口CallObserver的若干方法

    //MyOutCallObserverCall相關(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的事件,則利用這個事件獲得相關(guān)的Address實(shí)例

    String name = null;

    try {

    Address addr = ((AddrEv )evlist[i]) getAddress();

    //從這個Address實(shí)例獲取主叫號碼

    name = addr.getName();

    } catch (Exception excp) {

    //處理異常

    }

    String msg = "Connection to Address: " + name + " is ";

    //分析這個事件的具體類型并進(jìn)行相應(yīng)處理

    //這個事件屬于“震鈴”事件,進(jìn)行相應(yīng)處理。

    if (evlist[i].getID() == ConnAlertingEv.ID) {

    System.out.println(msg + "ALERTING");

    }

    //這個事件屬于“來話接起”事件,進(jìn)行相應(yīng)處理。

    else if (evlist[i].getID() == ConnConnectedEv.ID) {

    System.out.println(msg + "CONNECTED");

    }

    //這個事件屬于“掛機(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)對來話消息進(jìn)行捕獲、分析、以及處理。

    5. 結(jié)尾

    綜上所述,利用JTAPI可以方便的用JAVA搭建CTI程序。如果把JTAPI編寫的程序放置到APPLET中,就能夠輕松實(shí)現(xiàn)B/S模式的CTI應(yīng)用程序。

    華勝天成公司供稿,CTI論壇編輯 2001/05/29



    相關(guān)鏈接:
    華勝天成攜手八百客 共同開拓移動商務(wù)市場 2009-09-25
    華勝天成率先獲三大國際質(zhì)量體系認(rèn)證 2009-09-15
    沖入三甲,華勝天成IT服務(wù)引擎全面加速 2009-08-27
    中移動主機(jī)和存儲招標(biāo)完成 華勝天成成為贏家 2009-08-21
    華勝天成徐靜江:統(tǒng)一通信急需產(chǎn)業(yè)鏈整合“領(lǐng)頭羊” 2009-06-08