有限状态机SCXML
文章目录
简介
SCXML
是一种多元化、基于事件状态的机器语言,其用法主要有几个方面:
- 它是在
VoiceXML 3.0
的基础上发展而来的高级对话语言,可封装为不同的语言模块 - 作为语言分析的应用开发程序,它在
VoiceXML 3.0
的基础功能之上,还具备了控制数据库连接的功能和商业业务逻辑模块 - 作为一种多态的控制语言,在这种多形式的交互式架构中,
SCXML
集成了VoiceXML 3.0
的所有对话形式,这其中包括键盘鼠标,文字,视觉感官,触觉感受等多种交互形态。其可能包括一些综合技术如口型的阅读(语音识别技术与视觉的结合表现)。语音的输入以键盘作为载体,并且引入多个键盘和多个用户同步编写的功能 SCXML
还是CCXML
未来版本的基础架构- 作为一种高级的、可扩展的呼叫中心管理语言,
CCXML
又被称为呼叫中心使用的具有控制功能的计算机电话集成系统。这种集成系统应用计算机屏幕弹出窗口,并提供其他方式的信息交互,例如,在线聊天,发送即时信息等
实例
<!-- 基于 SCXML 的计时器实例 -->
<scxml xmlns="http://www.w3.org/2005/07/scxml"
version="1.0"
initialstate="reset">
<state id="reset">
<transition event="watch.start" target="running"/>
</state>
<state id="running">
<transition event="watch.split" target="paused"/>
<transition event="watch.stop" target="stopped"/>
</state>
<state id="paused">
<transition event="watch.unsplit" target="running"/>
<transition event="watch.stop" target="stopped"/>
</state>
<state id="stopped">
<transition event="watch.reset" target="reset"/>
</state>
</scxml>
此状态描述文件中,一共有四个状态:rest
,running
,paused
和 stopped
状态
此状态机的初始状态是 reset 态,是通过 scxml
元素的 initialstate
元素来指定的。这意味当状态机启动时, 最先进入的将会是这个状态。当状态机处于 reset 态的同时有 watch.start
事件发生时,将会触发状态机进行状态迁移,进入 running
态,即计时器运行态
SCXML
规范组成及元素详解
SCXML
元素
SCXML
文档的最顶层元素,携带了文档版本等相关信息,当前状态机构成以及子元素等- 通过
initialState
属性来指定状态机的进入初始态,可包含State
、Parallel
、Final
、DataModel
和Script
子元素 - 分宽松态和严格态
State
元素
- 此元素用以表示有限状态机中的一个基本状态,它具有可选的属性
id
和initial
- 具有
State
或是Parallel
子元素的复杂态必须为其指定initial
属性,用于表示进入此复杂态所应该进入的第一个子状态 - 此元素的子元素可以为
OnEntry
元素、OnExit
元素、Transition
元素、State
元素、Parallel
元素、DataModel
元素和Invoke
元素
Transition
元素
- 此元素用以表示状态间的变迁,状态变迁是以事件以驱动的,并会进行变迁条件的判断操作
- 并且在进行状态迁移时,子元素可以包含执行模块,用以表示在状态迁移时进行的操作
- 其主要属性包括:
Event
属性,用以表示触发此状态迁移的事件Cond
属性,用以表示此状态迁移进行的限制条件Target
属性,用以表示此状态迁移的目标态
- 此元素可以包括执行模块子元素,例如
Log
元素
<state id="s">
<transition event="e1" cond="x==1" target="s1"/>
<transition event="e2" target="s2">
<log expr="'executing transition'"/>
</transition>
</state>
Parallel
元素
- 此元素表示具有并行执行子元素的状态
- 与
State
元素类似,此元素可以包含OnEntry
元素、OnExit
元素、Transition
元素、State
元素、Parallel
元素、DataModel
元素和Invoke
元素为子元素 Paralle
元素与State
元素有着不同的语义,当某个 State 元素处于active
态,其有且只有一个子元素处于active
态,但是当某个Parallel
元素处于active
态时,其所有子元素均处于active
态
OnEntry
元素
- 此元素是一个容器元素,用以包含状态机进入某个状态时所进行的全部操作,其子元素均为可执行模块内容
OnExit
元素
- 类似于
OnEntry
元素,此元素也是一个容器元素,用以包含状态机退出某个状态之前所进行的全部操作,其子元素均为可执行模块内容
可执行内容元素
- 可执行模块允许状态在运行过程当中做一些实际的事件,它允许某个状态机对话修改自身的数据模型,或是与外部实例进行交互操作
- 位于
OnEntry
和OnExit
元素内的可执行元素模块往往和Transtion
元素里的可执行元素具有等同的作用效果。当状态机执行Transition
元素时,它将会执行它离开的那个State
元素的OnExit
包含的可执行内容模块,当它进入目标 State 元素时,会执行目标态OnEntry
元素所包含的可执行内容模块 - 此模块主要包含如下几个元素:
Raise
元素- 此元素用于在当前状态机会话当中产生一个内部事件,
SCXML
引挚必须将此事件放置在当前会话的内部事件序列的尾部
- 此元素用于在当前状态机会话当中产生一个内部事件,
If
元素- 此元素是有条件执行元素的容器
If
元素具有cond
属性,当此属性值为true
时,状态机将会执行该If
后的事件子元素
Else
元素ElseIf
元素Log
元素- 其它元素
- 例如
assign
、validate
和script
等
- 例如
<if cond="cond1">
<!-- selected when "cond1" is true -->
<elseif cond="cond2"/>
<!-- selected when "cond1" is false and "cond2" is true -->
<elseif cond="cond3"/>
<!-- selected when "cond1" and "cond2" are false and "cond3" is true -->
<else/>
<!-- selected when "cond1", "cond2", and "cond3" are false -->
</if>
数据模型与数据操作元素
数据模型模块为SCXML
有限状态机提供了内置的数据存储、读写、修改数据集的能力
SCXML
规范中数据模型用 DataModel
元素来表示,其可以包含一个或是多个 Data
元素,每个 Data
元素表示一个数据项,并可以此数据项指定初始值
可以通过 Assign
元素来修改 Data
数据项的值,通过 Validate
元素来验证 Data
数据值的合法性,并且可以通过 Donedata
、Param
等这些元素来完成 Data
元素与外部实例的交互
Datamodel
元素,此元素为容器元素,可以包含一个或是多个Data
元素,SCXML
通过Data
元素来完成基本数据项的定义与使用。Data
元素,该元素用来声明和组成Datamodel
元素,具有必选的 id 属性和可选的src
和expr
属性。Data
的id
属性用来唯一标识某一数据项,通过src
或是expr
属性来指定属性值。Assign
元素,此元素用于修改Data
元素的数据值。具有必选的属性location
,该属性与Data
元素的id
属性对应,用于标识某一数据项。通过可选的expr
为Data
元素指定新的数据值。Validate
元素,此元素用于验证Data
数据值的合法性。当通过src
为data
指定外部数据源时,例如XML
数据源,则可利用此元素和XML Schema
来验证Data
数据值的合法性。Donedata
元素,此元素为容器元素,用以装载SCXML
状态机进入Final
态时所返回的数据。当SCXML
引挚进入Final
态时,会产生一个done
事件,引挚必须将Donedata
元素的数据值指定为_event.data
全局数据值。此元素的子元素可以为Content
元素或是Param
元素。Content
元素,此元素为将内嵌数据传送至外部服务的容器元素。Param
元素,此元素提供了一个一般性的用来标识name/key
或是动态计算的值的方法,该值可传送至外部服务或是被包含在一个事件中。Script
元素,该模块为有限状态机添加了内置脚本的支持。
<scxml version="1.0" datamodel="ecmascript">
<datamodel>
<data id="employees" src="http://example.com/employees.json"/>
<data id="year" expr="2008"/>
<data id="CEO" expr="\"Mr Big\""/>
<data id="profitable" expr="true"/>
</datamodel>
</scxml>
外部交互元素
外部交互能力允许 SCXML
会话与外部节点间进行事件的发送或是接收,并且同时提供调用外部服务的能力
Send
元素提供“触发就忘记”的数据传输能力,可以将事件传送至外部环境或是其它的 SCXML
会话。事件传输的细节以及数据格式是 SCXML
引挚所选择的Event I/O Processor
所决定的,每个 SCXML
引挚都会实现一个或是多个 Event I/O Processor
,SCXML
的使用者可以根据需要选择一个他理想的事件 IO
处理器。
会话。事件传输的细节以及数据格式是
SCXML 引挚所选择的
Event I/O Processor所决定的,每个
SCXML 引挚都会实现一个或是多个
Event I/O Processor,
SCXML 的使用者可以根据需要选择一个他理想的事件
IO `处理器。
Invoke
元素提供一种紧藕合的与外部系统进行交互的方式,特别的是提供触发外部平台定义的服务并传送数据的能力,该服务在完成的时候将会产生一个 done
事件。