新闻中心

EEPW首页 > 手机与无线通信 > 设计应用 > TAPI软电话通信系统的模块化设计

TAPI软电话通信系统的模块化设计

作者: 时间:2015-04-18 来源:网络 收藏

  3. 1 应用控制类设计

本文引用地址:https://www.eepw.com.cn/article/272752.htm

  TapiA pplicat ion是对的管理,它处于调用结构的顶层,通过下层的服务为上层应用程序提供透明、规格化的信息服务。在通过进行远程程序设计时,必不可少的是要调用lineIn itia lizeEx( )函数以初始化TAPI,以及调用lineOpen( )函数以打开线路,然后才能使用TAPI进行监控和代理呼叫等功能。除此之外,为了编写可靠的远程程序,还应调用有关检测线路设备能力的函数lineGetDevC aps( ),检测TAPI版本兼容性函数lineN egotiateAPIV ersion( ),检测线路当前使用状态的函数lineSetStatusM essages( )等以适应各种情况。最后调用lineC lose( )函数来关闭线路,调用lineShutdow n( )函数将应用程序与TAPI断开。

  为了使TAPI便于操纵,适应不同的应用开发环境,本文设计了In itia liseTAPI( )这个不要参数的初始化函数,把初始化和协商TAPI版本所需要的参数通过内联机制进行整合,避免了过多的参数传递。初始化成功后表明应用程序已经获得TAPI的数据结构和应用句柄。为了便于对设备的控制,需要和通信设备取得联系并打开通信线路。本文设计了OpenValidL ines( )这个不加参数的函数,只要成功返回后就可以对通信线路、通信设备进行控制了,其函数声明如下:

  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初始化工作和有效线路的打开这些复杂的功能,通过函数内置或全局变量传递,整合成一个不要参数并且返回值为布尔类型的API函数。应用程序只要调用这两个函数就可以实现对TAPI设备的监控和操作。

  3. 2 TAPI线路控制类设计

  Tap iLine是对TAPI线路的管理,为了使程序的结构更为清晰和易于升级以及为了使TAPI能够更方便的移植到别的应用程序中,把TAPI函数中用于实现功能的一部分函数和数据结构封装成一个类来使用。下面就是通过V ISUALC + +编程实现对TAPI线路控制函数封装类的头文件。

  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通过复杂的参数传递机制,封装了大量的内部变量,通过API接口以统一短消息的形式接收用户指令同时返回线路的具体状态。最终应用程序通过调用Tap iL ine的具体函数对整个线路进行操作、控制。

  3. 3 TAPI通话控制类设计

  TapiChanne l是对具体通话进行控制,呼叫是TAPI开发最常用的一个功能。调用Tap iL ine的M akeC all ( DWORD dwAddressID,LPCTSTR pszAddress),传递当前号码和目标地址就可以进行拨打电话,把拨打电话的其他细节进行内部传递。当以上函数调用成功后,TSP就会控制通讯设备外呼指定的电话,该函数调用后会立刻返回到应用程序,但该电话是否成功拨通,则是依靠消息来判断,包括TAPI的其他功能也是这样的处理方式。其他常用的电话功能如接听、挂断、转移、三方等都有对应的函数实现。

  TAPI初始化成功后,应用程序就和TSP设备建立了联系。应用程序就可以通过TAPI函数控制电话线路、监控线路状态。函数lineOpen调用成功后进入消息循环,新生成的呼叫处于IDLE状态,随后根据状态指令执行不同的操作。当调用lineM akeC all( )后,线路状态进入D IAL ING、PROCEDING,当收到异步响应或者应答后进入呼叫状态循环并依次进入CONNECTED和DISCONNECTED,最后回到初始化状态。当有一路电话呼入时,线路状态进入OFFER ING、自动调用lineAnsw er( )后进入ACCEPTED、PROCED ING,当收到异步响应或者应答后进入呼叫状态循环并依次进入CONNECTED和D ISCONNECTED,最后回到初始化状态,整个TAPI状态图如图4所示。

  

 

  图4 TAPI状态机。

c++相关文章:c++教程


数字通信相关文章:数字通信原理


通信相关文章:通信原理


交换机相关文章:交换机工作原理




关键词: TAPI 通信

评论


相关推荐

技术专区

关闭