<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 手機與無(wú)線(xiàn)通信 > 設計應用 > TAPI軟電話(huà)通信系統的模塊化設計

TAPI軟電話(huà)通信系統的模塊化設計

作者: 時(shí)間:2011-02-15 來(lái)源:網(wǎng)絡(luò ) 收藏

 1 引 言

本文引用地址:http://dyxdggzs.com/article/156710.htm

  TAPI:“電話(huà)應用程序接口”的簡(jiǎn)稱(chēng)( Te lephONyApplicaTIon Programm ing Interface )。它是微軟與INTEL共同開(kāi)發(fā)的用于直接控制電話(huà)通信系統的函數集, 是微軟計算機電話(huà)集成( CTI)計劃的核心, 是微軟的w indow s開(kāi)放式服務(wù)體系(WOSA ) 的一部分。它將電話(huà)、電話(huà)網(wǎng)和計算機的功能進(jìn)一步集成起來(lái), 現在的計算機技術(shù)不僅可以處理語(yǔ)音通信等低級應用, 還能處理視頻等高級應用。

  計算機技術(shù)使得電話(huà)有軟件化趨向, 其優(yōu)勢是使電話(huà)可以變得靈活, 方便地按具體要求實(shí)現電話(huà)的基本功能以及附加功能。軟電話(huà)需要和通信硬件設備交互, 目前主要有兩種實(shí)現方法: 一是利用電腦板卡和設備公司提供的DLL來(lái)實(shí)現, 但功能有一定的局限性; 二是利用協(xié)議公開(kāi)的標準編程接口, 但難度大, 參數復雜不易實(shí)現。本設計利用標準編程接口TAPI, 為了便于系統的集成和開(kāi)發(fā), 重點(diǎn)介紹以統一短消息的形式實(shí)現應用系統和通信設備之間交互的TAPI模塊化設計方法。該模塊化組件與系統集成度高, 可以方便的實(shí)現各種電話(huà)與控制功能。

  2 TAPI作用及結構分析

  2. 1 TAPI在軟電話(huà)系統中的作用

  由于TAPI應用是電訊應用, 需要連接PC 電腦和通訊硬件設備, TAPI運行在PC 機上并監控通訊硬件設備, 所以首要任務(wù)是建立硬件環(huán)境。對于VO IP應用通信系統來(lái)說(shuō), 軟交換服務(wù)器是IP電話(huà)網(wǎng)的控制核心, 同時(shí)落地接入PSTN (公共電話(huà)網(wǎng)) ,PC機與軟交換服務(wù)器處于同一網(wǎng)段, TAPI與硬件交互也將通過(guò)網(wǎng)絡(luò )使用TCP/ IP協(xié)議連接。本設計的開(kāi)發(fā)平臺是基于如下軟交換系統, 系統如圖1所示。

圖1 軟交換系統

  與新硬件被安裝到PC 機上相似, 需要在PC 機上安裝驅動(dòng)程序, 但這個(gè)驅動(dòng)并不是軟交換服務(wù)器的驅動(dòng), 而是這個(gè)軟交換服務(wù)器上TAPI的驅動(dòng), 這個(gè)驅動(dòng)通常被稱(chēng)為 “TAPI客戶(hù)端”, 目的是使PC 機上的TAPIDLL能“ 找到”該軟交換機的TAPI, 并能與之通訊。

  2. 2 TAPI的結構分析

  TAPI實(shí)際上是由TAPI、TSPI( Telephony Serv iceProv ider In terface) 電話(huà)服務(wù)提供者接口和MSPI(M edia Serv ice Prov ider Interface) 媒體服務(wù)提供接口三個(gè)部分組成的。TAPI是一個(gè)為程序員提供的工具包, 它和MSPI一起使微軟視窗環(huán)境下的用戶(hù)能夠開(kāi)發(fā)電話(huà)應用程序。TSPI也是一個(gè)為程序員提供的工具包, 使他們能夠進(jìn)行后端服務(wù)的開(kāi)發(fā), 以操縱來(lái)自符合TAPI規范的應用請求, 也就是說(shuō), 它提供了一種連接到某一特定設備的方法。服務(wù)守護程序( TAPI Server)就是基于TSPI接口設計的, 它直接驅動(dòng)通信設備并通過(guò)與TAPI動(dòng)態(tài)連接庫進(jìn)行交互為應用程序提供電話(huà)服務(wù), 其總體結構示意圖如圖2所示。

圖2 TAPI總體結構示意圖

  3 TAPI的模塊化設計

  本設計主要以C++ 類(lèi)的設計思想, 在MFC (微軟基礎類(lèi)) 的框架下實(shí)現對TAPI的封裝。由于TAPI的函數調用非常復雜, 參數個(gè)數和形式多種多樣, 為了便于系統集成和應用程序的開(kāi)發(fā), 設計了3個(gè)控制類(lèi): TAPI應用控制類(lèi)Tap iApp lication、TAPI線(xiàn)路控制類(lèi)Tap iLine、TAPI通話(huà)控制類(lèi)Tap iChannel。Tap iApplication是對整個(gè)TAPI的監控, 是應用程序和通信設備的交互站; TapiL ine是對TAPI線(xiàn)路的管理, 它根據應用指令操作線(xiàn)路通話(huà); Tap iChannel是對具體一路通話(huà)的管理, 它根據線(xiàn)路指令操作對應的通信設備并實(shí)時(shí)報告設備狀態(tài), 這3個(gè)類(lèi)的調用關(guān)系如圖3所示。

圖3 TAPI調用結構

  首先需要TAPI 的定義文件。由于TAPI 與W indow s集成, 定義文件在安裝好W indow s操作系統后就可以被找到。以C 語(yǔ)言方式提供的TAPI. H和TAPI32. dll文件, 包含了所有TAPI結構和功能的定義。如果使用C、VC 或VB 開(kāi)發(fā)應用, 只要在相關(guān)的開(kāi)發(fā)環(huán)境中設置, 將文件引入所要開(kāi)發(fā)的應用項目即可; 如果使用De lph i開(kāi)發(fā), 需要將TAPI. H轉化為Delphi中的頭文件, 再將這個(gè)pas文件引入即可; 如果使用Java開(kāi)發(fā), 需要TAPI的c lass文件。

  該設計以VC 的MFC 為例對TAPI的功能進(jìn)行模塊化實(shí)現, 開(kāi)發(fā)過(guò)程不需要通訊硬件的支持, 調試和運行需要與通訊硬件交互, 且該組件能很好的向上向下兼容。

  3. 1 TAPI應用控制類(lèi)設計

  TapiA pplicat ion是對TAPI的管理, 它處于調用結構的頂層, 通過(guò)下層的服務(wù)為上層應用程序提供透明、規格化的信息服務(wù)。在通過(guò)TAPI進(jìn)行遠程通信程序設計時(shí), 必不可少的是要調用lineIn itia lizeEx( )函數以初始化TAPI, 以及調用lineOpen( )函數以打開(kāi)線(xiàn)路, 然后才能使用TAPI進(jìn)行監控和代理呼叫等功能。除此之外, 為了編寫(xiě)可靠的遠程通信程序, 還應調用有關(guān)檢測線(xiàn)路設備能力的函數lineGetDevC aps( ) , 檢測TAPI版本兼容性函數lineN egotiateAPIV ersion( ) , 檢測線(xiàn)路當前使用狀態(tài)的函數lineSetStatusM essages( )等以適應各種情況。最后調用liNEC lose( )函數來(lái)關(guān)閉線(xiàn)路, 調用lineShutdow n( )函數將應用程序與TAPI斷開(kāi)。

  為了使TAPI便于操縱, 適應不同的應用開(kāi)發(fā)環(huán)境, 本文設計了In itia liseTAPI( )這個(gè)不要參數的初始化函數, 把初始化和協(xié)商TAPI版本所需要的參數通過(guò)內聯(lián)機制進(jìn)行整合, 避免了過(guò)多的參數傳遞。初始化成功后表明應用程序已經(jīng)獲得TAPI的數據結構和應用句柄。為了便于對通信設備的控制, 需要和通信設備取得聯(lián)系并打開(kāi)通信線(xiàn)路。本文設計了OpenValidL ines( )這個(gè)不加參數的函數,只要成功返回后就可以對通信線(xiàn)路、通信設備進(jìn)行控制了, 其函數聲明如下:

  class T apiApplicat ion

  {

  pub lic:

  Tap iApp lication( CTap isamp leD lgD 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 lgm_D 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初始化工作和有效線(xiàn)路的打開(kāi)這些復雜的功能, 通過(guò)函數內置或全局變量傳遞, 整合成一個(gè)不要參數并且返回值為布爾類(lèi)型的API函數。應用程序只要調用這兩個(gè)函數就可以實(shí)現對TAPI設備的監控和操作。

  3. 2 TAPI線(xiàn)路控制類(lèi)設計

  Tap iLine是對TAPI線(xiàn)路的管理, 為了使程序的結構更為清晰和易于升級以及為了使TAPI能夠更方便的移植到別的應用程序中, 把TAPI函數中用于實(shí)現功能的一部分函數和數據結構封裝成一個(gè)類(lèi)來(lái)使用。下面就是通過(guò)V ISUALC + + 編程實(shí)現對TAPI線(xiàn)路控制函數封裝類(lèi)的頭文件。

  class T apiL ine {

  private:

  TapiA pplicat ionm_m ainA pp; / / paren t object

  DWORD m _LineID; / / My index

  HLINE m _ hL ine; / / M y line hand le typedef

  CL ist Tap iChanne*l , Tap iChanne*l >

  ExtensionLis;t m_extensionLis;t

  / / the list of call channe l

  public:

  TapiL ine( TapiApp licat ionmainApp);

  ~ 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ò)復雜的參數傳遞機制, 封裝了大量的內部變量, 通過(guò)API接口以統一短消息的形式接收用戶(hù)指令同時(shí)返回線(xiàn)路的具體狀態(tài)。最終應用程序通過(guò)調用Tap iL ine的具體函數對整個(gè)線(xiàn)路進(jìn)行操作、控制。

  3. 3 TAPI通話(huà)控制類(lèi)設計

  TapiChanne l是對具體通話(huà)進(jìn)行控制, 呼叫是TAPI開(kāi)發(fā)最常用的一個(gè)功能。調用Tap iL ine 的M akeC all ( DWORD dwAddressID, LPCTSTR pszAddress) , 傳遞當前號碼和目標地址就可以進(jìn)行撥打電話(huà), 把撥打電話(huà)的其他細節進(jìn)行內部傳遞。當以上函數調用成功后, TSP 就會(huì )控制通訊設備外呼指定的電話(huà), 該函數調用后會(huì )立刻返回到應用程序, 但該電話(huà)是否成功撥通, 則是依靠消息來(lái)判斷, 包括TAPI的其他功能也是這樣的處理方式。其他常用的電話(huà)功能如接聽(tīng)、掛斷、轉移、三方等都有對應的函數實(shí)現。

  TAPI初始化成功后, 應用程序就和TSP設備建立了聯(lián)系。應用程序就可以通過(guò)TAPI函數控制電話(huà)線(xiàn)路、監控線(xiàn)路狀態(tài)。函數lineOpen調用成功后進(jìn)入消息循環(huán), 新生成的呼叫處于IDLE 狀態(tài), 隨后根據狀態(tài)指令執行不同的操作。當調用lineM akeC all( )后, 線(xiàn)路狀態(tài)進(jìn)入D IAL ING、PROCEDING, 當收到異步響應或者應答后進(jìn)入呼叫狀態(tài)循環(huán)并依次進(jìn)入CONNECTED和DISCONNECTED, 最后回到初始化狀態(tài)。當有一路電話(huà)呼入時(shí), 線(xiàn)路狀態(tài)進(jìn)入OFFER ING、自動(dòng)調用lineAnsw er( )后進(jìn)入ACCEPTED、PROCED ING, 當收到異步響應或者應答后進(jìn)入呼叫狀態(tài)循環(huán)并依次進(jìn)入CONNECTED和D ISCONNECTED, 最后回到初始化狀態(tài), 整個(gè)TAPI狀態(tài)圖如圖4所示。

圖4 TAPI狀態(tài)機。

  3. 4 TAPI的消息處理

  line ln itia lizeEx函數中第3個(gè)參數傳入的參數是方法的地址, 這個(gè)方法將處理通訊設備發(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, 可以自己定義, 只要將此函數名作為參數傳入linelnitializeEx, 該方法就可以工作, 方法參數將由通訊設備的TSP 來(lái)填寫(xiě),并傳給上層應用。關(guān)鍵是要了解在某時(shí)刻觸發(fā)此方法后, 各參數值的意義以及此時(shí)收到此消息所表示的意義。要注意的是: 即使完成一個(gè)最簡(jiǎn)單的通話(huà),都會(huì )得到許多TAPI消息, 這些消息以時(shí)間順序產(chǎn)生, 每產(chǎn)生一個(gè)消息, 就會(huì )進(jìn)入Tap iL ineCallback方法中, 所以要抓住并處理關(guān)鍵消息。

  以收到來(lái)電為例, 主要處理2個(gè)消息。

  ( 1) 參數dwMsg = LINE _ CALLSTATE 并且dwParam:l LINECALLST _OFFER ING。此時(shí)可以把表示該來(lái)電的hDev ice保存到應用中, 以便隨后的處理。

  ( 2)參數dwMsg= LINE _CALLINFO。此時(shí)通過(guò)TAPI函數lineG etCa lllnfo 可以得到來(lái)電信息, 例如來(lái)電主叫號碼、被叫號碼等。當收到來(lái)電消息后, 就可以在界面上切換應用狀態(tài)以通知用戶(hù), 或記錄數據庫等, 按需要進(jìn)行處理。與來(lái)電消息類(lèi)似, 當有其他電話(huà)事件發(fā)生后, 就會(huì )發(fā)生相應的消息。

  4 結束語(yǔ)

  雖然TAPI產(chǎn)品化的應用不多, 但其提供的功能卻是強大的。TAPI主要用來(lái)控制通訊設備, 在這個(gè)基礎上再實(shí)現更多的功能。曾經(jīng)也有人用來(lái)實(shí)現控制家用普通Mode;l 如果用于控制交換機, 可以實(shí)現對來(lái)電排隊等高級功能; 也可以建立企業(yè)呼叫中心。

  研究了TAPI的工作流程, 及TAPI功能模塊的實(shí)現, 并對其函數進(jìn)行了封裝設計處理。介紹了使用TAPI編寫(xiě)電話(huà)控制程序的完整步驟, 對TAPI在軟電話(huà)應用系統中的二次開(kāi)發(fā)奠定了基礎。

c++相關(guān)文章:c++教程


數字通信相關(guān)文章:數字通信原理


通信相關(guān)文章:通信原理


交換機相關(guān)文章:交換機工作原理




關(guān)鍵詞: 收發(fā)器

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>