【转载】Scorm 标准学习 ——Scorm RTE API 与数据模型

作者:admin 时间:24-04-07 阅读数:1048人阅读

【转载】Scorm 标准学习 ——Scorm RTE API 与数据模型

笔者在前一篇文章 Scorm 标准学习 —— 基于 Scorm1.2 (一) 中对 LMS 及 Scorm 标准体系结构做了介绍。这里将对 Scorm 运行时环境 (RTE) 进行介绍,主要涉及 RTE API 和数据模型 (Data Model),仍基于 Scorm1.2 标准。更为详细的信息可参考 Scorm1.2 标准的官方文档中关于 RTE 的论述。 ##Scorm RTE 概述 ## Scorm 标准的目的之一是使得课件与平台相独立,使得课件的复用和重组成为可能。CAM 定义了 Scorm 课件的组织结构规范,而 RTE 则为课件与平台的交互提供了统一的标准。Scorm RTE 定义了通用的内容对象运行机制,包括 Launch、API 以及 Data Model。
Launch: 定义了内容对象的发布,描述了如何启动一个 Scorm 内容对象 (Asset 和 SCO 两种),并确立了内容对象和 LMS 之间的通信机制。
API: 定义了 LMS 与内容对象之间的通信 API,使得内容对象在需要时通过 API 与 LMS 进行交互存取数据。API 会将获得的数据模型实例存储在用户端的内存中 (如一个 JavaScript 对象),并在需要时将该数据发送至 LMS 平台。
Data Model: 描述了跟踪用户学习通用数据模型,即内容对象在与 LMS 进行通信时所依赖的数据结构,包括用户的学习时间、完成状态、成绩等元素。LMS 需要对每个用户的每个内容对象维护一个 Data Model 数据结构。
API 提供了内容对象与 LMS 通信的接口,而 DM 则描述了通信所使用的数据模型,API+DM 使得内容对象在不同的 LMS 系统中具有了通用性。
##API 接口 ## API 由 LMS 提供实现,向内容对象暴露接口。内容对象 (以 SCO 为例) 在需要与 LMS 交互时会主动调用 LMS 提供的 API 接口,LMS 的 API 实现一般是以 http 的方式向 LMS Server 发出请求,最终由 LMS 完成数据的存取。因 API 暴露在前端,一般采用 JavaScript 脚本或 Java Applet 实现。
###API 函数 ### Scorm1.2 中 API 函数可分为三类,如下表:
表 1 Scorm API 函数分类

<table width=100% border="1"> <tr bgcolor="#BBBBBB"> <th width=30%> 函数分类 </th> <th width=40%> 描述 </th> <th width=30%> 函数 </th> </tr> <tr> <td width=30% valign="middle">Session Methods</td> <td width=40% valign="middle"> 会话函数:通过 API 实例标记内容对象与 LMS 之间的通信 </td> <td width=30% align=center>LMSInitialize<br>LMSFinish</td> </tr> <tr> <td width=30% valign="middle">Data-transfer Methods</td> <td width=40% valign="middle"> 数据传输函数:用于内容对象与 LMS 之间的数据传递 </td> <td width=30% align=center>LMSSetValue<br>LMSGetValue<br>LMSCommit</td> </tr> <tr> <td width=30% valign="middle">Support Methods</td> <td width=40% valign="middle"> 支持函数:用于获取辅助信息,包括错误信息和错误诊断 </td> <td width=30% align=center>LMSGetLastError<br>LMSGetErrorString<br>LMSGetDiagnostic</td> </tr> </table> 如表 1 所示,Scorm 标准中定义了 8 个 API 函数 (Scorm2004 稍有不同),其具体功能如下: **LMSInitialize:** 初始化函数,负责在当前学习的内容对象和 LMS 之间建立通信连接,并从 LMS 取得该当前用户关于当前内容对象的学习记录信息,即整个 DM 数据结构。内容对象在载入时均会通过该方法获得初始运行时数据。函数成功执行返回 "true"(字符串,非布尔值,下同),否则返回 "false"。 **LMSFinish:** 结束函数,结束一个内容对象与 LMS 的通信连接。内容对象在退出前均会调用该方法。通常实现时,该方法会调用 LMSCommit 提交一次最近的数据。当 LMS 平台在 API 实现时,选择 HTTP 协议进行无状态通信,则该函数本身将不产生数据通信,仅仅是调用 LMSCommit 提交一次数据。成功执行返回 "true",否则返回 "false"。 **LMSSetValue:** 负责更新一个数据模型的属性值。该方法原型为 LMSSetValue (element, value),参数 element 标识要设置的属性,value 则是属性的值。内容对象在需要更改 DM 的某一属性值时会调用该函数,如当用户完成学习一个内容对象后需将该内容对象的 cmi.core.lesson_status 更新为 completed。通常该函数只是更新客户端内存中该属性的值,而非直接提交至 LMS 平台。函数成功执行返回 "true",否则返回 "false"。 **LMSGetValue:** 获取一个数据模型的属性值。该方法有一个 element 参数,表示属性名。通常该方法直接从客户端内存中取出所需的值。成功执行则返回对应的属性值,否则返回空字符串。 **LMSCommit:** 提交函数,负责将客户端内存中目前的 RTE 数据提交至 LMS 平台,由平台完成最后的分析写入工作。采用 JS 实现的 API 可用 AJAX 进行数据提交。成功返回 "true",否则返回 "false"。 **LMSGetLastError:** 获得错误码,当内容对象调用 API 时返回 "false" 或产生其他错误时,可调用该函数获得具体的错误代码,API 实现中需要设置相应的错误码。 **LMSGetErrorString:** 获得错误码对应的字符串说明,参数为错误码。 **LMSGetDiagnostic:** 获得针对当前错误的诊断信息,参数为错误码。 ### 错误码 ### Scorm1.2 定义的错误码如表 2 (Scorm2004 错误码定义更为详细): * 表 2 Scorm1.2 错误码 * <table width=100% border="1"> <tr bgcolor=#BBBBBB> <th width=20%> 错误码 </th> <th width=60% align="left"> 描述 </th> </tr> <tr> <td width=20% valign="middle" align="center">0</td> <td width=60% valign="middle"> 无错误 </td> </tr> <tr> <td width=20% valign="middle" align="center">101</td> <td width=60% valign="middle"> 一般错误 </td> </tr> <tr> <td width=20% valign="middle" align="center">201</td> <td width=60% valign="middle"> 参数无效 </td> </tr> <tr> <td width=20% valign="middle" align="center">202</td> <td width=60% valign="middle"> 元素属性无子节点 (children 属性)</td> </tr> <tr> <td width=20% valign="middle" align="center">203</td> <td width=60% valign="middle"> 属性非集合类型,无 count 属性 </td> </tr> <tr> <td width=20% valign="middle" align="center">301</td> <td width=60% valign="middle">LMS 未初始化 </td> </tr> <tr> <td width=20% valign="middle" align="center">401</td> <td width=60% valign="middle"> 未实现的数据元素模型 </td> </tr> <tr> <td width=20% valign="middle" align="center">402</td> <td width=60% valign="middle"> 无效的 setvalue 操作,传递的 element 是关键字 </td> </tr> <tr> <td width=20% valign="middle" align="center">403</td> <td width=60% valign="middle"> 元素属性只读 </td> </tr> <tr> <td width=20% valign="middle" align="center">404</td> <td width=60% valign="middle"> 元素属性只写 </td> </tr> <tr> <td width=20% valign="middle" align="center">405</td> <td width=60% valign="middle"> 错误的数据类型 </td> </tr> </table> ##Data Model## Scorm1.2 RTE 数据模型部分定义了跟踪内容对象的数据结构。LMS 平台需要为每个用户的每个内容单元维护一组数据模型实例,该实例数据记录了该用户对应于该内容对象的学习状态 (如分数、进度、完成状态等)。DM 中所有的属性均以 cmi 开头,以 "." 分隔。同时数据模型中定了了三个关键字:_version、_children、_count,保留的关键字受 LMS 管理,且均为只读 (如使用 LMSSetValue 设置_version 属性,则会返回 false,且 API 应在实现时将错误码置为 402)。 **_version:** 标识了 LMS 平台支持的数据模型版本,该属性不可用于数据模型元素上 (即只能以 cmi._version 方式获取) **_children:** 返回某一数据模型元素的所有子属性 (元素),以字符串形式返回,并以执行的分隔符分隔 **_count:** 返回一个数据模型元素集合中包含的元素总数,仅用于集合类型的数据模型 ### 数据类型 ### Scorm1.2 为各种数据模型元素定义了如下类型: * 表 3 Scorm1.2 数据类型 * <table width=100% border="1"> <tr bgcolor=#EEEEEE> <th width=20% align="left"> 数据类型 </th> <th width=60% align="left"> 描述 </th> </tr> <tr> <td width=20% valign="middle">CMIBlank</td> <td width=60% valign="middle"> 空字符串 </td> </tr> <tr> <td width=20% valign="middle">CMIBoolean</td> <td width=60% valign="middle">bool 字符串 ture 或 false</td> </tr> <tr> <td width=20% valign="middle">CMIDecimal</td> <td width=60% valign="middle"> 带小数的数字 </td> </tr> <tr> <td width=20% valign="middle">CMIFeedback</td> <td width=60% valign="middle"> 描述 interaction 属性中的内容的结构 </td> </tr> <tr> <td width=20% valign="middle">CMIIdentifier</td> <td width=60% valign="middle"> 字母数字混合的字符串,不包含空格和非打印字符,不超过 255</td> </tr> <tr> <td width=20% valign="middle">CMIInteger</td> <td width=60% valign="middle"> 整数 (0, 65536)</td> </tr> <tr> <td width=20% valign="middle">CMISInteger</td> <td width=60% valign="middle"> 有符号整数 (-32768, 32768)</td> </tr> <tr> <td width=20% valign="middle">CMIString255</td> <td width=60% valign="middle">ASCII 字符串,不超过 255</td> </tr> <tr> <td width=20% valign="middle">CMIString4096</td> <td width=60% valign="middle">ASCII 字符串,不超过 4096</td> </tr> <tr> <td width=20% valign="middle">CMITime</td> <td width=60% valign="middle"> 时间类型,HH:MM:SS.SS</td> </tr> <tr> <td width=20% valign="middle">CMITimespan</td> <td width=60% valign="middle"> 时间间隔,格式同上 </td> </tr> <tr> <td width=20% valign="middle">CMIVocabulary</td> <td width=60% valign="middle"> 单词表,类似枚举类型 </td> </tr> </table> ### 数据模型元素 ### 数据模型元素可以分为 9 类,参见表 4 - 表 12。 **cmi.core:** 核心数据,该组中元素属性 LMS 必须支持 **cmi.suspend_data:** 暂存数据,存储内容对象在恢复时所需的特定数据 **cmi.launch_data:** 内容对象运行时所需的数据 **cmi.comments:** 关于内容对象的评论数据,一般来自用户评论 **cmi.comments_from_lms:** LMS 平台对内容对象的评论信息 **cmi.objectives:** 针对内容对象的个人目标集合 **cmi.student_data:** 基于用户偏好的内容对象自定义信息,如运行时间限制 **cmi.student_preference:** 针对内容对象的用户偏好设置 **cmi.interactions:** 用户交互信息 * 表 4 cmi.core 元素属性 * <table width=100% border="1"> <tr bgcolor=#BBBBBB> <th width=20% align="left"> 属性名 </th> <th width=20% align="left"> 类型 </th> <th width=60% align="left"> 描述 </th> </tr> <tr> <td width=20% valign="middle">cmi.core._children</td> <td width=20% align="left">CMIString255</td> <td width=60% valign="middle"> 返回所有属性 </td> </tr> <tr> <td width=20% valign="middle">cmi.core.student_id</td> <td width=20% align="left">CMIIdentifier</td> <td width=60% valign="middle"> 当前用户 (学生) ID</td> </tr> <tr> <td width=20% valign="middle">cmi.core.student_name</td> <td width=20% align="left">CMIString255</td> <td width=60% valign="middle"> 当前用户名 </td> </tr> <tr> <td width=20% valign="middle">cmi.core.lesson_location</td> <td width=20% align="left">CMIString255</td> <td width=60% valign="middle"> 该用户学习当前内容对象的位置 (如一个 swf 中的第几页)</td> </tr> <tr> <td width=20% valign="middle">cmi.core.credit</td> <td width=20% align="left">CMIVocabulary</td> <td width=60% valign="middle"> 是否有学分 (credit/no-credit)</td> </tr> <tr> <td width=20% valign="middle">cmi.core.lesson_status</td> <td width=20% align="left">CMIVocabulary</td> <td width=60% valign="middle"> 内容对象状态 (passed/completed/failed/incomplete/browsed/not attempted)</td> </tr> <tr> <td width=20% valign="middle">cmi.core.entry</td> <td width=20% align="left">CMIVocabulary</td> <td width=60% valign="middle"> 进入内容对象的动作 (ab-initio/resume/ 空)</td> </tr> <tr> <td width=20% valign="middle">cmi.core.score._children</td> <td width=20% align="left">CMIString255</td> <td width=60% valign="middle"> 返回 score 的子属性 </td> </tr> <tr> <td width=20% valign="middle">cmi.core.score.raw</td> <td width=20% align="left">CMIBlank/CMIDecimal</td> <td width=60% valign="middle"> 最后一次成绩 </td> </tr> <tr> <td width=20% valign="middle">cmi.core.score.min</td> <td width=20% align="left">CMIBlank/CMIDecimal</td> <td width=60% valign="middle"> 最低成绩 </td> </tr> <tr> <td width=20% valign="middle">cmi.core.score.max</td> <td width=20% align="left">CMIBlank/CMIDecimal</td> <td width=60% valign="middle"> 最高成绩 </td> </tr> <tr> <td width=20% valign="middle">cmi.core.total_time</td> <td width=20% align="left">CMITimespan</td> <td width=60% valign="middle"> 学习总时间 </td> </tr> <tr> <td width=20% valign="middle">cmi.core.lesson_mode</td> <td width=20% align="left">CMIVocabulary</td> <td width=60% valign="middle"> 内容对象学习状态 (normal/review/browse)</td> </tr> <tr> <td width=20% valign="middle">cmi.core.exit</td> <td width=20% align="left">CMIVocabulary</td> <td width=60% valign="middle"> 退出途径 (time-out/suspend/logout/ 空)</td> </tr> <tr> <td width=20% valign="middle">cmi.core.session_time</td> <td width=20% align="left">CMITimespan</td> <td width=60% valign="middle"> 当次学习时间 </td> </tr> </table> * 表 5 cmi.suspend_data 元素属性 * <table width=100% border="1"> <tr bgcolor=#BBBBBB> <th width=20% align="left"> 属性名 </th> <th width=20% align="left"> 类型 </th> <th width=60% align="left"> 描述 </th> </tr> <tr> <td width=20% valign="middle">cmi.suspend_data</td> <td width=20% align="left">CMIString4096</td> <td width=60% valign="middle"> 存储自定义暂存数据 </td> </tr> </table> * 表 6 cmi.launch_data 元素属性 * <table width=100% border="1"> <tr bgcolor=#BBBBBB> <th width=20% align="left"> 属性名 </th> <th width=20% align="left"> 类型 </th> <th width=60% align="left"> 描述 </th> </tr> <tr> <td width=20% valign="middle">cmi.launch_data</td> <td width=20% align="left">CMIString4096</td> <td width=60% valign="middle"> 存储内容对象运行时所需数据 </td> </tr> </table> * 表 7 cmi.comments 元素属性 * <table width=100% border="1"> <tr bgcolor=#BBBBBB> <th width=20% align="left"> 属性名 </th> <th width=20% align="left"> 类型 </th> <th width=60% align="left"> 描述 </th> </tr> <tr> <td width=20% valign="middle">cmi.comments</td> <td width=20% align="left">CMIString4096</td> <td width=60% valign="middle"> 存储评论数据 </td> </tr> </table> * 表 8 cmi.comments_from_lms 元素属性 * <table width=100% border="1"> <tr bgcolor=#BBBBBB> <th width=20% align="left"> 属性名 </th> <th width=20% align="left"> 类型 </th> <th width=60% align="left"> 描述 </th> </tr> <tr> <td width=20% valign="middle">cmi.comments_from_lms</td> <td width=20% align="left">CMIString4096</td> <td width=60% valign="middle"> 存储 LMS 关于内容对象的评论数据 </td> </tr> </table> * 表 9 cmi.objectives 元素属性 * <table width=100% border="1"> <tr bgcolor=#BBBBBB> <th width=20% align="left"> 属性名 </th> <th width=20% align="left"> 类型 </th> <th width=60% align="left"> 描述 </th> </tr> <tr> <td width=20% valign="middle">cmi.objectives._children</td> <td width=20% align="left">CMIString255</td> <td width=60% valign="middle"> 返回所有属性 </td> </tr> <tr> <td width=20% valign="middle">cmi.objectives._count</td> <td width=20% align="left">CMIInteger</td> <td width=60% valign="middle"> 返回集合中元素总数 </td> </tr> <tr> <td width=20% valign="middle">cmi.objectives.n.id</td> <td width=20% align="left">CMIIdentifier</td> <td width=60% valign="middle"> 一个目标对象 ID</td> </tr> <tr> <td width=20% valign="middle">cmi.objectives.n.score._children</td> <td width=20% align="left">CMIString255</td> <td width=60% valign="middle"> 获得 score 子属性 </td> </tr> <tr> <td width=20% valign="middle">cmi.objectives.n.score.raw</td> <td width=20% align="left">CMIBlank/CMIDecimal</td> <td width=60% valign="middle"> 目标分数 </td> </tr> <tr> <td width=20% valign="middle">cmi.objectives.n.score.min</td> <td width=20% align="left">CMIBlank/CMIDecimal</td> <td width=60% valign="middle"> 目标分数最小值 </td> </tr> <tr> <td width=20% valign="middle">cmi.objectives.n.score.max</td> <td width=20% align="left">CMIBlank/CMIDecimal</td> <td width=60% valign="middle"> 目标分数最大值 </td> </tr> <tr> <td width=20% valign="middle">cmi.objectives.n.status</td> <td width=20% align="left">CMIVocabulary</td> <td width=60% valign="middle"> 目标完成状态 (passed/completed/failed/incomplete/browsed/not attempted)</td> </tr> </table> * 表 10 cmi.student_data 元素属性 * <table width=100% border="1"> <tr bgcolor=#BBBBBB> <th width=20% align="left"> 属性名 </th> <th width=20% align="left"> 类型 </th> <th width=60% align="left"> 描述 </th> </tr> <tr> <td width=20% valign="middle">cmi.student_data._children</td> <td width=20% align="left">CMIString255</td> <td width=60% valign="middle"> 返回子属性 </td> </tr> <tr> <td width=20% valign="middle">cmi.student_data.mastery_score</td> <td width=20% align="left">CMIDecimal</td> <td width=60% valign="middle"> 分数阈值 (及格分)</td> </tr> <tr> <td width=20% valign="middle">cmi.student_data.max_time_allowed</td> <td width=20% align="left">CMITimespan</td> <td width=60% valign="middle"> 最大允许时间 </td> </tr> <tr> <td width=20% valign="middle">cmi.student_data.time_limit_action</td> <td width=20% align="left">CMIVocabulary</td> <td width=60% valign="middle"> 超时后动作 < br>(exit,message/exit,no message/<br>continue,message/continue,no message)</td> </tr> </table> * 表 11 cmi.student_preference 元素属性 * <table width=100% border="1"> <tr bgcolor=#BBBBBB> <th width=20% align="left"> 属性名 </th> <th width=20% align="left"> 类型 </th> <th width=60% align="left"> 描述 </th> </tr> <tr> <td width=20% valign="middle">cmi.student_preference._children</td> <td width=20% align="left">CMIString255</td> <td width=60% valign="middle"> 返回子属性 </td> </tr> <tr> <td width=20% valign="middle">cmi.student_preference.audio</td> <td width=20% align="left">CMISInteger</td> <td width=60% valign="middle"> 声音控制 </td> </tr> <tr> <td width=20% valign="middle">cmi.student_preference.language</td> <td width=20% align="left">CMIString255</td> <td width=60% valign="middle"> 偏好语言 </td> </tr> <tr> <td width=20% valign="middle">cmi.student_preference.speed</td> <td width=20% align="left">CMISInteger</td> <td width=60% valign="middle"> 速度 </td> </tr> <tr> <td width=20% valign="middle">cmi.student_preference.text</td> <td width=20% align="left">CMISInteger</td> <td width=60% valign="middle"> 音频文字 </td> </tr> </table> * 表 12 cmi.interactions 元素属性 * <table width=100% border="1"> <tr bgcolor=#BBBBBB> <th width=40% align="left"> 属性名 </th> <th width=20% align="left"> 类型 </th> <th width=40% align="left"> 描述 </th> </tr> <tr> <td width=40% valign="middle">cmi.interactions._children</td> <td width=20% align="left">CMIString255</td> <td width=40% valign="middle"> 返回所有属性 </td> </tr> <tr> <td width=40% valign="middle">cmi.interactions._count</td> <td width=20% align="left">CMIInteger</td> <td width=40% valign="middle"> 返回集合中元素总数 </td> </tr> <tr> <td width=20% valign="middle">cmi.interactions.n.id</td> <td width=20% align="left">CMIIdentifier</td> <td width=60% valign="middle"> 某一交互 ID</td> </tr> <tr> <td width=40% valign="middle">cmi.interactions.n.objectives._count</td> <td width=20% align="left">CMIInteger</td> <td width=40% valign="middle"> 交互目标集合中总数 </td> </tr> <tr> <td width=20% valign="middle">cmi.interactions.n.objectives.n.id</td> <td width=20% align="left">CMIIdentifier</td> <td width=60% valign="middle"> 交互的目标 ID</td> </tr> <tr> <td width=40% valign="middle">cmi.interactions.n.time</td> <td width=20% align="left">CMITime</td> <td width=40% valign="middle"> 交互完成时间 </td> </tr> <tr> <td width=40% valign="middle">cmi.interactions.n.type</td> <td width=20% align="left">CMIVocabulary</td> <td width=40% valign="middle"> 交互类型 < br>(true-false/choice/fill-in/matching/<br>performance/sequencing/likert/numeric)</td> </tr> <tr> <td width=40% valign="middle">cmi.interactions.n.correct_responses._count</td> <td width=20% align="left">CMIInteger</td> <td width=40% valign="middle"> 存储一个交互的答案数 </td> </tr> <tr> <td width=40% valign="middle">cmi.interactions.n.correct_responses.n.pattern</td> <td width=20% align="left">CMIFeedback</td> <td width=40% valign="middle"> 存储一个交互的答案 </td> </tr> <tr> <td width=40% valign="middle">cmi.interactions.n.weighting</td> <td width=20% align="left">CMIDecimal</td> <td width=40% valign="middle"> 一个交互的权重 </td> </tr> <tr> <td width=40% valign="middle">cmi.interactions.n.student_response</td> <td width=20% align="left">CMIFeedback</td> <td width=40% valign="middle"> 用户提供的答案 </td> </tr> <tr> <td width=40% valign="middle">cmi.interactions.n.result</td> <td width=20% align="left">CMIVocabulary</td> <td width=40% valign="middle"> 由用户答案计算的交互结果 < br>(correct/wrong/unanticipated/neutral/x.x)</td> </tr> <tr> <td width=40% valign="middle">cmi.interactions.n.latency</td> <td width=20% align="left">CMITimespan</td> <td width=40% valign="middle"> 交互时间间隔 </td> </tr> </table>

摘自:https://my.oschina.net/vincentwy/blog/153128

文章标签:# scorm# 课程制作

作者介绍:

作者李凡在人才发展咨询、能力评估与测评、企业大学及培训管理、培训讲师培养、业务技能与管理领导力培训、教练引导技术、课程开发与设计、混合式学习项目设计等方面都积累了丰富的经验与成果。

  • 企业教练:欧卡教练认证企业带领师
  • 个人教练:欧卡教练认证复原卡带领师
  • 讲师培养:CTT创新性培训技术(认证)
  • 绩效咨询:华商基业绩效改进师(中级)
  • 结构思维:华商基业结构性思维认证讲师
  • 领导力课:新经理、中高层管理培训师
  • 课程设计:企业培训课程设计师
  • 学习项目:CSTD认证学习项目设计师

版权声明:

本站原创文章由admin在凡聊企陪(lfzsf.com)站点发布,未经许可,不得转载。

如未声明则本网站所有源码和软件均为作者提供和网友推荐收集整理而来,仅供学习和研究使用。

转载文章如果涉及版权问题,如有侵犯你版权的,请及时【与我联系】。

发表评论

遇到问题?请给我们留言

请填写您的电话号码,我们将回复您电话

您是本站第2808名访客 今日有0篇新文章