運(yùn)行時(shí)環(huán)境概述
SCORM運(yùn)行時(shí)環(huán)境模型定義了:發(fā)布內(nèi)容對(duì)象、在LMSs和SCOs之間建立通信機(jī)制以及根據(jù)LMSs和SCOs之間的通信信息來(lái)管理跟蹤信息。在SCORM中,內(nèi)容對(duì)象有兩種: ● 可共享內(nèi)容對(duì)象(SCOs), SCOs可以在運(yùn)行時(shí)與LMS通信; ● 素材(Assets),Assets在運(yùn)行時(shí)不與LMS通信; 運(yùn)行時(shí)環(huán)境主要處理: ● 將內(nèi)容對(duì)象傳遞到學(xué)習(xí)者的瀏覽器中(例如發(fā)布學(xué)習(xí)內(nèi)容); ● 在需要時(shí),內(nèi)容對(duì)象如何與LMS互相通信; ● 內(nèi)容對(duì)象的什么信息應(yīng)該被跟蹤以及LMS如何管理這些信息;
SCORM的目的是學(xué)習(xí)資源可以在不同的學(xué)習(xí)管理系統(tǒng)中重復(fù)使用和具有互操作性。要使這些成為可能,必須有公共的方法啟動(dòng)學(xué)習(xí)資源、公共的機(jī)制使學(xué)習(xí)資源和LMS進(jìn)行交流,并要有預(yù)定義的語(yǔ)言和詞匯形成這種交流的基礎(chǔ)。實(shí)時(shí)運(yùn)行環(huán)境(Run-Time Environment)就提供了這種公共機(jī)制。實(shí)時(shí)運(yùn)行環(huán)境有三個(gè)方面: 運(yùn)行(Launch)、應(yīng)用編程接口(API)和數(shù)據(jù)模型(Data Model)。
● 運(yùn)行(Launch)處理為L(zhǎng)MSs定義了一個(gè)通用的方法來(lái)啟動(dòng)內(nèi)容對(duì)象。在SCORM中定義了兩種內(nèi)容對(duì)象:Assests和SCOs。運(yùn)行處理確立了在運(yùn)行的內(nèi)容對(duì)象與LMS之間的通信機(jī)制,這種通訊通過(guò)公共的API進(jìn)行標(biāo)準(zhǔn)化。
● API是內(nèi)容對(duì)象與LMS之間傳送的信息的一種通信機(jī)制,使用API可以開(kāi)始、結(jié)束、獲取、存儲(chǔ)數(shù)據(jù)等動(dòng)作。
● 數(shù)據(jù)模型(Data Model)主要描述了在SCO與LMS之間傳送信息數(shù)據(jù)的模型,如SCO的跟蹤信息,SCO的完成狀態(tài)、一次測(cè)試的成績(jī)等數(shù)據(jù)。在學(xué)習(xí)者會(huì)話中,LMS必須維護(hù)來(lái)自SCO數(shù)據(jù)模型的狀態(tài)信息。而SCO需要利用這些預(yù)先定義的信息,以便在不同的LMS中重復(fù)使用。
管理運(yùn)行時(shí)環(huán)境
當(dāng)學(xué)習(xí)者與內(nèi)容對(duì)象交互(學(xué)習(xí)嘗試)時(shí),LMS需要處理學(xué)習(xí)者的導(dǎo)航請(qǐng)求。當(dāng)LMS確定一個(gè)學(xué)習(xí)活動(dòng)請(qǐng)求對(duì)學(xué)習(xí)者時(shí)有效的時(shí)候(一個(gè)學(xué)習(xí)活動(dòng)與一個(gè)內(nèi)容對(duì)象相關(guān)聯(lián)),LMS才會(huì)將內(nèi)容對(duì)象發(fā)布到學(xué)習(xí)者面前。
運(yùn)行時(shí)環(huán)境臨時(shí)模型
當(dāng)學(xué)習(xí)者與內(nèi)容對(duì)象交互的時(shí)候,一個(gè)與內(nèi)容對(duì)象(Asset或SCO)相關(guān)聯(lián)的學(xué)習(xí)活動(dòng)(Activity)被確定,并且被傳送到學(xué)習(xí)者的瀏覽器中。在學(xué)習(xí)者的一次學(xué)習(xí)嘗試中,有幾個(gè)關(guān)鍵的概念需要明確定義:
● Learner Attempt(學(xué)習(xí)嘗試): 使用內(nèi)容對(duì)象來(lái)跟蹤學(xué)習(xí)者一次學(xué)習(xí)活動(dòng)的努力與滿意情況。一次學(xué)習(xí)嘗試可以跨越一個(gè)或多個(gè)學(xué)習(xí)者的課程,并且在課程間可能被懸掛(暫停學(xué)習(xí))。 ● Learner Session(學(xué)習(xí)會(huì)話): 指在學(xué)習(xí)者訪問(wèn)一個(gè)內(nèi)容對(duì)象時(shí)的一個(gè)不間斷的時(shí)間段。 ● Communication Session(通信會(huì)話): 指在一個(gè)內(nèi)容對(duì)象(如:SCO)與一個(gè)應(yīng)用程序接口之間的一個(gè)活動(dòng)連接。 ● Login Session(登錄會(huì)話): 指學(xué)習(xí)者開(kāi)始一個(gè)會(huì)話(登錄),直到學(xué)習(xí)者終止會(huì)話(登出)之間的時(shí)間段。
對(duì)于Asset來(lái)說(shuō),RTE僅由獨(dú)立的學(xué)習(xí)嘗試和學(xué)習(xí)會(huì)話組成,每個(gè)發(fā)布的Asset的學(xué)習(xí)嘗試都有相應(yīng)的學(xué)習(xí)會(huì)話。當(dāng)一個(gè)學(xué)習(xí)活動(dòng)被確認(rèn),并且傳送到學(xué)習(xí)者面前,學(xué)習(xí)嘗試就開(kāi)始了。在學(xué)習(xí)嘗試期間,學(xué)習(xí)者與內(nèi)容對(duì)象(SCO或Asset)交互。當(dāng)學(xué)習(xí)內(nèi)容被傳送到學(xué)習(xí)者瀏覽器內(nèi)并開(kāi)始使用時(shí),學(xué)習(xí)會(huì)話開(kāi)始了。當(dāng)運(yùn)行的內(nèi)容對(duì)象時(shí)SCO時(shí),SCO會(huì)與LMS進(jìn)行初始化通信,這樣通信會(huì)話就開(kāi)始了。當(dāng)SCO與LMS終止通信時(shí),通信會(huì)話就結(jié)束了。當(dāng)SCO處于暫停狀態(tài)離開(kāi)(學(xué)習(xí)者未通過(guò)SCO)或SCO處于正常狀態(tài)離開(kāi)(學(xué)習(xí)者通過(guò)SCO要求離開(kāi)學(xué)習(xí)嘗試)時(shí),學(xué)習(xí)者會(huì)話結(jié)束。對(duì)于SCO來(lái)說(shuō),學(xué)習(xí)者在正常狀態(tài)下結(jié)束學(xué)習(xí)會(huì)話時(shí),學(xué)習(xí)嘗試也相應(yīng)結(jié)束。對(duì)于Asset來(lái)說(shuō),學(xué)習(xí)者結(jié)束Asset時(shí),學(xué)習(xí)嘗試也結(jié)束了。
LMS必須定義一些運(yùn)行時(shí)數(shù)據(jù)集合,在Learner Attempt期間,SCO可以使用該集合與LMS互相通信。對(duì)于一個(gè)SCO來(lái)講,當(dāng)Learner Attempt開(kāi)始時(shí),LMS必須建立和初始化新的運(yùn)行時(shí)數(shù)據(jù)集合,以供SCO訪問(wèn)和使用。SCORM不規(guī)定必須完全重新建立一個(gè)運(yùn)行時(shí)數(shù)據(jù)集合,但是對(duì)于SCO來(lái)說(shuō),它在訪問(wèn)和使用該數(shù)據(jù)集合的時(shí)候,感覺(jué)象在使用一個(gè)新的運(yùn)行時(shí)數(shù)據(jù)集合。 LMS可以選擇保存運(yùn)行時(shí)數(shù)據(jù)集合,以供其他地方使用,例如報(bào)表、審核、統(tǒng)計(jì)等。LMS也可以選擇不保存先前的學(xué)習(xí)嘗試的運(yùn)行時(shí)數(shù)據(jù)。只有在學(xué)習(xí)嘗試被暫停的情況下,LMS必須保存該學(xué)習(xí)嘗試的運(yùn)行時(shí)數(shù)據(jù)集合,以便該學(xué)習(xí)嘗試恢復(fù)運(yùn)行時(shí)使用。注意,當(dāng)學(xué)習(xí)嘗試被暫停,Learner Session和Learner Attempt都被結(jié)束了,因此當(dāng)下一次Learner Session開(kāi)始時(shí),將會(huì)產(chǎn)生新的運(yùn)行時(shí)數(shù)據(jù)集合,因此LMS需要將上次保存的運(yùn)行時(shí)數(shù)據(jù)集合填充到新的運(yùn)行時(shí)數(shù)據(jù)集合中去。
具有單個(gè)Learner Session的Learner Attempt。
具有多個(gè)Learner Session的Learner Attempt。在這里L(fēng)earner Session被暫停多次,而Learner Attempt隨后被重新繼續(xù),直到Learner Session于正常狀態(tài)下被終止。
多個(gè)Learner Attempt和多個(gè)Learner Session。
應(yīng)用程序接口(API)
概述
使用一個(gè)公共的API是為了提供一個(gè)標(biāo)準(zhǔn)的方法,使用該方法可以使的SCOs和LMSs之間互相通信,以達(dá)到互動(dòng)性與重用性。怎樣執(zhí)行API進(jìn)行通信是SCO開(kāi)發(fā)者的事,同樣服務(wù)器端的LMS怎樣提供一個(gè)API實(shí)例以供SCO使用也不是由SCORM規(guī)定的,具體實(shí)現(xiàn)細(xì)節(jié)由LMS廠商決定。
由上圖可以看到API只是一些函數(shù)的集合,SCO使用該函數(shù)集合與LMS進(jìn)行通信。
● API執(zhí)行(API Implementation)是一個(gè)功能函數(shù)的一部分,API執(zhí)行函數(shù)的實(shí)現(xiàn)與SCO開(kāi)發(fā)者無(wú)關(guān)。LMS需要提供API執(zhí)行的實(shí)現(xiàn),而且對(duì)客戶端的SCO呈現(xiàn)出部分公共的接口。
● API實(shí)例(API Instance)是API執(zhí)行的上下文和狀態(tài),是與SCO操作時(shí)的一個(gè)實(shí)例。 API是SCO與LMS之間的通訊機(jī)制。根據(jù)作用API的方法分為三類:
使用API方法必須注意以下幾點(diǎn): ● 所有的方法名稱是大小寫(xiě)敏感的; ● 所有的方法的參數(shù)也是大小寫(xiě)敏感的; ● 所有通過(guò)參數(shù)傳遞的數(shù)據(jù)都是字符串的形式。
會(huì)話方法有: ● Initialize(“”) ● Terminate(“”)
數(shù)據(jù)轉(zhuǎn)換方法有: ● GetValue(parameter) ● SetValue(parameter_1, parameter_2) ● Commit(parameter)
支持方法有: ● GetLastError() ● GetErrorString(parameter) ● GetDiagnostic(parameter)
通信會(huì)話狀態(tài)模型 通信會(huì)話狀態(tài)模型定義了API實(shí)例的狀態(tài)模型。API實(shí)例的狀態(tài)有三種: ● 未初始化 ● 運(yùn)行中 ● 終止
未初始化(Not Initialized)狀態(tài):這個(gè)通信狀態(tài)表示在運(yùn)行SCO時(shí)但是SCO還沒(méi)有調(diào)用Initialize(“”)方法之前的API實(shí)例的狀態(tài)。在這期間,SCO需要搜索LMS提供的API實(shí)例。SCO可以調(diào)用下面幾個(gè)API方法: ● GetLastError() ● GetErrorString() ● GetDiagnostic()
運(yùn)行(Running)狀態(tài):這個(gè)通信狀態(tài)表示在SCO成功調(diào)用Initialize()方法之后,并且SCO成功調(diào)用Terminate()方法之前的API實(shí)例的狀態(tài)。在這個(gè)狀態(tài)中SCO允許使用下列API方法: ● GetValue() ● SetValue() ● Commit() ● GetLastError() ● GetErrorString() ● GetDiagnositic()
終止(Terminated)狀態(tài):這個(gè)通信狀態(tài)表示SCO成功調(diào)用Terminate()方法之后API實(shí)例的狀態(tài)。在這個(gè)狀態(tài)中SCO允許使用下列API方法: ● GetLastError() ● GetErrorString() ● GetDiagnositic()
API執(zhí)行的錯(cuò)誤代碼
所有的錯(cuò)誤代碼都是整形數(shù),并且通過(guò)轉(zhuǎn)換成一個(gè)字符串返回。錯(cuò)誤代碼可以使用0到65535之間的數(shù)字。其中0到999是被保留使用的。所以1000到65535之間任意的數(shù)字是任意使用的。 所有的API方法在執(zhí)行完都需要提供一個(gè)錯(cuò)誤代碼,除了支持方法:GetLastError()、GetErrorString()、GetDiagnositic()。SCO可以使用GetLastError()方法來(lái)獲得最近一次API方法調(diào)用后的錯(cuò)誤代碼,使用GetLastErrorString()來(lái)獲得錯(cuò)誤的描述信息。下面就是錯(cuò)誤代碼的分類表格:
LMS的職責(zé)
SCORM規(guī)定LMS必須提供一個(gè)符合標(biāo)準(zhǔn)的API實(shí)例,該實(shí)例實(shí)現(xiàn)了SCORM所規(guī)定的API方法。為了給SCO提供API實(shí)例,LMS必須實(shí)現(xiàn)如何訪問(wèn)或定位API實(shí)例的功能。為了實(shí)現(xiàn)該功能,LMS必須提供一個(gè)名為”API_1484_11”的對(duì)象, LMS必須提供使SCO通過(guò)ECMAScript腳本能夠訪問(wèn)到該API實(shí)例對(duì)象。
LMS可以在瀏覽器的子窗口中執(zhí)行SCO,也可以在一個(gè)子Frame中運(yùn)行SCO。而SCO通過(guò)ECMAScript來(lái)搜索和定位API實(shí)例。
SCO的職責(zé)
SCO的責(zé)任是通過(guò)API與LMS進(jìn)行通信。SCO必須能尋找和定位API實(shí)例,這樣SCO就可以通過(guò)LMS對(duì)學(xué)習(xí)者進(jìn)行跟蹤。 在SCORM環(huán)境中,內(nèi)容對(duì)象是運(yùn)行于web瀏覽器中,通過(guò)瀏覽器提供的DOM樹(shù)可以定位API實(shí)例對(duì)象。DOM對(duì)一個(gè)頁(yè)面中的所有對(duì)象的結(jié)構(gòu)進(jìn)行了組織。SCO在定位API實(shí)例時(shí)必須尋找下列位置:
1. 搜索當(dāng)前窗口的父窗口,父窗口的父窗口,一直追溯上去,直到最頂層的窗口; 2. 搜索開(kāi)啟窗口,即打開(kāi)當(dāng)前窗口的那個(gè)窗口; 3. 搜索開(kāi)啟窗口,如果開(kāi)啟窗口有父窗口的話,也必須一直追溯上去,直到最頂層的窗口;
SCO必須按照這種方式搜索API實(shí)例,直到API實(shí)例被發(fā)現(xiàn),為了讓SCO能找到API實(shí)例,IEEE為API實(shí)例對(duì)象在DOM樹(shù)中定義了一個(gè)強(qiáng)制性名字:API_1484_11。
一旦SCO找到了API實(shí)例,則SCO就可以調(diào)用API方法,如Initialize(“”)和Terminate(“”)。
IEEE標(biāo)準(zhǔn)已經(jīng)提供了一個(gè)用ECMAScript搜索API實(shí)例的實(shí)現(xiàn),如下:
var nFindAPITries = 0; var API = null; var maxTries = 500; var APIVersion = "";
function ScanForAPI(win){ while ((win.API_1484_11 == null) && (win.parent != null) && (win.parent != win)) { nFindAPITries++; if (nFindAPITries > maxTries) { alert("Error in finding API instance -- too deeply nested."); return null; } win = win.parent; } return win.API_1484_11; }
function GetAPI() { if ((win.parent != null) && (win.parent != win)) { API = ScanForAPI(win.parent); } if ((API == null) && (win.opener != null)) { API = ScanForAPI(win.opener); if (API != null) { APIVersion = API.version; } } } |
SCORM運(yùn)行時(shí)環(huán)境數(shù)據(jù)模型
概述
定義運(yùn)行時(shí)數(shù)據(jù)模型的目的是為了在不同的LMS環(huán)境下,關(guān)于SCO的信息能被LMS所跟蹤和記錄。例如需要記錄學(xué)習(xí)者的學(xué)習(xí)成績(jī),SCO必須通過(guò)一個(gè)公共的方法來(lái)向LMS提供學(xué)習(xí)者的學(xué)習(xí)成績(jī),如果沒(méi)有這些公共的方法,LMS將不知道如果獲取、存儲(chǔ)和處理這些信息。
SCORM運(yùn)行時(shí)數(shù)據(jù)模型基于IEEE LTST Computer Managed Instruction(CMI)的P1484.11.1草案標(biāo)準(zhǔn)。P1484.11.1標(biāo)準(zhǔn)定義了一些數(shù)據(jù)模型元素的集合,這個(gè)集合能被用于內(nèi)容對(duì)象(如SCO)向LMS之間傳遞信息。集合可以包含有關(guān)學(xué)習(xí)者的信息、目標(biāo)信息、成功狀態(tài)以及完成狀態(tài)。
SCORM運(yùn)行時(shí)數(shù)據(jù)模型基于AICC CMI001,在SCORM版本1.2的時(shí)候,AICC完成了CMI001,并提交給了IEEE進(jìn)行標(biāo)準(zhǔn)化。 為了標(biāo)識(shí)數(shù)據(jù)模型,在SCORM運(yùn)行時(shí)環(huán)境中,所有的數(shù)據(jù)模型元素的名稱必須以”cmi”開(kāi)頭。它表示該數(shù)據(jù)模型元素是IEEE P1484.11.1數(shù)據(jù)模型定義的部分。因此你可以自己定義自己的數(shù)據(jù)模型的名稱。唯一有限制的是,LMS必須實(shí)現(xiàn)數(shù)據(jù)模型所定義的動(dòng)作。
所有的數(shù)據(jù)模型對(duì)于SCO來(lái)說(shuō)都是選擇使用的,SCO必須使用的API函數(shù)僅僅是Initialize(“”)和Terminate(“”)而已,而SetValue()以及GetValue()都不是必須使用的。
所有的數(shù)據(jù)模型元素都定義為ECMAScript的字符串類型,并使用的點(diǎn)符號(hào)(如cmi.success_status),
處理集合 有些數(shù)據(jù)模型元素表現(xiàn)為一個(gè)集合。在本文檔中數(shù)據(jù)集合稱為一條數(shù)據(jù)記錄,一條數(shù)據(jù)記錄應(yīng)該被存放于數(shù)組的一個(gè)位置中。通過(guò)數(shù)組的索引號(hào)可以訪問(wèn)該數(shù)據(jù)記錄,數(shù)組的索引號(hào)從0開(kāi)始。下列數(shù)據(jù)模型元素被定義為數(shù)據(jù)記錄的集合:
1. 來(lái)自學(xué)習(xí)者的注釋(cmi.comments_from_learner) 2. 來(lái)自LMS的注釋(cmi.comments_from_lms) 3. 目標(biāo)(cmi.objectives) 4. 交互(cmi.interactions)
在調(diào)用GetValue()請(qǐng)求時(shí),有兩種情況下會(huì)發(fā)生錯(cuò)誤:
1. 常規(guī)獲取失敗: 數(shù)據(jù)集合元素請(qǐng)求溢出。請(qǐng)求的數(shù)據(jù)記錄在數(shù)組指定的位置不存在。 2. 數(shù)據(jù)模型元素值沒(méi)有設(shè)置: 請(qǐng)求的數(shù)據(jù)記錄存在于數(shù)組指定的位置,但是該位置的值沒(méi)有被初始化。
在集合中的數(shù)據(jù)模型元素使用點(diǎn)-數(shù)字來(lái)表示(如n.):
cmi.objective.n.completion_status _count數(shù)據(jù)模型的關(guān)鍵字用來(lái)確定當(dāng)前集合中數(shù)據(jù)模型元素的數(shù)量。例如: var numOfObjectives = GetValue("cmi.objectives._count"); 所有的集合型數(shù)據(jù)模型元素(除了cmi.comments_from_lms,這個(gè)數(shù)據(jù)元素對(duì)于SCO來(lái)說(shuō)是只讀的)能夠有屬于自己的子元素。
數(shù)據(jù)模型元素關(guān)鍵字 有三個(gè)數(shù)據(jù)模型關(guān)鍵字:_version、_count和_children。這幾個(gè)關(guān)鍵字都是受LMS所管理,并且這些關(guān)鍵字反映的是其他數(shù)據(jù)模型元素的狀態(tài)。這些關(guān)鍵字必須是只讀的,如果SCO使用SetValue()來(lái)設(shè)置這些關(guān)鍵字,則LMS應(yīng)該設(shè)置錯(cuò)誤代碼”404”(表示數(shù)據(jù)模型是只讀的),并且返回”false”。_count和_children只能應(yīng)用于某一個(gè)數(shù)據(jù)模型元素上。
_version:_version數(shù)據(jù)模型關(guān)鍵字用在確定被LMS支持的數(shù)據(jù)模型的版本。該關(guān)鍵字不能用于任何數(shù)據(jù)模型元素上。 _count:_count數(shù)據(jù)模型關(guān)鍵字用于確定一個(gè)集合中當(dāng)前所有數(shù)據(jù)模型元素的總數(shù)量。該值可以用作確定集合中下一個(gè)存儲(chǔ)的位置。該關(guān)鍵字僅能用于集合類型的數(shù)據(jù)模型元素。 _children:_children數(shù)據(jù)模型關(guān)鍵字用戶確定一個(gè)父數(shù)據(jù)模型元素集合所擁有的所有的子數(shù)據(jù)模型元素。一個(gè)有效的_children請(qǐng)求應(yīng)該返回一個(gè)字符串,該字符串包含所有的數(shù)據(jù)模型元素,并且用一個(gè)通用的分隔符進(jìn)行分割。該關(guān)鍵字僅能用于含有子數(shù)據(jù)模型元素的數(shù)據(jù)模型元素。
保留分隔符
數(shù)據(jù)類型 每個(gè)數(shù)據(jù)模型元素必須關(guān)聯(lián)一個(gè)定義的數(shù)據(jù)類型 characterstring: 一個(gè)字符串,定義在ISO10646標(biāo)準(zhǔn)中,ISO10646標(biāo)準(zhǔn)與UNICODE標(biāo)準(zhǔn)兼容。 localized_string_type: 一個(gè)本地化的字符串,在字符串前包含使用語(yǔ)言的指示器,以確定該字符串使用什么語(yǔ)言導(dǎo)入。SCORM使用保留定界符來(lái)表示字符串的語(yǔ)言。 格式: “{lang=<language_type>}”<actual characterstring> 例如: “{lang=en}The content presented an excellent point dealing with the topic.” {lang=<language_type>}是可選的,默認(rèn)值是en(English)。 language_type: 描述語(yǔ)言類型的數(shù)據(jù)類型,語(yǔ)言代碼定義的格式: language_type ::= langcode [“-” subcode]* long_identifier_type: short_identifier_type: integer: state: real (10,7): time (second, 10, 2): timeinterval (second, 10,2):
擴(kuò)展SCORM運(yùn)行時(shí)數(shù)據(jù)模型 SCORM運(yùn)行時(shí)數(shù)據(jù)模型不應(yīng)該被擴(kuò)展,如果LMS收到一個(gè)帶有未定義數(shù)據(jù)模型元素未參數(shù)的API請(qǐng)求,LMS必須:
1. GetValue(Parameter):LMS必須空的字符串,并且設(shè)置錯(cuò)誤代碼”401”——未定義的數(shù)據(jù)模型元素; 2. SetValue(Parameter_1, Parameter_2):LMS必須返回”false”,并且設(shè)置錯(cuò)誤代碼”401”——未定義的數(shù)據(jù)模型元素; |