TAPI協議:

http://blog.csdn.net/hejianhua/article/details/5221108




TAPI協議:
    TAPI是電話應用編程接口(Telephone Application Programming Interface)的縮寫.開發人員使用TAPI編寫的應用程序能有效的利用電話業務供應商的服務,既可以通過一個模擬Modem對其進行訪問,也可以訪問專業的用戶交換機(PBX)所提供的高級功能
TAPI機制:
  TAPI提供4個層次的服務。
  (1)輔助電話:
    輔助電話提供的函數允許非電話的應用程序方便的在程序中集中添加撥打電話的功能.它可以在應用程序中添加電話的撥號功能。輔助電話只支持交互式的呼叫撥號。
   輔助電話只支持兩個函數:
    tapiRequestMakeCall()
    tapiGetLoeationInfo()
    tapiRequestMakeCall()與Windows 95/98提供的Dialer.exe程序一起,處理尋找正確設備的所有具體事項,對該設備發出呼叫,撥打號碼,提供可以掛斷呼叫的用戶接口.

tapiGetLoeationInfo()提供獲取國家和城市代碼信息的方法,這些信息可用於構建電話號碼,供tapiRequestMakeCall使用.
LONG WINAPI tapiRequestMakeCall(
                                LPCSTR lpszDestAddress,
                                LPCSTR lpszAppName,
                                LPCSTR lpszCalledParty,
                                LPCSTR lpszComment   
                                );
lpszDestAddress//用於呼叫電話號碼,可以給出一個規範的地址或一個可撥打的地址 .
規範的地址形式是"+<國家代碼>(<地區代碼>)<電話號碼>"。 一個可撥打的號碼是一個局部化的字符串,他可能包過用來訪問外線的字符串,一個電話卡號,長途區號和地區號,一個脈衝或音調撥號模式指示器等.
餘下的3個參數用於撥號程序的日誌文件對這次呼叫的描述。第二個參數包過一個指針,指向NULL結尾的字符串,他是一個程序名,第3個參數是被叫方名字的字符串描述,最後一個參數是註解字符串。如果成功,它返回一個0,否則返回負數.
 tapiGetLoeationInfo函數原型:
LONG WINAPI tapiGetLoeationInfo(
                                LPSTR lpszCountryCode,
                                LPSTR lpszCityCode
                                 );
兩個參數都是返回參數,一個是返回國家或地區的代號,另一個是返回所在城市的代號。tapiGetLoeationInfo 是從控制面板中的"電話和調制解調器"選項中獲得該信息的.應用程序可以使用該函數幫助用戶確定所要撥打的號碼。函數成功返回0,否則返回負值。
(2)基本電話服務(對電話提供更多的控制):
  1地址翻譯:
  2發出呼叫:
  3回答呼叫:
  4掛斷電話:
  5監控通話狀態和監控事件發生:
  6呼叫句柄控制(call handl control).
    地址翻譯生成一個地址版本,這個地址標識了一個端點的所有的必要信息,包過國家代碼,地區號和電話號。這種地址以“+”字符開始。
    地址翻譯把一個規範地址作爲輸入內容,生成一個現場使用的撥號字符串。有了現場使用的撥號字符串,就可以呼叫了。呼叫的建立,處理和最後終止需要經過一些狀態轉移。打出去的電話會經過空閒,撥號音,撥號,連接,回鈴,連接和斷開這些狀態。而對於撥入的電話,他會經過空閒,提供連接,同意連接,連接和斷開這些狀態。
   基本電話服務還提供了檢索和控制呼叫句柄的機制。這是因爲TAPI自身並沒有提供在已建立的電話線路中傳輸數據的方法,必須通過其他類和API在TAPI線上通信。TAPI用於呼叫的建立和監控,不負責發送數據.
 相關API:
 LONG WINAPI lineInitialize(
                            LPHLINEAPP   lphLineApp,//線路程序句柄的指針,此句柄傳遞TAPI後作                                                   //爲以後大多數函數調用的參數
                            HINSTANCE    hInstance,//應用程序實例句柄,可以用                                                   //AfxGetInstanceHandle檢索該參數.TAPI需                                                      //要一個實例句柄來識別應用程序的過程事件.
                            LINECALLBACK lpfnCallback,//指向回調函數指針,該函數有應用程序創                                                      //建,聲明成 FAR PASCAL或者CALLBACK
                            LPCSTR       lpszAppName,//用於識別應用程序,可以賦予任何值
                            LPDWORD      lpdwNumDevs//一個返回參數,lineInitialize將會在這個                                                    //參數中存儲應用程序可用的設備數量。這些                                                    //可用的設備必須經查詢,找出一個能滿足應                                                    //用特定需要的設備
                            );//函數成功返回0,否則返回負值。
不過,lineInitialize用在TAPI2的應用程序上已經過時了。新的lineInitializeEx版本還要多出兩個參數,一個是DWORD 型指針,指定應用程序TAPI的最高版本。另一個是指向LINEINITIALIZEEXPARAMS結構的指針.
lineInitializeEx函數原型如下:
LONG WINAPI lineInitializeEx(
                             LPHLINEAPP lphLineApp,
                             HINSTANCE hInstance,
                             LINECALLBACK lpfnCallback,
                             LPCSTR       lpszFriendlyAppName,
                             LPDWORD      lpdwNumDevs
                             LPDWORD      lpdwAPIVersion,
                             LPLINEINITIALIZEEXPARAMS lpLineInitializeExParams
                             );
使用lineInitializeEx函數有兩個好處。第一個是它具有對TAPI版本的協商能力,第二個是應用程序如何通知事件的控制能力.
lineInitializeEx函數的一大優點是能控制通過什麼方法去告知應用程序有關的線路事件。應用程序接收事件通知有3種方式。第一種是使用TAPI在TAPI應用程序中建立一個隱含的窗口,從而使發送給窗口的消息由TAPI自身去處理.當TAPI想發送一個消息給應用程序的時候,他就發送給隱含的窗口。應用程序調用GetMessage檢索其消息。第二種方法是TAPI提供其他方法實現事件的通知。他將dwOptions字段設置成LINEINITIALIZEEXOPTION_USEEVENT.TAPI將創建一個Win32事件對象,用於指示TAPI設備的變化。第三種方法是通過Win32 CreateIoCompletionPort函數創建一個完成端口。
 在TAPI初始化實例建成後,下一步應協商一個TAPI版本,這可以通過lineNegotiateAPIVersion函數完成
  lineNegotiateAPIVersion函數原型如下:
 LONG WINAPI lineNegotiateAPIVersion(
                                    HLINEAPP hLineApp,//返回的是TAPI的實例句柄
                                    DWORD    dwDeviceID,//檢查設備的標識符
                                    DWORD    dwAPILowVersion,//應用程序兼容的TAPI最低版本
                                    DWORD    dwAPIHightVersion,//TAPI兼容的最高版本
                                    LPDWORD  lpdwAPIVersion,//返回參數,協商後的TAPI版本號
                                    LPLINEEXTENSIONID lpExtensionID//指向一個結構指針每個服                                     //務程序都可以通過這個指針實現擴充的目的,返回參數,表                                     //示擴展的ID
                                    );
特定設備識別符的TAPI版本號確定後就可以通過調用lineGetDevCaps函數獲取此設備的更多信息,包過該設備的可以處理的信息類型.
lineGetDevCaps(
               HLINEAPP hLineApp,//返回的是TAPI的實例句柄
               DWORD    dwDeviceID,//可用設備的標識符
               DWORD    dwAPIVersion,//協商後的TAPI版本號
               DWORD    dwExtVersion,//協商後的擴展版本號
               LPLINEDEVCAPS lpLineDevCaps//返回一個參數,表示當前可用線路設備的屬性和能力
              );
如果此線路設備滿足所有要求,則存儲相應的識別符和TAPI版本信息以備使用。假設已合適的找到合適的線路設備,下一步調用lineOpen函數打開線路.
LONG WINAPI lineOpen(
                     HLINEAPP hLineApp,//TAPI的實例句柄
                     DWORD    dwDeviceID,//所選線路的索引
                     LPHLINE  lphLine,//一個指向HLINE參數的指針,用於把句柄返回給TAPI線路的實                                      //例
                     DWORD    dwAPIVersion,//第四個參數通過lineNegotiateAPIVersion協商後的                                         //TAPI版本號
                     DWORD    dwExtVersion,//協商後的擴展版本號,如果不打算使用服務器提供的                                         //程序擴展則需將值設爲0
                     DWORD_PTR dwCallbackInstance,//一個DWORD,用於TAPI保留並返回給應用程序的                                               //不透明的數據.他是通過lineInitialize註冊的回                                               //調函數被調用時產生的
                     DWORD    dwPrivileges,//於此線路相關設備聯繫的dwPrivileges參數,
                     DWORD    dwMediaModes,//只適用於dwPrivileges參數爲                                           //LINECALLPRIVILEGE_OWNER模式的情況
                     LPLINECALLPARAMS const lpCallParams//
                     );成功返回0,否則負數
緊接着要對線路設備進行呼叫。在呼叫之前,必須生成一個撥號地址,可以通過lineTranslateAddress函數實現,它把規範的地址轉換一個局部化的撥號地址.

LONG WINAPI lineTranslateAddress(
                                 HLINEAPP hLineApp,
                                 DWORD    dwDeviceID,
                                 DWORD    dwAPIVersion,
                                 LPCSTR   lpszAddressIn,//指向轉換的規範地址的指針
                                 DWORD    dwCard,//一個索引,用於電話卡的重載
                                 DWORD    dwTranslateOptions,//用於轉換時指定給隨的任何特殊                                           //指令
                                 LPLINETRANSLATEOUTPUT lpTranslateOutput//存儲生成的地址
                                 //LPLINETRANSLATEOUTPUT結構的值包含尺寸和偏移量,用於可撥號                                 //的和可顯示的地址版本
                                 );
當地址轉換成功後就可以調用lineMakeCall進行撥號了
LONG WINAPI lineMakeCall(
                        HLINE hLine,//TAPI的實例句柄
                        LPHCALL lphCall,//存放呼叫句柄
                        LPCSTR  lpszDestAddress,//NULL結尾的呼叫字符串
                        DWORD   dwCountryCode,//呼叫方的國家代碼,如給0則使用默認值
                        LPLINECALLPARAMS const lpCallParams//
                        );
假設收到了回叫,表示請求的呼叫已經建立,則可以在線路中傳輸數據。正如前面所說的,傳輸數據這部分的工作不屬於TAPI模塊
數據在線路上傳輸後,下一步就掛起電話lineDrop.
LONG WINAPI lineDrop(
                     HCALL hCall,//處理現存的呼叫
                     LPCSTR lpsUserUserInfo,//用戶傳送的字符串信息
                     DWORD  dwSize//用戶之間信息的大小
                     );
TAPI 的結束纔是最後一步
LONG WINAPI lineShutdown(
                         HLINEAPP hLineApp//應用程序實例句柄
                         );
(3)增補電話服務:
          指被API定義的但不是某一特定TAPI服務提供程序所要求的服務。增補電話服務一般需要附加的硬件支持。因此該服務是可選的。
(4)擴充電話服務:
          TAPI的設計目標是提供一個可擴展的框架,通過用戶程序可以訪問供應商提供的硬件解決方案的特性和功能。擴充電話服務允許供應商通過添加設備和服務提供程序專門的特性和功能擴展電話API.應用這一服務級的程序一般是對準特定供應商的產品而開發的,因而缺乏良好的可移植性。


使用TAPI構造電話語音應用程序的方法

  在Windows NT網絡中,第一次建立電話環境時,應在進程中執行1個初始化調用來設置TAPI環境,包括:加載Tapi32.dll、執行TAPI服務Tapisrv.exe以及加載註冊庫中有關的電話設備驅動程序。
   編制電話語音應用程序大致需要經過如下的過程: 
  (1)初始化TAPI。通過lineInitialize函數在應用程序中完成TAPI的初始化。lineInitialize函數給出了應用程序的回調函數,用來通知應用程序的各種事件;lineInitialize函數返回1個TAPI使用句柄,並指明TAPI使用的通信機制。
  (2)協調TAPI的版本。應用程序使用lineNegotiateAPIVersion函數把API使用版本通知給TAPI,返回與TAPI通信所能使用的版本,同時獲得線路設備支持的擴展功能。
  (3)檢查設備。調用lineGetDevCaps函數詢問設備的能力,返回1個LINEDEVCAPS類型的數據結構。設備的能力包括如下信息:TAPI服務提供者、交換機信息、字符串格式、載波方式、數據傳輸率等。
  (4)應用程序註冊。利用函數lineRegisterRequestRecipient將應用程序進行註冊。
  (5)撥號。啓動撥號按鈕,應用程序提取用戶的輸入數據,然後調用ResolveNumber函數修改用戶的輸入數據,修改後的號碼用於撥號。
  (6)啓用線路設備。調用函數lineOpen打開1條線路設備,lineOpen返回線路設備的句柄,用以完成以後對此設備的各種操作。當然在1個應用程序中可以打開多個線路。
  (7)號碼轉換。調用函數lineTranslateAddress將要撥的號碼轉變成可以直接在電話上撥的號碼。轉換好的號碼返回給LINETRANSLATEOUTPUT結構,在轉換後,返回2個號碼:1個在線路設備上用於撥號,另1個顯示給用戶。
  (8)呼叫。隨後使用函數lineMakeCall進行呼叫,lineMakeCall使用lineOpen返回的線路句柄,返回1個帶有擁有者特權的當前呼叫的句柄,用於對本次呼叫進行以後的操作。若函數lineMakeCall返回呼叫有問題,由LINE_REPLY消息提供呼叫的狀態。
  (9)結束呼叫。通信完成後,調用lineDrop函數結束呼叫,但其並不釋放呼叫的句柄,可以通過調用lineDeallocateCall來釋放句柄。
  (10)關閉線路。通過lineClose函數關閉線路,使其可以被其它應用程序使用,同時釋放了呼叫的句柄。
  (11)終止TAPI調用。調用lineShutdown函數關閉TAPI的使用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章