65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 Windows Workflow Foundation 实现呼叫控制

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.67/5 (5投票s)

2007 年 4 月 29 日

CPOL

2分钟阅读

viewsIcon

69949

downloadIcon

1013

使用状态机工作流实现呼叫控制。

Screenshot - newCall.jpg

引言

本文描述了使用 TAPI 作为其基本框架的任何电话应用程序的呼叫控制机制的设计。 本文不使用任何 TAPI,但提供了一种通用的呼叫控制机制,可以连接到任何 PBX 或基于呼叫的系统。

背景

此应用程序使用 Microsoft 的新技术框架 - Windows Workflow Foundation 的状态机工作流。 下面的状态流程图描述了一种非常常见的机制,从新呼叫开始,直到呼叫结束作为断开状态。 此示例使用了以下呼叫状态。

  • WaitingForCallState (等待呼叫状态)
  • CallNewstate (呼叫新建状态)
  • CallInboundState (呼叫入站状态)
  • CallOutboundState (呼叫出站状态)
  • CallOnholdState (呼叫保持状态)
  • CallConnectedState (呼叫已连接状态)
  • CallDisconnected (呼叫已断开)

呼叫状态图

Screenshot - stateDiagram.jpg

事件驱动活动

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

Screenshot - singleStateEvent.jpg

使用代码

此应用程序有三个组件

  1. 呼叫控制 UI 应用程序(显示在顶部的屏幕截图)。
  2. 呼叫控制工作流(实现工作流、状态和活动,如上面的状态机图所示)。
  3. 呼叫控制服务(在下面使用代码进行描述)。

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"。

Screenshot - ActivityEventAssoc.jpg

© . All rights reserved.