使用 Windows Workflow Foundation 实现呼叫控制






3.67/5 (5投票s)
使用状态机工作流实现呼叫控制。

引言
本文描述了使用 TAPI 作为其基本框架的任何电话应用程序的呼叫控制机制的设计。 本文不使用任何 TAPI,但提供了一种通用的呼叫控制机制,可以连接到任何 PBX 或基于呼叫的系统。
背景
此应用程序使用 Microsoft 的新技术框架 - Windows Workflow Foundation 的状态机工作流。 下面的状态流程图描述了一种非常常见的机制,从新呼叫开始,直到呼叫结束作为断开状态。 此示例使用了以下呼叫状态。
- WaitingForCallState (等待呼叫状态)
- CallNewstate (呼叫新建状态)
- CallInboundState (呼叫入站状态)
- CallOutboundState (呼叫出站状态)
- CallOnholdState (呼叫保持状态)
- CallConnectedState (呼叫已连接状态)
- CallDisconnected (呼叫已断开)
呼叫状态图

事件驱动活动
每个状态由一个或多个活动组成。 例如,WairingForCallState 在“OnNewCallCreated”上定义了一个事件驱动活动。 此活动启用基于事件的包含活动的执行。 这里,它们是“handleCallCreated”和“setCallNewState”。 “handleCallCreated”子活动允许将事件接收到工作流中,而“setCallNewState”导致状态机转换到另一个状态。 在这种情况下,它会转换到“CallNewState”。 如何将外部事件映射到“handleCallCreated”将在下一节中描述,其中包含代码片段。

使用代码
此应用程序有三个组件
- 呼叫控制 UI 应用程序(显示在顶部的屏幕截图)。
- 呼叫控制工作流(实现工作流、状态和活动,如上面的状态机图所示)。
- 呼叫控制服务(在下面使用代码进行描述)。
ICallControlService:接口
此接口描述了负责呼叫状态转换的所有事件。
using System;
using System.Workflow.Activities;
namespace CallControlServices
{
 [ExternalDataExchange]
 public interface ICallControlService
 {
  event EventHandler<CallEventArgs> CallCreated;
  event EventHandler<CallEventArgs> CallDialingOut;
  event EventHandler<CallEventArgs> CallOffering;
  event EventHandler<CallEventArgs> CallConnected;
  event EventHandler<CallEventArgs> CallOnHold;
  event EventHandler<CallEventArgs> CallDisconnected;
 }
}
CallControlService:上述接口的实现
using System;
namespace CallControlServices
{
 [Serializable]
 public class CallControlService : ICallControlService
 {
  public void RaiseCallCreatedEvent(string callId,Guid instanceId)
  {
   if (CallCreated != null)
   {
    CallEventArgs e = new CallEventArgs(instanceId, callId);
    CallCreated(this, e);
   }
  }
  public void RaiseCallDialingOutEvent(string callId, Guid instanceId)
  {
    if (CallDialingOut != null)
    {
     CallEventArgs e = new CallEventArgs(instanceId, callId);
     CallDialingOut(this, e);
    }
  }
  public void RaiseCallOfferingEvent(string callId, Guid instanceId)
  {
   if (CallOffering != null)
   {
    CallEventArgs e = new CallEventArgs(instanceId, callId);
    CallOffering(this, e);
   }
  }
  public void RaiseCallConnectedEvent(string callId, Guid instanceId)
  {
   if (CallConnected != null) 
   {
    CallEventArgs e = new CallEventArgs(instanceId, callId);
    CallConnected(this, e);
   }
  }
  public void RaiseCallOnHoldEvent(string callId, Guid instanceId)
  {
   if (CallOnHold != null)
   {
    CallEventArgs e = new CallEventArgs(instanceId, callId);
    CallOnHold(this, e);
   }
  }
  public void RaiseCallDisconnectedEvent(string callId, Guid instanceId)
  {
   if (CallDisconnected != null)
   {
    CallEventArgs e = new CallEventArgs(instanceId, callId);
    CallDisconnected(this, e);
   }
  }
  public event EventHandler<CallEventArgs> CallCreated;
  public event EventHandler<CallEventArgs> CallDialingOut;
  public event EventHandler<CallEventArgs> CallOffering;
  public event EventHandler<CallEventArgs> CallConnected;
  public event EventHandler<CallEventArgs> CallOnHold;
  public event EventHandler<CallEventArgs> CallDisconnected;
 }
}
将事件关联到工作流活动
现在我们对工作流、状态和活动有所了解。 我们还定义了 CallControlService 接口及其实现。 现在,我们将看到如何将上面定义的外部事件与工作流关联起来。 此事件将导致工作流状态转换为另一个状态。 这真的非常简单! Workflow Visual Studio 设计器提供了一个工具,可以进入每个状态/活动并定义其属性。 如下所示,'handleCallCreated' 子活动定义为 EventName = CallCreated 并且 InterfaceType = "CallControlServices.ICallControlService"。



