1引言
TAPI:“電話應(yīng)用程序接口”的簡(jiǎn)稱( Te lephonyApplication Programm ing Interface )。它是微軟與INTEL共同開(kāi)發(fā)的用于直接控制電話通信系統(tǒng)的函數(shù)集,是微軟計(jì)算機(jī)電話集成( CTI)計(jì)劃的核心,是微軟的w indow s開(kāi)放式服務(wù)體系(WOSA )的一部分。它將電話、電話網(wǎng)和計(jì)算機(jī)的功能進(jìn)一步集成起來(lái),現(xiàn)在的計(jì)算機(jī)技術(shù)不僅可以處理語(yǔ)音通信等低級(jí)應(yīng)用,還能處理視頻等高級(jí)應(yīng)用。
計(jì)算機(jī)技術(shù)使得電話有軟件化趨向,其優(yōu)勢(shì)是使電話可以變得靈活,方便地按具體要求實(shí)現(xiàn)電話的基本功能以及附加功能。軟電話需要和通信硬件設(shè)備交互,目前主要有兩種實(shí)現(xiàn)方法:一是利用電腦板卡和設(shè)備公司提供的DLL來(lái)實(shí)現(xiàn),但功能有一定的局限性;二是利用協(xié)議公開(kāi)的標(biāo)準(zhǔn)編程接口,但難度大,參數(shù)復(fù)雜不易實(shí)現(xiàn)。本設(shè)計(jì)利用標(biāo)準(zhǔn)編程接口TAPI,為了便于系統(tǒng)的集成和開(kāi)發(fā),重點(diǎn)介紹以統(tǒng)一短消息的形式實(shí)現(xiàn)應(yīng)用系統(tǒng)和通信設(shè)備之間交互的TAPI模塊化設(shè)計(jì)方法。該模塊化組件與系統(tǒng)集成度高,可以方便的實(shí)現(xiàn)各種電話與控制功能。
2 TAPI作用及結(jié)構(gòu)分析
2. 1 TAPI在軟電話系統(tǒng)中的作用
由于TAPI應(yīng)用是電訊應(yīng)用,需要連接PC電腦和通訊硬件設(shè)備,TAPI運(yùn)行在PC機(jī)上并監(jiān)控通訊硬件設(shè)備,所以首要任務(wù)是建立硬件環(huán)境。對(duì)于VOIP應(yīng)用通信系統(tǒng)來(lái)說(shuō),軟交換服務(wù)器是IP電話網(wǎng)的控制核心,同時(shí)落地接入PSTN (公共電話網(wǎng)),PC機(jī)與軟交換服務(wù)器處于同一網(wǎng)段,TAPI與硬件交互也將通過(guò)網(wǎng)絡(luò)使用TCP/ IP協(xié)議連接。本設(shè)計(jì)的開(kāi)發(fā)平臺(tái)是基于如下軟交換系統(tǒng),系統(tǒng)如圖1所示。
圖1軟交換系統(tǒng)
與新硬件被安裝到PC機(jī)上相似,需要在PC機(jī)上安裝驅(qū)動(dòng)程序,但這個(gè)驅(qū)動(dòng)并不是軟交換服務(wù)器的驅(qū)動(dòng),而是這個(gè)軟交換服務(wù)器上TAPI的驅(qū)動(dòng),這個(gè)驅(qū)動(dòng)通常被稱為“TAPI客戶端”,目的是使PC機(jī)上的TAPIDLL能“找到”該軟交換機(jī)的TAPI,并能與之通訊。
2. 2 TAPI的結(jié)構(gòu)分析
TAPI實(shí)際上是由TAPI、TSPI( Telephony Serv iceProv ider In terface)電話服務(wù)提供者接口和MSPI(M edia Serv ice Prov ider Interface)媒體服務(wù)提供接口三個(gè)部分組成的。TAPI是一個(gè)為程序員提供的工具包,它和MSPI一起使微軟視窗環(huán)境下的用戶能夠開(kāi)發(fā)電話應(yīng)用程序。TSPI也是一個(gè)為程序員提供的工具包,使他們能夠進(jìn)行后端服務(wù)的開(kāi)發(fā),以操縱來(lái)自符合TAPI規(guī)范的應(yīng)用請(qǐng)求,也就是說(shuō),它提供了一種連接到某一特定設(shè)備的方法。服務(wù)守護(hù)程序( TAPI Server)就是基于TSPI接口設(shè)計(jì)的,它直接驅(qū)動(dòng)通信設(shè)備并通過(guò)與TAPI動(dòng)態(tài)連接庫(kù)進(jìn)行交互為應(yīng)用程序提供電話服務(wù),其總體結(jié)構(gòu)示意圖如圖2所示。
圖2 TAPI總體結(jié)構(gòu)示意圖
3 TAPI的模塊化設(shè)計(jì)
本設(shè)計(jì)主要以C++類的設(shè)計(jì)思想,在MFC (微軟基礎(chǔ)類)的框架下實(shí)現(xiàn)對(duì)TAPI的封裝。由于TAPI的函數(shù)調(diào)用非常復(fù)雜,參數(shù)個(gè)數(shù)和形式多種多樣,為了便于系統(tǒng)集成和應(yīng)用程序的開(kāi)發(fā),設(shè)計(jì)了3個(gè)控制類: TAPI應(yīng)用控制類Tap iApp lication、TAPI線路控制類Tap iLine、TAPI通話控制類Tap iChannel.Tap iApplication是對(duì)整個(gè)TAPI的監(jiān)控,是應(yīng)用程序和通信設(shè)備的交互站; TapiL ine是對(duì)TAPI線路的管理,它根據(jù)應(yīng)用指令操作線路通話; Tap iChannel是對(duì)具體一路通話的管理,它根據(jù)線路指令操作對(duì)應(yīng)的通信設(shè)備并實(shí)時(shí)報(bào)告設(shè)備狀態(tài),這3個(gè)類的調(diào)用關(guān)系如圖3所示。
圖3 TAPI調(diào)用結(jié)構(gòu)
首先需要TAPI的定義文件。由于TAPI與W indow s集成,定義文件在安裝好W indow s操作系統(tǒng)后就可以被找到。以C語(yǔ)言方式提供的TAPI. H和TAPI32. dll文件,包含了所有TAPI結(jié)構(gòu)和功能的定義。如果使用C、VC或VB開(kāi)發(fā)應(yīng)用,只要在相關(guān)的開(kāi)發(fā)環(huán)境中設(shè)置,將文件引入所要開(kāi)發(fā)的應(yīng)用項(xiàng)目即可;如果使用De lph i開(kāi)發(fā),需要將TAPI. H轉(zhuǎn)化為Delphi中的頭文件,再將這個(gè)pas文件引入即可;如果使用Java開(kāi)發(fā),需要TAPI的c lass文件。
該設(shè)計(jì)以VC的MFC為例對(duì)TAPI的功能進(jìn)行模塊化實(shí)現(xiàn),開(kāi)發(fā)過(guò)程不需要通訊硬件的支持,調(diào)試和運(yùn)行需要與通訊硬件交互,且該組件能很好的向上向下兼容。
3. 1 TAPI應(yīng)用控制類設(shè)計(jì)
TapiA pplicat ion是對(duì)TAPI的管理,它處于調(diào)用結(jié)構(gòu)的頂層,通過(guò)下層的服務(wù)為上層應(yīng)用程序提供透明、規(guī)格化的信息服務(wù)。在通過(guò)TAPI進(jìn)行遠(yuǎn)程通信程序設(shè)計(jì)時(shí),必不可少的是要調(diào)用lineIn itia lizeEx( )函數(shù)以初始化TAPI,以及調(diào)用lineOpen( )函數(shù)以打開(kāi)線路,然后才能使用TAPI進(jìn)行監(jiān)控和代理呼叫等功能。除此之外,為了編寫可靠的遠(yuǎn)程通信程序,還應(yīng)調(diào)用有關(guān)檢測(cè)線路設(shè)備能力的函數(shù)lineGetDevC aps( ),檢測(cè)TAPI版本兼容性函數(shù)lineN egotiateAPIV ersion( ),檢測(cè)線路當(dāng)前使用狀態(tài)的函數(shù)lineSetStatusM essages( )等以適應(yīng)各種情況。最后調(diào)用lineC lose( )函數(shù)來(lái)關(guān)閉線路,調(diào)用lineShutdow n( )函數(shù)將應(yīng)用程序與TAPI斷開(kāi)。
為了使TAPI便于操縱,適應(yīng)不同的應(yīng)用開(kāi)發(fā)環(huán)境,本文設(shè)計(jì)了In itia liseTAPI( )這個(gè)不要參數(shù)的初始化函數(shù),把初始化和協(xié)商TAPI版本所需要的參數(shù)通過(guò)內(nèi)聯(lián)機(jī)制進(jìn)行整合,避免了過(guò)多的參數(shù)傳遞。初始化成功后表明應(yīng)用程序已經(jīng)獲得TAPI的數(shù)據(jù)結(jié)構(gòu)和應(yīng)用句柄。為了便于對(duì)通信設(shè)備的控制,需要和通信設(shè)備取得聯(lián)系并打開(kāi)通信線路。本文設(shè)計(jì)了OpenValidL ines( )這個(gè)不加參數(shù)的函數(shù),只要成功返回后就可以對(duì)通信線路、通信設(shè)備進(jìn)行控制了,其函數(shù)聲明如下:
class T apiApplicat ion
{
pub lic:
Tap iApp lication( CTap isamp leD lg lg) ;
~ T apiApplicat ion( );
/ / TAPI helper funct ions
BOOL InitialiseTAPI( ) ; / / Initialize TAPI
void ShutdownTAPI( ); / /C lose TAPI
void OpenV alidL ines ( ) ; / /Open the lines o fTAPI
/ / Variab les
CTapisamp leD lg lg;
HLINEAPP m_hLineApp; / / App lication handle
DWORD m_NumDevs; / / Number of dev ices
DWORD * m _ ApiV ersions; / / API versions
PTAPILINE* m_pL ines; / / Device variables
LONG m _Curren tL ine; / / currently se lected
ADDRARRAY m_AddressA rray;
};
TAPI初始化工作和有效線路的打開(kāi)這些復(fù)雜的功能,通過(guò)函數(shù)內(nèi)置或全局變量傳遞,整合成一個(gè)不要參數(shù)并且返回值為布爾類型的API函數(shù)。應(yīng)用程序只要調(diào)用這兩個(gè)函數(shù)就可以實(shí)現(xiàn)對(duì)TAPI設(shè)備的監(jiān)控和操作。
3. 2 TAPI線路控制類設(shè)計(jì)
Tap iLine是對(duì)TAPI線路的管理,為了使程序的結(jié)構(gòu)更為清晰和易于升級(jí)以及為了使TAPI能夠更方便的移植到別的應(yīng)用程序中,把TAPI函數(shù)中用于實(shí)現(xiàn)功能的一部分函數(shù)和數(shù)據(jù)結(jié)構(gòu)封裝成一個(gè)類來(lái)使用。下面就是通過(guò)V ISUALC + +編程實(shí)現(xiàn)對(duì)TAPI線路控制函數(shù)封裝類的頭文件。
class T apiL ine {
private:
TapiA pplicat ion ainA pp; / / paren t object
DWORD m _LineID; / / My index
HLINE m _ hL ine; / / M y line hand le typedef
CL ist
ExtensionLis;t m_extensionLis;t
/ / the list of call channe l
public:
TapiL ine( TapiApp licat ion
~ Tap iLine( ) ;
vo id OnEvent ( DWORD Device, DWORD Msg,
DWORD Param1, DWORD Param2, DWORD Param3);
HRESULT Open ( DWORD L ineID, DWORD
Ca llPr iv ilege, DWORD Med iaModes);
TapiChanne*l getChannel( DW dwAddressID);
TapiChanne*l getChanne lCall(HCALL hcall) ;
/ / Functions to support te lephony commands
BOOL M akeCa ll ( DWORD dwAddressID, LPCT??
STR pszA ddress) ;
vo id D ropCall( DWORD dwA ddressID) ;
vo idHo ldCall( DWORD dwA ddressID) ;
vo id UnholdC all( DWORD dwAddressID) ;
vo id B lindT ransferCa ll ( DWORD dwAddressID,
LPCTSTR pszAddress) ;
vo id R edirect ( DWORD dwAddressID, LPCTSTR
pszAddress) ;
vo id Ca llStatus( DWORD dwAddressID );
vo id Ca llInfo( DWORD dwA ddressID) ;
vo id Addressstatus( ) ;
};
TapiL ine通過(guò)復(fù)雜的參數(shù)傳遞機(jī)制,封裝了大量的內(nèi)部變量,通過(guò)API接口以統(tǒng)一短消息的形式接收用戶指令同時(shí)返回線路的具體狀態(tài)。最終應(yīng)用程序通過(guò)調(diào)用Tap iL ine的具體函數(shù)對(duì)整個(gè)線路進(jìn)行操作、控制。
3. 3 TAPI通話控制類設(shè)計(jì)
TapiChanne l是對(duì)具體通話進(jìn)行控制,呼叫是TAPI開(kāi)發(fā)最常用的一個(gè)功能。調(diào)用Tap iL ine的M akeC all ( DWORD dwAddressID,LPCTSTR pszAddress),傳遞當(dāng)前號(hào)碼和目標(biāo)地址就可以進(jìn)行撥打電話,把撥打電話的其他細(xì)節(jié)進(jìn)行內(nèi)部傳遞。當(dāng)以上函數(shù)調(diào)用成功后,TSP就會(huì)控制通訊設(shè)備外呼指定的電話,該函數(shù)調(diào)用后會(huì)立刻返回到應(yīng)用程序,但該電話是否成功撥通,則是依靠消息來(lái)判斷,包括TAPI的其他功能也是這樣的處理方式。其他常用的電話功能如接聽(tīng)、掛斷、轉(zhuǎn)移、三方等都有對(duì)應(yīng)的函數(shù)實(shí)現(xiàn)。
TAPI初始化成功后,應(yīng)用程序就和TSP設(shè)備建立了聯(lián)系。應(yīng)用程序就可以通過(guò)TAPI函數(shù)控制電話線路、監(jiān)控線路狀態(tài)。函數(shù)lineOpen調(diào)用成功后進(jìn)入消息循環(huán),新生成的呼叫處于IDLE狀態(tài),隨后根據(jù)狀態(tài)指令執(zhí)行不同的操作。當(dāng)調(diào)用lineM akeC all( )后,線路狀態(tài)進(jìn)入D IAL ING、PROCEDING,當(dāng)收到異步響應(yīng)或者應(yīng)答后進(jìn)入呼叫狀態(tài)循環(huán)并依次進(jìn)入CONNECTED和DISCONNECTED,最后回到初始化狀態(tài)。當(dāng)有一路電話呼入時(shí),線路狀態(tài)進(jìn)入OFFER ING、自動(dòng)調(diào)用lineAnsw er( )后進(jìn)入ACCEPTED、PROCED ING,當(dāng)收到異步響應(yīng)或者應(yīng)答后進(jìn)入呼叫狀態(tài)循環(huán)并依次進(jìn)入CONNECTED和D ISCONNECTED,最后回到初始化狀態(tài),整個(gè)TAPI狀態(tài)圖如圖4所示。
圖4 TAPI狀態(tài)機(jī)。
3. 4 TAPI的消息處理
line ln itia lizeEx函數(shù)中第3個(gè)參數(shù)傳入的參數(shù)是方法的地址,這個(gè)方法將處理通訊設(shè)備發(fā)出來(lái)的所有TAPI消息,這個(gè)方法必須按固定的格式定義:
vo id CALLBACK Tap iLineCa llback(
DWORD dwDev ice,
DWORD nM sg,
DWORD dw Instance,
DWORD dwParam1,
DWORD dwParam2,
DWORD dwParam3)
方法名TapiL ineC allback,可以自己定義,只要將此函數(shù)名作為參數(shù)傳入linelnitializeEx,該方法就可以工作,方法參數(shù)將由通訊設(shè)備的TSP來(lái)填寫,并傳給上層應(yīng)用。關(guān)鍵是要了解在某時(shí)刻觸發(fā)此方法后,各參數(shù)值的意義以及此時(shí)收到此消息所表示的意義。要注意的是:即使完成一個(gè)最簡(jiǎn)單的通話,都會(huì)得到許多TAPI消息,這些消息以時(shí)間順序產(chǎn)生,每產(chǎn)生一個(gè)消息,就會(huì)進(jìn)入Tap iL ineCallback方法中,所以要抓住并處理關(guān)鍵消息。
以收到來(lái)電為例,主要處理2個(gè)消息。
(1)參數(shù)dwMsg = LINE _ CALLSTATE并且dwParam:l LINECALLST _OFFER ING.此時(shí)可以把表示該來(lái)電的hDev ice保存到應(yīng)用中,以便隨后的處理。
(2)參數(shù)dwMsg= LINE _CALLINFO.此時(shí)通過(guò)TAPI函數(shù)lineG etCa lllnfo可以得到來(lái)電信息,例如來(lái)電主叫號(hào)碼、被叫號(hào)碼等。當(dāng)收到來(lái)電消息后,就可以在界面上切換應(yīng)用狀態(tài)以通知用戶,或記錄數(shù)據(jù)庫(kù)等,按需要進(jìn)行處理。與來(lái)電消息類似,當(dāng)有其他電話事件發(fā)生后,就會(huì)發(fā)生相應(yīng)的消息。
4結(jié)束語(yǔ)
雖然TAPI產(chǎn)品化的應(yīng)用不多,但其提供的功能卻是強(qiáng)大的。TAPI主要用來(lái)控制通訊設(shè)備,在這個(gè)基礎(chǔ)上再實(shí)現(xiàn)更多的功能。曾經(jīng)也有人用來(lái)實(shí)現(xiàn)控制家用普通Mode;l如果用于控制交換機(jī),可以實(shí)現(xiàn)對(duì)來(lái)電排隊(duì)等高級(jí)功能;也可以建立企業(yè)呼叫中心。
研究了TAPI的工作流程,及TAPI功能模塊的實(shí)現(xiàn),并對(duì)其函數(shù)進(jìn)行了封裝設(shè)計(jì)處理。介紹了使用TAPI編寫電話控制程序的完整步驟,對(duì)TAPI在軟電話應(yīng)用系統(tǒng)中的二次開(kāi)發(fā)奠定了基礎(chǔ)。
評(píng)論
查看更多