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