筆者在前一篇文章Scorm標準學(xué)習——基于Scorm1.2(一)中對LMS及Scorm標準體系結構做了介紹。這里將對Scorm運行時(shí)環(huán)境(RTE)進(jìn)行介紹,主要涉及RTE API和數據模型(Data Model),仍基于Scorm1.2標準。更為詳細的信息可參考Scorm1.2標準的官方文檔中關(guān)于RTE的論述。
Scorm標準的目的之一是使得課件與平臺相獨立,使得課件的復用和重組成為可能。CAM定義了Scorm課件的組織結構規范,而RTE則為課件與平臺的交互提供了統一的標準。Scorm RTE定義了通用的內容對象運行機制,包括Launch、API以及Data Model。
Launch: 定義了內容對象的發(fā)布,描述了如何啟動(dòng)一個(gè)Scorm內容對象(Asset和SCO兩種),并確立了內容對象和LMS之間的通信機制。
API: 定義了LMS與內容對象之間的通信API,使得內容對象在需要時(shí)通過(guò)API與LMS進(jìn)行交互存取數據。API會(huì )將獲得的數據模型實(shí)例存儲在用戶(hù)端的內存中(如一個(gè)JavaScript對象),并在需要時(shí)將該數據發(fā)送至LMS平臺。
Data Model: 描述了跟蹤用戶(hù)學(xué)習通用數據模型,即內容對象在與LMS進(jìn)行通信時(shí)所依賴(lài)的數據結構,包括用戶(hù)的學(xué)習時(shí)間、完成狀態(tài)、成績(jì)等元素。LMS需要對每個(gè)用戶(hù)的每個(gè)內容對象維護一個(gè)Data Model數據結構。
API提供了內容對象與LMS通信的接口,而DM則描述了通信所使用的數據模型,API+DM使得內容對象在不同的LMS系統中具有了通用性。
API由LMS提供實(shí)現,向內容對象暴露接口。內容對象(以SCO為例)在需要與LMS交互時(shí)會(huì )主動(dòng)調用LMS提供的API接口,LMS的API實(shí)現一般是以http的方式向LMS Server發(fā)出請求,最終由LMS完成數據的存取。因API暴露在前端,一般采用JavaScript腳本或Java Applet實(shí)現。
Scorm1.2中API函數可分為三類(lèi),如下表:
表1 Scorm API函數分類(lèi)
| 函數分類(lèi) | 描述 | 函數 |
|---|---|---|
| Session Methods | 會(huì )話(huà)函數:通過(guò)API實(shí)例標記內容對象與LMS之間的通信 | LMSInitialize LMSFinish |
| Data-transfer Methods | 數據傳輸函數:用于內容對象與LMS之間的數據傳遞 | LMSSetValue LMSGetValue LMSCommit |
| Support Methods | 支持函數:用于獲取輔助信息,包括錯誤信息和錯誤診斷 | LMSGetLastError LMSGetErrorString LMSGetDiagnostic |
如表1所示,Scorm標準中定義了8個(gè)API函數(Scorm2004稍有不同),其具體功能如下:
LMSInitialize: 初始化函數,負責在當前學(xué)習的內容對象和LMS之間建立通信連接,并從LMS取得該當前用戶(hù)關(guān)于當前內容對象的學(xué)習記錄信息,即整個(gè)DM數據結構。內容對象在載入時(shí)均會(huì )通過(guò)該方法獲得初始運行時(shí)數據。函數成功執行返回"true”(字符串,非布爾值,下同),否則返回"false”。
LMSFinish: 結束函數,結束一個(gè)內容對象與LMS的通信連接。內容對象在退出前均會(huì )調用該方法。通常實(shí)現時(shí),該方法會(huì )調用LMSCommit提交一次最近的數據。當LMS平臺在A(yíng)PI實(shí)現時(shí),選擇HTTP協(xié)議進(jìn)行無(wú)狀態(tài)通信,則該函數本身將不產(chǎn)生數據通信,僅僅是調用LMSCommit提交一次數據。成功執行返回"true”,否則返回"false”。
LMSSetValue: 負責更新一個(gè)數據模型的屬性值。該方法原型為L(cháng)MSSetValue(element, value),參數element標識要設置的屬性,value則是屬性的值。內容對象在需要更改DM的某一屬性值時(shí)會(huì )調用該函數,如當用戶(hù)完成學(xué)習一個(gè)內容對象后需將該內容對象的cmi.core.lesson_status更新為completed。通常該函數只是更新客戶(hù)端內存中該屬性的值,而非直接提交至LMS平臺。函數成功執行返回"true”,否則返回"false”。
LMSGetValue: 獲取一個(gè)數據模型的屬性值。該方法有一個(gè)element參數,表示屬性名。通常該方法直接從客戶(hù)端內存中取出所需的值。成功執行則返回對應的屬性值,否則返回空字符串。
LMSCommit: 提交函數,負責將客戶(hù)端內存中目前的RTE數據提交至LMS平臺,由平臺完成最后的分析寫(xiě)入工作。采用JS實(shí)現的API可用AJAX進(jìn)行數據提交。成功返回"true”,否則返回"false”。
LMSGetLastError: 獲得錯誤碼,當內容對象調用API時(shí)返回"false"或產(chǎn)生其他錯誤時(shí),可調用該函數獲得具體的錯誤代碼,API實(shí)現中需要設置相應的錯誤碼。
LMSGetErrorString: 獲得錯誤碼對應的字符串說(shuō)明,參數為錯誤碼。
LMSGetDiagnostic: 獲得針對當前錯誤的診斷信息,參數為錯誤碼。
Scorm1.2定義的錯誤碼如表2(Scorm2004錯誤碼定義更為詳細):
表2 Scorm1.2錯誤碼
| 錯誤碼 | 描述 |
|---|---|
| 0 | 無(wú)錯誤 |
| 101 | 一般錯誤 |
| 201 | 參數無(wú)效 |
| 202 | 元素屬性無(wú)子節點(diǎn)(children屬性) |
| 203 | 屬性非集合類(lèi)型,無(wú)count屬性 |
| 301 | LMS未初始化 |
| 401 | 未實(shí)現的數據元素模型 |
| 402 | 無(wú)效的setvalue操作,傳遞的element是關(guān)鍵字 |
| 403 | 元素屬性只讀 |
| 404 | 元素屬性只寫(xiě) |
| 405 | 錯誤的數據類(lèi)型 |
Scorm1.2 RTE數據模型部分定義了跟蹤內容對象的數據結構。LMS平臺需要為每個(gè)用戶(hù)的每個(gè)內容單元維護一組數據模型實(shí)例,該實(shí)例數據記錄了該用戶(hù)對應于該內容對象的學(xué)習狀態(tài)(如分數、進(jìn)度、完成狀態(tài)等)。DM中所有的屬性均以cmi開(kāi)頭,以”.“分隔。同時(shí)數據模型中定了了三個(gè)關(guān)鍵字:version、children、_count,保留的關(guān)鍵字受LMS管理,且均為只讀(如使用LMSSetValue設置_version屬性,則會(huì )返回false,且API應在實(shí)現時(shí)將錯誤碼置為402)。
version: 標識了LMS平臺支持的數據模型版本,該屬性不可用于數據模型元素上(即只能以cmi._version方式獲取)
children: 返回某一數據模型元素的所有子屬性(元素),以字符串形式返回,并以執行的分隔符分隔
_count: 返回一個(gè)數據模型元素集合中包含的元素總數,僅用于集合類(lèi)型的數據模型
Scorm1.2為各種數據模型元素定義了如下類(lèi)型:
表3 Scorm1.2數據類(lèi)型
| 數據類(lèi)型 | 描述 |
|---|---|
| CMIBlank | 空字符串 |
| CMIBoolean | bool字符串ture或false |
| CMIDecimal | 帶小數的數字 |
| CMIFeedback | 描述interaction屬性中的內容的結構 |
| CMIIdentifier | 字母數字混合的字符串,不包含空格和非打印字符,不超過(guò)255 |
| CMIInteger | 整數(0, 65536) |
| CMISInteger | 有符號整數(-32768, 32768) |
| CMIString255 | ASCII字符串,不超過(guò)255 |
| CMIString4096 | ASCII字符串,不超過(guò)4096 |
| CMITime | 時(shí)間類(lèi)型,HH:MM:SS.SS |
| CMITimespan | 時(shí)間間隔,格式同上 |
| CMIVocabulary | 單詞表,類(lèi)似枚舉類(lèi)型 |
數據模型元素可以分為9類(lèi),參見(jiàn)表4-表12。
cmi.core: 核心數據,該組中元素屬性L(fǎng)MS必須支持
cmi.suspend_data: 暫存數據,存儲內容對象在恢復時(shí)所需的特定數據
cmi.launch_data: 內容對象運行時(shí)所需的數據
cmi.comments: 關(guān)于內容對象的評論數據,一般來(lái)自用戶(hù)評論
cmi.comments_from_lms: LMS平臺對內容對象的評論信息
cmi.objectives: 針對內容對象的個(gè)人目標集合
cmi.student_data: 基于用戶(hù)偏好的內容對象自定義信息,如運行時(shí)間限制
cmi.student_preference: 針對內容對象的用戶(hù)偏好設置
cmi.interactions: 用戶(hù)交互信息
表4 cmi.core元素屬性
| 屬性名 | 類(lèi)型 | 描述 |
|---|---|---|
| cmi.core._children | CMIString255 | 返回所有屬性 |
| cmi.core.student_id | CMIIdentifier | 當前用戶(hù)(學(xué)生)ID |
| cmi.core.student_name | CMIString255 | 當前用戶(hù)名 |
| cmi.core.lesson_location | CMIString255 | 該用戶(hù)學(xué)習當前內容對象的位置(如一個(gè)swf中的第幾頁(yè)) |
| cmi.core.credit | CMIVocabulary | 是否有學(xué)分(credit/no-credit) |
| cmi.core.lesson_status | CMIVocabulary | 內容對象狀態(tài)(passed/completed/failed/incomplete/browsed/not attempted) |
| cmi.core.entry | CMIVocabulary | 進(jìn)入內容對象的動(dòng)作(ab-initio/resume/空) |
| cmi.core.score._children | CMIString255 | 返回score的子屬性 |
| cmi.core.score.raw | CMIBlank/CMIDecimal | 最后一次成績(jì) |
| cmi.core.score.min | CMIBlank/CMIDecimal | 最低成績(jì) |
| cmi.core.score.max | CMIBlank/CMIDecimal | 最高成績(jì) |
| cmi.core.total_time | CMITimespan | 學(xué)習總時(shí)間 |
| cmi.core.lesson_mode | CMIVocabulary | 內容對象學(xué)習狀態(tài)(normal/review/browse) |
| cmi.core.exit | CMIVocabulary | 退出途徑(time-out/suspend/logout/空) |
| cmi.core.session_time | CMITimespan | 當次學(xué)習時(shí)間 |
表5 cmi.suspend_data元素屬性
| 屬性名 | 類(lèi)型 | 描述 |
|---|---|---|
| cmi.suspend_data | CMIString4096 | 存儲自定義暫存數據 |
表6 cmi.launch_data元素屬性
| 屬性名 | 類(lèi)型 | 描述 |
|---|---|---|
| cmi.launch_data | CMIString4096 | 存儲內容對象運行時(shí)所需數據 |
表7 cmi.comments元素屬性
| 屬性名 | 類(lèi)型 | 描述 |
|---|---|---|
| cmi.comments | CMIString4096 | 存儲評論數據 |
表8 cmi.comments_from_lms元素屬性
| 屬性名 | 類(lèi)型 | 描述 |
|---|---|---|
| cmi.comments_from_lms | CMIString4096 | 存儲LMS關(guān)于內容對象的評論數據 |
表9 cmi.objectives元素屬性
| 屬性名 | 類(lèi)型 | 描述 |
|---|---|---|
| cmi.objectives._children | CMIString255 | 返回所有屬性 |
| cmi.objectives._count | CMIInteger | 返回集合中元素總數 |
| cmi.objectives.n.id | CMIIdentifier | 一個(gè)目標對象ID |
| cmi.objectives.n.score._children | CMIString255 | 獲得score子屬性 |
| cmi.objectives.n.score.raw | CMIBlank/CMIDecimal | 目標分數 |
| cmi.objectives.n.score.min | CMIBlank/CMIDecimal | 目標分數最小值 |
| cmi.objectives.n.score.max | CMIBlank/CMIDecimal | 目標分數最大值 |
| cmi.objectives.n.status | CMIVocabulary | 目標完成狀態(tài)(passed/completed/failed/incomplete/browsed/not attempted) |
表10 cmi.student_data元素屬性
| 屬性名 | 類(lèi)型 | 描述 |
|---|---|---|
| cmi.student_data._children | CMIString255 | 返回子屬性 |
| cmi.student_data.mastery_score | CMIDecimal | 分數閾值(及格分) |
| cmi.student_data.max_time_allowed | CMITimespan | 最大允許時(shí)間 |
| cmi.student_data.time_limit_action | CMIVocabulary | 超時(shí)后動(dòng)作 (exit,message/exit,no message/ continue,message/continue,no message) |
表11 cmi.student_preference元素屬性
| 屬性名 | 類(lèi)型 | 描述 |
|---|---|---|
| cmi.student_preference._children | CMIString255 | 返回子屬性 |
| cmi.student_preference.audio | CMISInteger | 聲音控制 |
| cmi.student_preference.language | CMIString255 | 偏好語(yǔ)言 |
| cmi.student_preference.speed | CMISInteger | 速度 |
| cmi.student_preference.text | CMISInteger | 音頻文字 |
表12 cmi.interactions元素屬性
| 屬性名 | 類(lèi)型 | 描述 |
|---|---|---|
| cmi.interactions._children | CMIString255 | 返回所有屬性 |
| cmi.interactions._count | CMIInteger | 返回集合中元素總數 |
| cmi.interactions.n.id | CMIIdentifier | 某一交互ID |
| cmi.interactions.n.objectives._count | CMIInteger | 交互目標集合中總數 |
| cmi.interactions.n.objectives.n.id | CMIIdentifier | 交互的目標ID |
| cmi.interactions.n.time | CMITime | 交互完成時(shí)間 |
| cmi.interactions.n.type | CMIVocabulary | 交互類(lèi)型 (true-false/choice/fill-in/matching/ performance/sequencing/likert/numeric) |
| cmi.interactions.n.correct_responses._count | CMIInteger | 存儲一個(gè)交互的答案數 |
| cmi.interactions.n.correct_responses.n.pattern | CMIFeedback | 存儲一個(gè)交互的答案 |
| cmi.interactions.n.weighting | CMIDecimal | 一個(gè)交互的權重 |
| cmi.interactions.n.student_response | CMIFeedback | 用戶(hù)提供的答案 |
| cmi.interactions.n.result | CMIVocabulary | 由用戶(hù)答案計算的交互結果 (correct/wrong/unanticipated/neutral/x.x) |
| cmi.interactions.n.latency | CMITimespan | 交互時(shí)間間隔 |
聯(lián)系客服