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