当设备处于免提状态时,TAPI 3呼叫状态事件不会触发

时间:2016-08-26 16:01:46

标签: c# telephony tapi

我有一个应用程序来记录呼叫状态并将信息调用到数据库表中。我使用interop.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;
       }
  }

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

但是,如果用户更改为设备上的免提通话 - 以便自动通话,则不会触发呼叫状态事件。

如果我在通话期间手动重新注册设备,我会收到一个连接呼叫状态事件。

为什么设备处于免提状态的任何想法会对呼叫状态事件产生任何影响?

2 个答案:

答案 0 :(得分:2)

此“免提”模式不应影响您获得的事件。我建议您使用独立工具检查其他应用程序是否获得相同的结果。因为您可能在驱动程序或PBX中发现了错误。 如果您没有,可以在此处试用TAPI软电话:

http://julmar.com/tapi/

每次通话后重新注册都不是必要的,实际上可能会造成更大的伤害。

答案 1 :(得分:0)

我最终使用TraySoft's AddTapi.Net库,这似乎非常顺利,易于设置和使用,文档非常好。

我需要编写很少的代码来实现与上面相同的功能。