当设备处于空闲状态时,调用状态事件不触发

本文关键字:状态 调用 事件 于空闲 | 更新日期: 2023-09-27 18:04:06

我有一个将调用状态和调用信息记录到数据库表中的应用程序。我使用互操作。TAPI3Lib dll和一个TAPI3驱动程序连接到调用信息。

下面是我认为相关的代码部分

我监听CallState事件

tapi.EventFilter = (int)(TAPI3Lib.TAPI_EVENT.TE_CALLSTATE);
tapi.ITTAPIEventNotification_Event_Event += new   
    TAPI3Lib.ITTAPIEventNotification_EventEventHandler(tapi_ITTAPIEventNotification_Event_Event);

并注册我要监控的每个设备(地址)

    RegEventsResult[line] = 
    tapi.RegisterCallNotifications(
    address, 
    true, 
    false, 
    TAPI3Lib.TapiConstants.TAPIMEDIATYPE_AUDIO, 2);

然后记录调用状态更改的结果

private void tapi_ITTAPIEventNotification_Event_Event(TAPI3Lib.TAPI_EVENT TapiEvent, object pEvent)
{
      string callerID, group, extension;
      long origin;
      TAPI3Lib.ITAddress address;
      switch (TapiEvent)
      {
          case TAPI3Lib.TAPI_EVENT.TE_CALLSTATE:
              TAPI3Lib.ITCallStateEvent callStateEvent = (TAPI3Lib.ITCallStateEvent)pEvent;
              TAPI3Lib.ITCallInfo call = callStateEvent.Call;
              extension = call.Address.DialableAddress;
              address = call.Address;
              switch (call.CallState)
              {
                  case TAPI3Lib.CALL_STATE.CS_INPROGRESS:
                            callerID = call.get_CallInfoString(TAPI3Lib.CALLINFO_STRING.CIS_CALLERIDNUMBER);
                            group = call.get_CallInfoString(TAPI3Lib.CALLINFO_STRING.CIS_CALLEDIDNAME);
                            AddLog("InProgress", callerID, group, extension);
                            break;
                  case TAPI3Lib.CALL_STATE.CS_CONNECTED:
                            callerID = call.get_CallInfoString(TAPI3Lib.CALLINFO_STRING.CIS_CALLERIDNUMBER);
                            group = call.get_CallInfoString(TAPI3Lib.CALLINFO_STRING.CIS_CALLEDIDNAME);
                            AddLog("Connected", callerID, group, extension);
                            break;
                  case TAPI3Lib.CALL_STATE.CS_OFFERING:
                            callerID = call.get_CallInfoString(TAPI3Lib.CALLINFO_STRING.CIS_CALLERIDNUMBER);
                            group = call.get_CallInfoString(TAPI3Lib.CALLINFO_STRING.CIS_CALLEDIDNAME);
                            AddLog("Offering", callerID, group, extension);
                            break;
                  case TAPI3Lib.CALL_STATE.CS_DISCONNECTED:
                            AddLog("Disconnected", "", "", extension);
                            resetNotification(extension, address);
                            break;
                  case TAPI3Lib.CALL_STATE.CS_IDLE:
                            AddLog("Idle", "", "", extension);
                            break;
             }
             break;
       }
  }

这个工作得很好-特别是当我每次断开连接时重新注册设备。

然而,如果用户在设备上更改为Hands free -以便呼叫自动通过,则呼叫状态事件不会触发。

如果我在该呼叫期间手动重新注册设备,我将获得一个已连接的呼叫状态事件。

知道为什么设备处于空闲状态会对呼叫状态事件产生任何影响吗?

当设备处于空闲状态时,调用状态事件不触发

这种"Hands free"模式不应该影响您得到的事件。我建议您使用独立的工具来检查其他应用程序是否得到相同的结果。因为您可能在您的驱动程序或PBX中发现了错误。如果你没有,你可以试试TAPI软电话:

http://julmar.com/tapi/

也不应该在每次呼叫后重新注册,实际上可能弊大于利。

我最终使用了TraySoft的AddTapi。. Net库,这似乎工作得很顺利,很容易设置和使用,文档是优秀的。

和我需要写很少的代码来实现相同的上面。