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