开发者社区


C++/C | Java | .Net/Windows | Linux/Unix | 开源 | 其他
首页 - 编程
编程
全文搜索:   

呼叫控制XML与语音浏览器呼叫控制教程
作者: Peter V. Mikhalenko
2006-04-18 10:49:34



无标题文档

任务生命周期

现在,CCXML生命周期需要更多的净化。CCXML任务可由下列原因启动:

  • 进入平台的最新电话呼叫。
  • CCXML应用程序执行<createccxml>。
  • 一个外部任务发布进入平台的请求。

当任务由拨入呼叫启动时,它具有与新连接相关的事件终点的所有权。新的CCXML任务将负责处理连接状态事件,并执行连接行为。

每个CCXML任务都有一组称之为任务变量的ECMAScript变量,它们在执行过程中可为程序所用。当CCXML 任务建立之时,任务变量即由CCXML执行定义,对运行的脚本而言,它们为只读变量,并不能被CCXML程序修改。这些变量包含诸如任务标识符、任务启动原因、所有连接对象列表等信息。CCXML应用程序能够通过评估任务变量session.startupmode的内容,决定任务启动的原因。

CCXML任务以执行CCXML文档开始。执行流程可随<if><elseif><else><fetch><goto>而改变。大多数的CCXML任务在处理进入事件流的<eventprocessor>中产生。CCXML任务可以通过<createccxml>发布新的CCXML任务。最新的CCXML任务在独立的背景及原始CCXML任务的变量空间下执行,完全独立于最初任务的生命周期。任务之间通过<send>发送信息来进行交流。

一个CCXML任务可以下面的某种方式结束:

  • CCXML应用程序执行<exit>。
  • 发生未经处理的”error.*”事件。
  • 发生未经处理的”ccxml.kill”事件。
  • 产生”ccxml.kill.unconditional”事件。

当CCXML任务结束时,此任务拥有的所有活跃连接、会议与对话由平台自动终止。

一般来说,连接比任务要短。当连接终止时任务并未结束。一个CCXML任务不需要任何与它有关的连接。启动后,由于<createcall><move>所发出的请求,任务可能需要连接。AB说明了几种不同情形下的生命周期。

图A

B

任务生命周期,不同情形

在我们的“世界你好”实例(Example1.txt)中,当一个任务结束时,那个任务拥有的任何资源,包括连接都被终止——如C所示。任务不仅有生命周期情形,还有多个连续的连接,甚至还有数个并发的连接。一个连接可以由一个CCXML任务转移到另一个CCXML任务。

图C

终止

任何时候平台希望终止一个CCXML任务,它必须提出一个ccxml.kill事件来通知CCXML应用程序。CCXML应用程序对此事件做出的正常响应为:整理并终止当前活跃的连接、会议或对话,然后执行一个<exit>元素。

让我们看一个从CCXML中运行简单VoiceXML对话的更为复杂的例子。应用程序答复一个拨入的电话呼叫,然后将它连接到一个VoiceXML对话上,对话再返回一个记录到平台中的值(Example2.txt与Example2.vxml.txt)。这是CCXML与VoiceXML连接的起点。

例2

<?xml version="1.0" encoding="UTF-8"?>

<ccxml version="1.0" xmlns="http://www.w3.org/2002/09/ccxml">

<!-- Lets declare our state var -->

<var name="state0" expr="'init'"/>

<eventprocessorstatevariable="state0">

<!-- Process the incoming call -->

<transition state="init" event="connection.alerting">

<accept/>

</transition>

<!-- Call has been answered -->

<transition state="init" event="connection.connected" name="evt">

<log expr="'Houston, we have liftoff.'"/>

<dialogstartsrc="'example2-dialog.vxml'"/>

<assign name="state0" expr="'dialogActive'" />

</transition>

<!-- Process the incoming call -->

<transition state="dialogActive" event="dialog.exit" name="evt">

<log expr="'Houston, the dialog returned [' + evt.values.input

+ ']'" />

<exit />

</transition>

<!-- Caller hung up. Lets just go on and end the session -->

<transition event="connection.disconnected" name="evt">

<exit/>

</transition>

<!-- Something went wrong. Lets go on and log some info and end

the call -->

<transition event="error.*" name="evt">

<log expr="'Houston, we have a problem: (' + evt.reason +

')'"/>

<exit/>

</transition>

</eventprocessor>

</ccxml>

2-VXML

<?xml version="1.0"?>

<vxmlxmlns="http://www.w3.org/2001/vxml" version="2.0">

<form id="Form">

<field name="input" type="digits">

<prompt>

Please say some numbers ...

</prompt>

<filled>

<exit namelist="input"/>

</filled>

</field>

</form>

</vxml>

当一个CCXML文档如例2那样收到<eventprocessor>中的一个connection.alerting事件时,<transition>块中的<accept>就会执行,这将促使基础平台向电话系统发出连接呼叫的信号。然后,CCXML文档可能会与呼叫者进行交互式的对话任务,或执行其它电话操作(如对外呼叫,加入呼叫等)。

对话处理

CCXML并不提供任何与呼叫者交互的机制,仅仅依靠VoiceXML这样单独的对话环境。任何时候需要与呼叫者交互时,CCXML可以启动由VoiceXML或其它技术提供的单独对话功能。对话交互完成以后,系统向CCXML任务发送一个异步事件,它能够应用对话环境返回的任意结果,以决定下一步的行动。操作启动后,所有处理对话的CCXML元素与直接返回到CCXML任务的控制异步。不管对话操作是成功完成,还是失败,一个异步事件都要向CCXML任务进行通报。

CCXML程序应用<dialogstart>元素启动对话(见例2)。执行此元素可连接到一个对话环境,并指导它开始与呼叫者进行交互。在一些对话环境中,对对话环境进行初始化可能要花上一些时间,因此,仅仅应用<dialogstart>元素就会使呼叫者听到静音或“忙音”。为避免出现这种情况,CCXML提供在连接与启动开始前准备对话环境的功能,这一功能由<dialogprepare>元素来完成。任何由<dialogstart>启动,或由<dialogprepare>准备的对话都可用<dialogterminate>元素来终止。尽管支持的对话环境会产生各种实际行为,但CCXML执行必须支持<dialogprepare><dialogstart><dialogterminate>元素。

如果对话由于某种原因不能启动,一个error.dialog.notstarted事件即被贴粘到处理<dialogstart>请求的CCXML任务事件队列中。对话完成后,一个dialog.exit事件即被贴粘到启动它的CCXML任务事件队列中。在我们所举的例子中,我们用转换元素<transition state="dialogActive" event="dialog.exit" name="evt">处理对话数据。

VoiceXML整合

CCXML与VoiceXML 2.0需要能够在浏览器之间交换事件。提交信息的方法由平台决定,但也存在一些基本的功能。每一个运行中的CCXML任务都有一个用来处理CCXML事件的队列,它与同样由CCXML任务建立的VoiceXML对话事件处理过程相互独立。执行某些CCXML元素,如<dialogterminate><send>,可能会导致事件被送交到VoiceXML浏览器;同样,执行某些VoiceXML元素,如<transfer>,也会导致对话事件的生成,这些事件将被发送到拥有所讨论对话的CCXML任务。

VoiceXML 2.0处理异步或异常事件的功能有限。由于CCXML旨在建立稳健的事件处理机制,CCXML任务主要管理基础网络的连接,异步事件的处理——可以通过外部可访问的事件I/O处理器来传送——主要发生在CCXML应用程序中,它也可对VoiceXML任务进行适当的控制。因此,VoiceXML对话专门集中于与用户进行交互。

当VoiceXML对话沟通一个连接和相关的呼叫线路时,标准的VoiceXML任务变量即从呼叫线路中获得自己的值。否则,这些变量就不会被定义。只要相关的连接或会议发生更新,VoiceXML任务变量就会发生改变。当CCXML应用程序处理一个<dialogstart>元素时,它用提交到<dialogstart>元素的URI,或由<dialogprepare>准备用prepareddialog指定的对话,来启动一个连接的VoiceXML应用程序。

呼叫控制

CCXML的主要目标在于为整个呼叫过程提供呼叫控制。呼叫控制包括:处理拨入呼叫、放置外拨呼叫、沟通(或连接)多条呼叫线路,并最终切断呼叫。CCXML呼叫模型的目标集中于相对简单的呼叫控制类型,使其足够抽象,使呼叫控制可以用所有主要的电话系统来执行,如JAIN呼叫控制(JCC)、CSTAS.100

看起来,CCXML在电信行业有着光明的前景,这部分是因为该行业对于统一应用界面的强烈需求。现在有几种相似的处理语言,如CPL、CallXML、ECMA-CSTA、TXML等。你可以在CCXML规范的附录A找到这些语言。

责任编辑:张琎

查看本文的国际来源

 

【上一页】
声明:
Builder.com.cn(原ZDNet China应用开发频道)原创文章版权所有,未经许可严禁转载,且不构成投资建议。
近期相关报道:
实用技术文档
J2me XML
C/C++ C#
Java Oracle
Mysql .Net
VB.NET CSS
SQL Server 数据库
SQL UNIX
Linux Jsp
PHP Perl
Javascript IIS
XHTML ColdFusion
ASP/ASP.NET Apache
AJAX
订阅技术邮件
订阅"技术圈"杂志!请在下面选择您感兴趣的专题,填写e-mail地址,然后按订阅按钮:
应用开发管理
VS.NET 周刊
Database 周刊
WEB Service周刊
JAVA 周刊
IT 认证
Windows服务器周刊
互联网开发
当Windows Server 2008专家得5000元现金大奖
CNET NETWORKS 中国: 爱卡汽车网 | CNET科技资讯网 | e询网 | CWEEK | 蜂鸟网 | GameSpot China | 个人电脑 | PChome | SPN | 网友世界 | ZDNet China | 中关村在线
CNET NETWORKS 美国: BNET | CNET.com | CNET Download.com | CNET News.com | CNET Reviews | CNET Shopper.com | GameSpot | MP3.com | mySimon | Release 1.0 | Search.com | TechRepublic | TV.com | Webshots | ZDNet
Copyright (c) 2006 CNET Networks 版权所有。 ZDNet 是CNET Networks公司注册服务商标。
ZDNet 公司标识是 CNET Networks公司注册服务商标。
中华人民共和国电信与信息服务业务经营许可证编号:京ICP证010391号