当前位置: 首页 > 工具软件 > SCXML > 使用案例 >

有限状态机SCXML

洪照
2023-12-01

有限状态机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>

此状态描述文件中,一共有四个状态:restrunningpausedstopped状态

此状态机的初始状态是 reset 态,是通过 scxml元素的 initialstate元素来指定的。这意味当状态机启动时, 最先进入的将会是这个状态。当状态机处于 reset 态的同时有 watch.start事件发生时,将会触发状态机进行状态迁移,进入 running态,即计时器运行态

SCXML规范组成及元素详解

SCXML元素

  • SCXML文档的最顶层元素,携带了文档版本等相关信息,当前状态机构成以及子元素等
  • 通过initialState属性来指定状态机的进入初始态,可包含StateParallelFinalDataModelScript子元素
  • 分宽松态和严格态

State元素

  • 此元素用以表示有限状态机中的一个基本状态,它具有可选的属性 idinitial
  • 具有 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元素,此元素也是一个容器元素,用以包含状态机退出某个状态之前所进行的全部操作,其子元素均为可执行模块内容

可执行内容元素

  • 可执行模块允许状态在运行过程当中做一些实际的事件,它允许某个状态机对话修改自身的数据模型,或是与外部实例进行交互操作
  • 位于 OnEntryOnExit元素内的可执行元素模块往往和 Transtion元素里的可执行元素具有等同的作用效果。当状态机执行 Transition元素时,它将会执行它离开的那个 State元素的 OnExit包含的可执行内容模块,当它进入目标 State 元素时,会执行目标态 OnEntry元素所包含的可执行内容模块
  • 此模块主要包含如下几个元素:
    • Raise元素
      • 此元素用于在当前状态机会话当中产生一个内部事件,SCXML引挚必须将此事件放置在当前会话的内部事件序列的尾部
    • If元素
      • 此元素是有条件执行元素的容器
      • If元素具有 cond属性,当此属性值为 true时,状态机将会执行该 If后的事件子元素
    • Else元素
    • ElseIf元素
    • Log元素
    • 其它元素
      • 例如 assignvalidatescript
 <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数据值的合法性,并且可以通过 DonedataParam等这些元素来完成 Data元素与外部实例的交互

  • Datamodel元素,此元素为容器元素,可以包含一个或是多个 Data元素,SCXML通过 Data元素来完成基本数据项的定义与使用。
  • Data元素,该元素用来声明和组成 Datamodel元素,具有必选的 id 属性和可选的 srcexpr属性。Dataid属性用来唯一标识某一数据项,通过 src或是 expr属性来指定属性值。
  • Assign元素,此元素用于修改 Data元素的数据值。具有必选的属性 location,该属性与 Data元素的 id属性对应,用于标识某一数据项。通过可选的 exprData元素指定新的数据值。
  • Validate元素,此元素用于验证 Data数据值的合法性。当通过 srcdata指定外部数据源时,例如 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 ProcessorSCXML的使用者可以根据需要选择一个他理想的事件 IO处理器。

会话。事件传输的细节以及数据格式是SCXML 引挚所选择的 Event I/O Processor所决定的,每个SCXML 引挚都会实现一个或是多个Event I/O ProcessorSCXML 的使用者可以根据需要选择一个他理想的事件IO `处理器。

Invoke元素提供一种紧藕合的与外部系统进行交互的方式,特别的是提供触发外部平台定义的服务并传送数据的能力,该服务在完成的时候将会产生一个 done事件。

 类似资料: