背景
發(fā)明領(lǐng)域
本文中描述的實(shí)施方案大體涉及控制基礎(chǔ)架構(gòu)的各種部件。
相關(guān)技術(shù)描述
當(dāng)前,存在統(tǒng)一并流線化工業(yè)控制和家庭自動(dòng)化領(lǐng)域的需要。雖然這兩個(gè)領(lǐng)域共有控制外部裝置的相同基本目標(biāo),但在可用于每一領(lǐng)域的現(xiàn)有解決方案中存在大量差異和復(fù)雜性。
舉例來(lái)說(shuō),在工業(yè)控制的領(lǐng)域中,系統(tǒng)一般通過(guò)系統(tǒng)集成公司針對(duì)每一特定客戶的復(fù)雜要求手工操作。即使當(dāng)此集成是基于廣泛可用的部件時(shí),那些部件的配置也在各集成之間有所不同,由此迫使工業(yè)自動(dòng)化系統(tǒng)的成本上升。這些成本包含初始研發(fā)成本以及用于維護(hù)和升級(jí)的成本。因此,工業(yè)控制的領(lǐng)域?qū)⑹芤嬗跇?gòu)建塊架構(gòu),所述構(gòu)建塊架構(gòu)能夠與幾乎任何裝置介接,但所述構(gòu)建塊架構(gòu)足夠簡(jiǎn)單以由不太熟練的用戶構(gòu)造和配置。工業(yè)控制的此去復(fù)雜化可消除對(duì)中間商(即,系統(tǒng)集成公司)的需要,并使客戶的研發(fā)和維護(hù)成本下降。
在家庭自動(dòng)化的領(lǐng)域中,價(jià)格約束必然比在工業(yè)控制的領(lǐng)域中更加嚴(yán)格。因此,普通客戶可嘗試僅相對(duì)較簡(jiǎn)單形式的控制和自動(dòng)化。不幸的是,當(dāng)前存在大量不相容且重疊的架構(gòu)可用于家庭自動(dòng)化的領(lǐng)域中。因此,家庭自動(dòng)化的領(lǐng)域?qū)⑹芤嬗诳商幚硭锌赡艿幕A(chǔ)的架構(gòu),并且所述架構(gòu)可快速地、便宜地并且連續(xù)地升級(jí)為新技術(shù)出現(xiàn)。
另外,當(dāng)前存在針對(duì)每一豎直定向的市場(chǎng)解決方案的各種各樣的豎井型傳輸協(xié)議。對(duì)于住宅應(yīng)用,存在x-10tm、zigbeetm、z-wavetm以及komextm。對(duì)于商業(yè)應(yīng)用,存在bacnettm和lonworkstm。對(duì)于照明應(yīng)用,存在dalitm。對(duì)于工業(yè)應(yīng)用,存在modbustm、profilebustm、devicenettm以及controlnettm。對(duì)于汽車應(yīng)用,存在can-bustm。對(duì)于計(jì)量應(yīng)用,存在m-bustm。
因此,所需要的是可使各種控制領(lǐng)域與平臺(tái)無(wú)關(guān)的、協(xié)議無(wú)關(guān)的、傳輸無(wú)關(guān)的可擴(kuò)展分布式構(gòu)建塊架構(gòu)統(tǒng)一的控制基礎(chǔ)架構(gòu)。
概述
因此,本發(fā)明公開(kāi)一種統(tǒng)一控制基礎(chǔ)架構(gòu)。
在實(shí)施方案中,本發(fā)明公開(kāi)一種系統(tǒng)。所述系統(tǒng)可包括腳本執(zhí)行模塊,所述腳本執(zhí)行模塊包括:編譯器,所述編譯器將用基礎(chǔ)腳本語(yǔ)言表示的腳本編譯成虛擬機(jī)程序,其中所述腳本包括引用裝置屬性的指令,虛擬機(jī),所述虛擬機(jī)執(zhí)行虛擬機(jī)程序,以及腳本管理器,所述腳本管理器將腳本存儲(chǔ)在腳本注冊(cè)表中,從所述腳本注冊(cè)表檢索腳本,并將腳本加載到編譯器中;以及一個(gè)或多個(gè)網(wǎng)關(guān),其中所述一個(gè)或多個(gè)網(wǎng)關(guān)中的每一個(gè)以通信方式連接到一個(gè)或多個(gè)物理裝置,并且其中所述一個(gè)或多個(gè)網(wǎng)關(guān)中的每一個(gè)包括:至少一個(gè)硬件處理器,一個(gè)或多個(gè)驅(qū)動(dòng)器,其中所述一個(gè)或多個(gè)驅(qū)動(dòng)器中的每一個(gè)使用通信協(xié)議來(lái)與一個(gè)或多個(gè)物理裝置中的至少一個(gè)通信,以讀取、寫入或讀取并寫入物理裝置的裝置屬性,以及裝置管理器,所述裝置管理器在通過(guò)至少一個(gè)硬件處理器執(zhí)行時(shí),根據(jù)映射,將在虛擬機(jī)程序中引用的裝置屬性映射到通過(guò)一個(gè)或多個(gè)驅(qū)動(dòng)器使用的裝置屬性。一個(gè)或多個(gè)網(wǎng)關(guān)可包括多個(gè)網(wǎng)關(guān)。一個(gè)或多個(gè)網(wǎng)關(guān)中的每一個(gè)可還包括腳本執(zhí)行模塊。對(duì)于一個(gè)或多個(gè)網(wǎng)關(guān)中的每一個(gè),腳本執(zhí)行模塊和裝置管理器可被網(wǎng)關(guān)的至少一個(gè)硬件處理器執(zhí)行為單一統(tǒng)一過(guò)程。對(duì)于一個(gè)或多個(gè)網(wǎng)關(guān)中的每一個(gè),一個(gè)或多個(gè)驅(qū)動(dòng)器中的每一個(gè)可通過(guò)網(wǎng)關(guān)的至少一個(gè)硬件處理器以與一個(gè)或多個(gè)驅(qū)動(dòng)器中的其它驅(qū)動(dòng)器和所述單一統(tǒng)一過(guò)程不同的過(guò)程執(zhí)行。一個(gè)或多個(gè)網(wǎng)關(guān)中的每一個(gè)可還包括通信層,并且對(duì)于一個(gè)或多個(gè)網(wǎng)關(guān)中的每一個(gè),腳本執(zhí)行模塊和裝置管理器可通過(guò)網(wǎng)關(guān)的至少一個(gè)硬件處理器執(zhí)行為單獨(dú)的過(guò)程,并且腳本執(zhí)行模塊的過(guò)程和裝置管理器的過(guò)程可經(jīng)由網(wǎng)關(guān)的通信層彼此通信。所述系統(tǒng)可還包括平臺(tái),所述平臺(tái)經(jīng)由至少一個(gè)網(wǎng)絡(luò)以通信方式連接到一個(gè)或多個(gè)網(wǎng)關(guān)中的每一個(gè)。所述平臺(tái)可包括至少一個(gè)硬件處理器和腳本執(zhí)行模塊,多個(gè)網(wǎng)關(guān)中的每一個(gè)可還包括通信層,腳本執(zhí)行模塊可通過(guò)平臺(tái)的至少一個(gè)硬件處理器執(zhí)行為第一過(guò)程,對(duì)于多個(gè)網(wǎng)關(guān)中的每一個(gè),裝置管理器可通過(guò)網(wǎng)關(guān)的至少一個(gè)硬件處理器執(zhí)行為第二過(guò)程,以及對(duì)于多個(gè)網(wǎng)關(guān)中的每一個(gè),第一過(guò)程可經(jīng)由至少一個(gè)網(wǎng)絡(luò)和網(wǎng)關(guān)上的通信層與網(wǎng)關(guān)上的第二過(guò)程通信。所述平臺(tái)可包括存儲(chǔ)器,所述存儲(chǔ)器存儲(chǔ)定義通過(guò)裝置管理器使用的映射的模式,并且一個(gè)或多個(gè)網(wǎng)關(guān)中的每一個(gè)在初始化后可經(jīng)由至少一個(gè)網(wǎng)絡(luò)從平臺(tái)下載所述模式。所述模式可使用適配器編程語(yǔ)言來(lái)定義映射,所述適配器編程語(yǔ)言是基礎(chǔ)腳本語(yǔ)言的子集。所述平臺(tái)可包括web應(yīng)用,所述web應(yīng)用在通過(guò)平臺(tái)的至少一個(gè)硬件處理器執(zhí)行時(shí),產(chǎn)生腳本圖形用戶界面(gui)以用于創(chuàng)建腳本。所述腳本gui可包括一個(gè)或多個(gè)輸入用于將每個(gè)表示基礎(chǔ)腳本語(yǔ)言的結(jié)構(gòu)的圖形元素鏈接到腳本的圖形表示中,并且平臺(tái)的至少一個(gè)硬件處理器可將腳本的圖形表示轉(zhuǎn)換成中間的基于文本的格式。腳本執(zhí)行模塊可還包括腳本轉(zhuǎn)換器,所述腳本轉(zhuǎn)換器將腳本的中間的基于文本的格式轉(zhuǎn)換成符合基礎(chǔ)腳本語(yǔ)言的腳本。以通信方式連接到一個(gè)或多個(gè)網(wǎng)關(guān)中的每一個(gè)的一個(gè)或多個(gè)物理裝置中的每一個(gè)的每一裝置屬性可與所述裝置屬性的值和狀態(tài)相關(guān)聯(lián),所述狀態(tài)指示權(quán)威機(jī)構(gòu)是否已確認(rèn)裝置屬性的值表示裝置屬性的實(shí)際值。權(quán)威機(jī)構(gòu)可為與具有裝置屬性的物理裝置通信的驅(qū)動(dòng)器?;A(chǔ)腳本語(yǔ)言可提供assign-and-wait-while-pending運(yùn)算符,所述運(yùn)算符在用于在被編譯成虛擬機(jī)程序并通過(guò)虛擬機(jī)執(zhí)行的腳本內(nèi)將值賦給裝置屬性的指令中時(shí),使得虛擬機(jī)將值賦給裝置屬性,并等待直到與裝置屬性相關(guān)聯(lián)的狀態(tài)指示權(quán)威機(jī)構(gòu)已確認(rèn)所賦的值表示裝置屬性的實(shí)際值,才繼續(xù)執(zhí)行虛擬機(jī)程序中的任何其它經(jīng)編譯指令。基礎(chǔ)腳本語(yǔ)言可提供trigger結(jié)構(gòu),所述trigger結(jié)構(gòu)包括觸發(fā)條件和主體,并且其中trigger結(jié)構(gòu)在用于被編譯成虛擬機(jī)程序并通過(guò)虛擬機(jī)執(zhí)行的腳本中時(shí),使得虛擬機(jī)每當(dāng)發(fā)生從不滿足觸發(fā)條件的第一狀態(tài)到滿足觸發(fā)條件的第二狀態(tài)的轉(zhuǎn)變時(shí)執(zhí)行對(duì)應(yīng)于主體的指令。trigger結(jié)構(gòu)可還包括滯后量,通過(guò)所述滯后量在從第一狀態(tài)到第二狀態(tài)的轉(zhuǎn)變發(fā)生之前必須滿足觸發(fā)條件?;A(chǔ)腳本語(yǔ)言可提供every結(jié)構(gòu),所述every結(jié)構(gòu)定義時(shí)間間隔并包括主體,其中every結(jié)構(gòu)在用于被編譯成虛擬機(jī)程序并通過(guò)虛擬機(jī)執(zhí)行的腳本中時(shí),使得虛擬機(jī)在連續(xù)多次經(jīng)過(guò)所定義的時(shí)間間隔中的每一次經(jīng)過(guò)之后執(zhí)行對(duì)應(yīng)于主體的指令?;A(chǔ)腳本語(yǔ)言可提供pause結(jié)構(gòu),所述pause結(jié)構(gòu)定義時(shí)間段,其中pause結(jié)構(gòu)在用于被編譯成虛擬機(jī)程序并通過(guò)虛擬機(jī)執(zhí)行的腳本中時(shí),使得虛擬機(jī)在繼續(xù)執(zhí)行虛擬機(jī)程序中的任何其它經(jīng)編譯指令之前在所定義的時(shí)間段的長(zhǎng)度上暫停?;A(chǔ)腳本語(yǔ)言可提供activation結(jié)構(gòu),所述activation結(jié)構(gòu)識(shí)別腳本,其中activation結(jié)構(gòu)在用于被編譯成父虛擬機(jī)程序并通過(guò)虛擬機(jī)執(zhí)行的父腳本中時(shí),使得虛擬機(jī)激活所識(shí)別的腳本以作為父腳本的子腳本。激活所識(shí)別的腳本以作為子腳本可包括執(zhí)行從子腳本編譯的子虛擬機(jī)程序?;A(chǔ)腳本語(yǔ)言可提供關(guān)鍵字,所述關(guān)鍵字在與activation結(jié)構(gòu)一起用于被編譯成父虛擬機(jī)程序并通過(guò)虛擬機(jī)執(zhí)行的父腳本中時(shí),使得虛擬機(jī)并行地執(zhí)行子虛擬機(jī)程序與父虛擬機(jī)程序。當(dāng)關(guān)鍵字不與activation結(jié)構(gòu)一起用于被編譯成父虛擬機(jī)程序并通過(guò)虛擬機(jī)執(zhí)行的父腳本中時(shí),虛擬機(jī)可在繼續(xù)執(zhí)行父虛擬機(jī)程序中的任何其它經(jīng)編譯指令之前執(zhí)行子虛擬機(jī)程序。虛擬機(jī)可并行地執(zhí)行多個(gè)虛擬機(jī)程序。一個(gè)或多個(gè)網(wǎng)關(guān)中的每一個(gè)可還包括腳本執(zhí)行模塊,其中,對(duì)于一個(gè)或多個(gè)網(wǎng)關(guān)中的每一個(gè),網(wǎng)關(guān)的腳本管理器使其腳本注冊(cè)表經(jīng)由至少一個(gè)網(wǎng)絡(luò)與鏡像腳本注冊(cè)表同步,所述鏡像腳本注冊(cè)表與網(wǎng)關(guān)相關(guān)聯(lián)并存儲(chǔ)在平臺(tái)上。對(duì)于一個(gè)或多個(gè)網(wǎng)關(guān)中的每一個(gè),即使當(dāng)網(wǎng)關(guān)不能夠經(jīng)由至少一個(gè)網(wǎng)絡(luò)與平臺(tái)通信時(shí),腳本管理器也可從腳本注冊(cè)表檢索腳本,編譯器可將檢索出的腳本編譯成虛擬機(jī)程序,且虛擬機(jī)可執(zhí)行虛擬機(jī)程序。一個(gè)或多個(gè)網(wǎng)關(guān)中的每一個(gè)可還包括腳本執(zhí)行模塊,其中平臺(tái)包括web應(yīng)用,所述web應(yīng)用在通過(guò)平臺(tái)的所述至少一個(gè)硬件處理器執(zhí)行時(shí),產(chǎn)生圖形用戶界面(gui)以用于選擇一個(gè)或多個(gè)腳本以發(fā)送到一個(gè)或多個(gè)網(wǎng)關(guān)的子集中的至少每一個(gè)的腳本注冊(cè)表并存儲(chǔ)在所述腳本注冊(cè)表中。gui可包括一個(gè)或多個(gè)輸入以用于將多個(gè)物理裝置分成裝置群組,所述裝置群組表示為虛擬裝置,其中基礎(chǔ)腳本語(yǔ)言將對(duì)虛擬裝置的引用視為與對(duì)物理裝置的引用相同。裝置群組可包括一個(gè)或多個(gè)虛擬裝置。當(dāng)對(duì)在虛擬機(jī)程序中引用并表示裝置群組的虛擬裝置的裝置屬性執(zhí)行映射時(shí),對(duì)于裝置群組中的每一物理裝置,裝置管理器可:當(dāng)物理裝置不具有對(duì)應(yīng)于虛擬裝置的裝置屬性的裝置屬性時(shí),不將虛擬裝置的裝置屬性映射到由一個(gè)或多個(gè)驅(qū)動(dòng)器使用的任何裝置屬性,以及當(dāng)物理裝置的確具有對(duì)應(yīng)于虛擬裝置的裝置屬性的裝置屬性時(shí),將虛擬裝置的裝置屬性映射到對(duì)應(yīng)的裝置屬性。裝置管理器可還包括:裝置管理器抽象層,所述裝置管理器抽象層根據(jù)第一映射將在虛擬機(jī)程序中引用的裝置屬性映射到邏輯裝置屬性;以及通用驅(qū)動(dòng)器抽象層,所述通用驅(qū)動(dòng)器抽象層根據(jù)第二映射將邏輯裝置屬性映射到由一個(gè)或多個(gè)物理裝置使用的物理裝置屬性。第一映射可使用基礎(chǔ)腳本語(yǔ)言的第一變化型式定義,并且第二映射可使用基礎(chǔ)腳本語(yǔ)言的與第一變化型式不同的第二變化型式定義。對(duì)于與一個(gè)或多個(gè)物理裝置中的至少一個(gè)通信的一個(gè)或多個(gè)驅(qū)動(dòng)器中的至少一個(gè),通用驅(qū)動(dòng)器抽象層可將至少一個(gè)物理裝置的裝置屬性的值存儲(chǔ)在一個(gè)或多個(gè)內(nèi)部注冊(cè)表中,并且通用驅(qū)動(dòng)器抽象層可通過(guò)以下操作來(lái)更新存儲(chǔ)在一個(gè)或多個(gè)內(nèi)部注冊(cè)表中的值:使用一個(gè)或多個(gè)回調(diào)函數(shù)來(lái)輪詢至少一個(gè)物理裝置,所述至少一個(gè)驅(qū)動(dòng)器已向通用驅(qū)動(dòng)器抽象層注冊(cè)所述回調(diào)函數(shù)。至少一個(gè)驅(qū)動(dòng)器可包括多個(gè)驅(qū)動(dòng)器。至少一個(gè)物理裝置可包括多個(gè)物理裝置。裝置管理器可包括用戶界面,其中用戶界面包括基于文本的控制臺(tái),所述控制臺(tái)經(jīng)配置以從用戶接收一個(gè)或多個(gè)基于文本的命令,并顯示基于文本的輸出以響應(yīng)于所述一個(gè)或多個(gè)命令??刂婆_(tái)可還經(jīng)配置以在第一上下文與第二上下文之間切換,所述第一上下文為用戶提供與裝置管理器的交互,所述第二上下文為用戶提供與一個(gè)或多個(gè)驅(qū)動(dòng)器中的至少一個(gè)的交互。
在實(shí)施方案中,本發(fā)明公開(kāi)一種方法。所述方法包括使用以通信方式連接到一個(gè)或多個(gè)物理裝置的網(wǎng)關(guān)裝置上的至少一個(gè)硬件處理器以:經(jīng)由至少一個(gè)網(wǎng)絡(luò)從平臺(tái)接收腳本;自動(dòng)地將接收到的腳本編譯成虛擬機(jī)程序;以及,響應(yīng)于針對(duì)所述腳本的激活命令,將虛擬機(jī)程序加載到虛擬機(jī)中,通過(guò)虛擬機(jī)執(zhí)行虛擬機(jī)程序,其中虛擬機(jī)程序的執(zhí)行包括對(duì)裝置屬性的一個(gè)或多個(gè)引用,響應(yīng)于在虛擬機(jī)程序的執(zhí)行期間對(duì)裝置屬性的引用中的一個(gè)或多個(gè),自動(dòng)地將在虛擬機(jī)程序的執(zhí)行期間引用的至少一個(gè)裝置屬性映射到存儲(chǔ)在網(wǎng)關(guān)裝置上的由至少一個(gè)驅(qū)動(dòng)器使用的裝置屬性,以及,通過(guò)至少一個(gè)驅(qū)動(dòng)器,使用通信協(xié)議來(lái)與一個(gè)或多個(gè)物理裝置中的至少一個(gè)通信,以讀取、寫入或讀取并寫入至少一個(gè)物理裝置的對(duì)應(yīng)于由至少一個(gè)驅(qū)動(dòng)器使用的裝置屬性的實(shí)際屬性。
在實(shí)施方案中,本發(fā)明公開(kāi)一種非暫時(shí)性計(jì)算機(jī)可讀介質(zhì)。所述介質(zhì)具有存儲(chǔ)在其上的指令,所述指令在通過(guò)處理器執(zhí)行時(shí)使得處理器:經(jīng)由至少一個(gè)網(wǎng)絡(luò)從平臺(tái)接收腳本;自動(dòng)地將接收到的腳本編譯成虛擬機(jī)程序;以及,響應(yīng)于針對(duì)所述腳本的激活命令,將虛擬機(jī)程序加載到虛擬機(jī)中,通過(guò)虛擬機(jī)執(zhí)行虛擬機(jī)程序,其中虛擬機(jī)程序的執(zhí)行包括對(duì)裝置屬性的一個(gè)或多個(gè)引用,響應(yīng)于在虛擬機(jī)程序的執(zhí)行期間對(duì)裝置屬性的引用中的一個(gè)或多個(gè),自動(dòng)地將在虛擬機(jī)程序的執(zhí)行期間引用的至少一個(gè)裝置屬性映射到存儲(chǔ)在網(wǎng)關(guān)裝置上的由至少一個(gè)驅(qū)動(dòng)器使用的裝置屬性,以及,通過(guò)至少一個(gè)驅(qū)動(dòng)器,使用通信協(xié)議來(lái)與一個(gè)或多個(gè)物理裝置中的至少一個(gè)通信,以讀取、寫入或讀取并寫入至少一個(gè)物理裝置的對(duì)應(yīng)于由至少一個(gè)驅(qū)動(dòng)器使用的裝置屬性的實(shí)際屬性。
在實(shí)施方案中,本發(fā)明公開(kāi)一種方法。所述方法包括使用至少一個(gè)硬件處理器以:提供腳本圖形用戶界面(gui),其中所述腳本gui包括一個(gè)或多個(gè)輸入以用于圖形地組合多個(gè)可視化腳本部件,其中多個(gè)可視化腳本部件中的每一個(gè)對(duì)應(yīng)于基礎(chǔ)腳本語(yǔ)言的結(jié)構(gòu);經(jīng)由腳本gui接收多個(gè)可視化腳本部件的圖形組合;以及將接收到的多個(gè)可視化腳本部件的圖形組合轉(zhuǎn)換成以基礎(chǔ)腳本語(yǔ)言寫入的腳本。所述方法可還包括使用至少一個(gè)硬件處理器以將以基礎(chǔ)腳本語(yǔ)言寫入的腳本編譯成虛擬機(jī)程序以通過(guò)虛擬機(jī)執(zhí)行。接收到的多個(gè)可視化腳本部件的圖形組合中的可視化腳本部件中的一個(gè)或多個(gè)可對(duì)應(yīng)于基礎(chǔ)腳本語(yǔ)言的trigger結(jié)構(gòu),對(duì)應(yīng)于trigger結(jié)構(gòu)的一個(gè)或多個(gè)可視化腳本部件可包括觸發(fā)條件和主體的可視化表示,并且trigger結(jié)構(gòu)在于腳本內(nèi)執(zhí)行時(shí),可使得每當(dāng)發(fā)生從不滿足觸發(fā)條件的第一狀態(tài)到滿足觸發(fā)條件的第二狀態(tài)的轉(zhuǎn)變時(shí)執(zhí)行表示主體的指令。對(duì)于將通過(guò)腳本控制的裝置,多個(gè)可視化腳本部件可包括裝置識(shí)別符的表示和裝置屬性的表示。所述方法可還包括使用至少一個(gè)硬件處理器以:填充可選裝置識(shí)別符的列表;當(dāng)用戶選定裝置識(shí)別符的表示時(shí),在腳本gui中提供經(jīng)填充的可選裝置識(shí)別符的列表;從經(jīng)填充的可選裝置識(shí)別符的列表接收對(duì)可選裝置識(shí)別符中的一個(gè)的選擇;以及更新裝置識(shí)別符的表示以反映可選裝置識(shí)別符中的選定裝置識(shí)別符。所述方法可還包括使用至少一個(gè)硬件處理器以:填充與可選裝置識(shí)別符中的選定裝置識(shí)別符相關(guān)聯(lián)的可選裝置屬性的列表;當(dāng)用戶選定裝置屬性的表示時(shí),在腳本gui中提供經(jīng)填充的可選裝置屬性的列表;從經(jīng)填充的可選裝置屬性的列表接收對(duì)可選裝置屬性中的一個(gè)的選擇;以及更新裝置屬性的表示以反映可選裝置屬性中的選定裝置屬性。
在實(shí)施方案中,本發(fā)明公開(kāi)一種方法。所述方法包括使用至少一個(gè)硬件處理器通過(guò)以下操作將腳本編譯成虛擬機(jī)程序:每當(dāng)在腳本中檢測(cè)到使用assign-and-wait-while-pending運(yùn)算符來(lái)將值賦給裝置的裝置屬性的assignment結(jié)構(gòu)時(shí),將assignment結(jié)構(gòu)編譯成一個(gè)或多個(gè)指令,所述指令將值賦給裝置屬性,并等待直到與裝置屬性相關(guān)聯(lián)的狀態(tài)指示與裝置通信的驅(qū)動(dòng)器已確認(rèn)所賦的值表示裝置屬性的實(shí)際值,才繼續(xù)執(zhí)行從腳本編譯的任何其它指令;每當(dāng)在腳本中檢測(cè)到trigger結(jié)構(gòu)時(shí),將trigger結(jié)構(gòu)編譯成一個(gè)或多個(gè)指令,所述指令每當(dāng)發(fā)生從不滿足trigger結(jié)構(gòu)的條件的第一狀態(tài)到滿足trigger結(jié)構(gòu)的條件的第二狀態(tài)的轉(zhuǎn)變時(shí)執(zhí)行trigger結(jié)構(gòu)的主體;每當(dāng)在腳本中檢測(cè)到every結(jié)構(gòu)時(shí),將every結(jié)構(gòu)編譯成一個(gè)或多個(gè)指令,所述指令在連續(xù)多次經(jīng)過(guò)在every結(jié)構(gòu)中定義的時(shí)間間隔中的每一次經(jīng)過(guò)之后執(zhí)行every結(jié)構(gòu)的主體;每當(dāng)在腳本中檢測(cè)到pause結(jié)構(gòu)時(shí),將pause結(jié)構(gòu)編譯成一個(gè)或多個(gè)指令,所述指令在繼續(xù)執(zhí)行從腳本編譯的任何其它指令之前在pause結(jié)構(gòu)中定義的時(shí)間段的長(zhǎng)度上暫停;以及,每當(dāng)在腳本中檢測(cè)到activation結(jié)構(gòu)時(shí),將activation結(jié)構(gòu)編譯成一個(gè)或多個(gè)指令,所述指令激活在activation結(jié)構(gòu)中所識(shí)別的腳本以作為被編譯的腳本的子腳本。當(dāng)在腳本中檢測(cè)到具有預(yù)定關(guān)鍵字的activation結(jié)構(gòu)時(shí),從activation結(jié)構(gòu)編譯的一個(gè)或多個(gè)指令可激活子腳本以與被編譯的腳本并行地執(zhí)行,并且,當(dāng)在腳本中檢測(cè)到?jīng)]有預(yù)定關(guān)鍵字的activation結(jié)構(gòu)時(shí),從activation結(jié)構(gòu)編譯的一個(gè)或多個(gè)指令可激活子腳本以在繼續(xù)執(zhí)行從被編譯的腳本編譯的任何其它指令之前執(zhí)行至完成。
在實(shí)施方案中,本發(fā)明公開(kāi)一種方法。所述方法包括使用網(wǎng)關(guān)裝置上的至少一個(gè)硬件處理器以:存儲(chǔ)多個(gè)裝置屬性,其中所述多個(gè)裝置屬性中的每一個(gè)表示經(jīng)由至少一個(gè)驅(qū)動(dòng)器以通信方式連接到網(wǎng)關(guān)裝置的至少一個(gè)物理裝置的物理裝置屬性,所述驅(qū)動(dòng)器與至少一個(gè)物理裝置通信,其中多個(gè)裝置屬性中的每一個(gè)包括識(shí)別符、值以及確認(rèn)的、未決的或未知的狀態(tài);執(zhí)行控制腳本;以及每當(dāng)控制腳本的執(zhí)行使得多個(gè)裝置屬性中的一個(gè)的值改變時(shí),將被改變的一個(gè)裝置屬性的狀態(tài)設(shè)定為未決的,直到與物理裝置屬性通過(guò)一個(gè)裝置屬性表示的至少一個(gè)物理裝置通信的驅(qū)動(dòng)器確認(rèn)一個(gè)裝置屬性的值與通過(guò)一個(gè)裝置屬性表示的物理裝置屬性的實(shí)際值相匹配,以及,一旦與物理裝置屬性通過(guò)一個(gè)裝置屬性表示的物理裝置通信的驅(qū)動(dòng)器確認(rèn)一個(gè)裝置屬性的值與通過(guò)一個(gè)裝置屬性表示的物理裝置屬性的實(shí)際值相匹配,就將所述一個(gè)裝置屬性的狀態(tài)設(shè)定為確認(rèn)的。執(zhí)行控制腳本可包括:實(shí)例化解析器以用于解析基礎(chǔ)腳本語(yǔ)言;以及,通過(guò)經(jīng)實(shí)例化的解析器,解析具有控制腳本的指令,并在控制腳本被解析時(shí)執(zhí)行那些指令。執(zhí)行控制腳本可包括:將控制腳本編譯成虛擬機(jī)程序;以及通過(guò)網(wǎng)關(guān)裝置上的虛擬機(jī),執(zhí)行虛擬機(jī)程序。
應(yīng)理解,本文中公開(kāi)的方法的實(shí)施方案中的任一個(gè)還可實(shí)施為包括至少一個(gè)硬件處理器的系統(tǒng),所述硬件處理器經(jīng)配置以執(zhí)行存儲(chǔ)在非暫時(shí)性計(jì)算機(jī)可讀介質(zhì)上的方法和/或指令,其使得處理器執(zhí)行所述方法。
附圖簡(jiǎn)述
本發(fā)明的關(guān)于其結(jié)構(gòu)和操作兩者的細(xì)節(jié)可部分通過(guò)研究附圖來(lái)收集,其中相同的參考標(biāo)號(hào)指代相同的部分,并且其中:
圖1說(shuō)明根據(jù)實(shí)施方案的控制基礎(chǔ)架構(gòu);
圖2說(shuō)明根據(jù)實(shí)施方案的腳本執(zhí)行環(huán)境;
圖3說(shuō)明根據(jù)實(shí)施方案的在基于云的平臺(tái)與網(wǎng)關(guān)之間的實(shí)例關(guān)系;
圖4a至圖4e說(shuō)明根據(jù)實(shí)施方案的用于創(chuàng)建腳本的用戶界面;
圖5a至圖5h說(shuō)明根據(jù)實(shí)施方案的用于網(wǎng)關(guān)管理的用戶界面;
圖6a至圖6i說(shuō)明根據(jù)實(shí)施方案的用于創(chuàng)建腳本的用戶界面;
圖7說(shuō)明根據(jù)實(shí)施方案的實(shí)例統(tǒng)一線程模型;
圖8a和圖8b說(shuō)明根據(jù)實(shí)施方案的控制基礎(chǔ)架構(gòu)的變化型式;
圖9說(shuō)明根據(jù)實(shí)施方案的通用驅(qū)動(dòng)器抽象;以及
圖10說(shuō)明根據(jù)實(shí)施方案的處理系統(tǒng),本文中描述的過(guò)程中的一個(gè)或多個(gè)可在所述處理系統(tǒng)上執(zhí)行。
詳述
在實(shí)施方案中,公開(kāi)包含腳本語(yǔ)言的控制基礎(chǔ)架構(gòu)??刂苹A(chǔ)架構(gòu)可包括統(tǒng)一各種領(lǐng)域的數(shù)據(jù)架構(gòu)??刂苹A(chǔ)架構(gòu)還可包括一個(gè)或多個(gè)網(wǎng)關(guān),所述網(wǎng)關(guān)能夠與一個(gè)或多個(gè)插件式硬件模塊介接,所述硬件模塊包括物理硬件裝置或與物理硬件裝置介接。每一網(wǎng)關(guān)可能能夠使用任何給定傳輸來(lái)連接到硬件模塊并與基于云的平臺(tái)通信,并且可通過(guò)因特網(wǎng)協(xié)議(ip)尋址。另外,每一網(wǎng)關(guān)可包括裝置管理器,所述裝置管理器抽象在數(shù)據(jù)架構(gòu)內(nèi)的數(shù)據(jù)的標(biāo)準(zhǔn)化表示與數(shù)據(jù)的多個(gè)裝置特定的表示之間轉(zhuǎn)換所必需的邏輯。
控制基礎(chǔ)架構(gòu)的腳本語(yǔ)言可為統(tǒng)一并滿足所有應(yīng)用的需要的裝置控制語(yǔ)言?;A(chǔ)腳本語(yǔ)言可以簡(jiǎn)化形式與用戶界面(基于圖形或文本的)配對(duì)以用于創(chuàng)建并編輯腳本。舉例來(lái)說(shuō),可提供圖形用戶界面(gui)以允許用戶使用基礎(chǔ)腳本語(yǔ)言的子集來(lái)創(chuàng)建腳本。
雖然在本文中將使用某些函數(shù)名稱、過(guò)程名稱、命令名稱、關(guān)鍵字等,但應(yīng)理解,特定名稱和關(guān)鍵字的選擇是任意的,且因此,在不脫離本發(fā)明申請(qǐng)的范圍的情況下,此類名稱和關(guān)鍵字可用其它名稱或關(guān)鍵字替換。
在閱讀此描述之后,所屬領(lǐng)域的技術(shù)人員應(yīng)變得清楚如何針對(duì)各種替代應(yīng)用實(shí)施各種替代實(shí)施方案。因此,即使本文中將描述某些實(shí)施方案,也應(yīng)理解,這些實(shí)施方案僅作為實(shí)例和說(shuō)明而非作為限制呈現(xiàn)。由此,各種實(shí)施方案的此詳細(xì)描述不應(yīng)被理解為限制如隨附權(quán)利要求書中所闡述的本發(fā)明申請(qǐng)的范圍或?qū)挾取?/p>
1.平臺(tái)
圖1說(shuō)明根據(jù)實(shí)施方案的基礎(chǔ)架構(gòu),本文中描述的系統(tǒng)和過(guò)程可在所述基礎(chǔ)架構(gòu)中操作。基礎(chǔ)架構(gòu)包括平臺(tái)110,所述平臺(tái)包括數(shù)據(jù)庫(kù)112或與所述數(shù)據(jù)庫(kù)介接,并提供界面114(例如,web應(yīng)用和/或web服務(wù)器)。如所說(shuō)明,平臺(tái)110和數(shù)據(jù)庫(kù)112可在“云”中實(shí)施。云計(jì)算是基于因特網(wǎng)的計(jì)算的形式,其中共享資源和信息按需要提供給裝置。然而,應(yīng)理解,替代地,平臺(tái)110和數(shù)據(jù)庫(kù)112可實(shí)施為一個(gè)或多個(gè)專用服務(wù)器。
在實(shí)施方案中,界面114包括提供圖形用戶界面(gui)的web應(yīng)用。gui可包括用超文本標(biāo)記語(yǔ)言(html)或其它語(yǔ)言生成的一個(gè)或多個(gè)網(wǎng)頁(yè)。平臺(tái)110發(fā)送或提供gui以響應(yīng)于來(lái)自用戶系統(tǒng)(未示出)的請(qǐng)求。在一些應(yīng)用中,gui可以向?qū)У男问教峁?,在此情況下,可以連續(xù)方式提供兩個(gè)或更多個(gè)用戶界面(例如,網(wǎng)頁(yè)),且所述連續(xù)的用戶界面中的一個(gè)或多個(gè)可取決于用戶或用戶系統(tǒng)與一個(gè)或多個(gè)先前用戶界面的交互。在實(shí)施方案中,gui可包括腳本gui,所述腳本gui使得用戶能夠通過(guò)將基本腳本語(yǔ)言的元素的可視化表示連貫在一起來(lái)圖形地構(gòu)造腳本。gui可包括內(nèi)容和元素的組合,例如文本、圖像、視頻、動(dòng)畫、引用(例如,超鏈接)、幀、輸入(例如,文本框、文本區(qū)、復(fù)選框、單選按鈕、下拉式菜單、按鈕、表單等)、腳本(例如,javascript)及類似者,包含包括存儲(chǔ)在數(shù)據(jù)庫(kù)112中的數(shù)據(jù)或從所述數(shù)據(jù)得到的元素,所述數(shù)據(jù)庫(kù)可為本地的和/或可供平臺(tái)110遠(yuǎn)程地訪問(wèn)。平臺(tái)110還可對(duì)來(lái)自用戶系統(tǒng)的其它請(qǐng)求作出響應(yīng)。
替代地或除web應(yīng)用外,界面114還可包括web服務(wù)。在此情況下,平臺(tái)110可從用戶系統(tǒng)接收請(qǐng)求,并以可擴(kuò)展標(biāo)記語(yǔ)言(xml)和/或任何其它合適的或期望的格式提供響應(yīng)。在此類實(shí)施方案中,平臺(tái)110可提供應(yīng)用程序設(shè)計(jì)接口(api),所述應(yīng)用程序設(shè)計(jì)接口定義用戶系統(tǒng)可與web服務(wù)交互的方式。因此,自身可為服務(wù)器的用戶系統(tǒng)可定義其自身的用戶界面,并依賴于web服務(wù)來(lái)實(shí)施或以其它方式提供本文中描述的后端過(guò)程、方法、功能性、存儲(chǔ)裝置等。
應(yīng)理解,對(duì)平臺(tái)110的任何請(qǐng)求和來(lái)自平臺(tái)110的響應(yīng)(包含gui)可都通過(guò)網(wǎng)絡(luò)來(lái)傳送,所述網(wǎng)絡(luò)可包含使用標(biāo)準(zhǔn)通信協(xié)議(例如,http、https)的因特網(wǎng)。
2.網(wǎng)關(guān)
在實(shí)施方案中,基礎(chǔ)架構(gòu)包括一個(gè)或多個(gè)網(wǎng)關(guān)120。每一網(wǎng)關(guān)120可從通過(guò)california的sandiego的systechcorporation提供的模塊化網(wǎng)關(guān)族選擇。通過(guò)systechcorporation提供的
每一網(wǎng)關(guān)120可經(jīng)配置以經(jīng)由寬范圍傳輸協(xié)議(例如因特網(wǎng))而與平臺(tái)110通信。雖然網(wǎng)關(guān)120將被主要描述為經(jīng)由因特網(wǎng)與平臺(tái)110通信,但應(yīng)理解,網(wǎng)關(guān)120可經(jīng)配置以使用任何常規(guī)的通信協(xié)議來(lái)與平臺(tái)110通信。
在實(shí)施方案中,網(wǎng)關(guān)120還能夠經(jīng)由一個(gè)或多個(gè)局域傳輸協(xié)議與一個(gè)或多個(gè)硬件裝置控制器170通信,所述局域傳輸協(xié)議例如thingworxtm、z-wavetm、zigbeetm、bluetoothtm、wi-fitm和/或類似者。此經(jīng)由多個(gè)協(xié)議進(jìn)行通信的能力允許網(wǎng)關(guān)120為傳輸不可知且協(xié)議不可知的,并允許所述網(wǎng)關(guān)經(jīng)由寬范圍的復(fù)雜性處理控制系統(tǒng)。
可用于網(wǎng)關(guān)的任何特定配置的特定選項(xiàng)可通過(guò)硬件功能的物理存在控制,和/或通過(guò)與硬件功能的物理存在無(wú)關(guān)的電子配置在本地或遠(yuǎn)程地控制??捎米骶W(wǎng)關(guān)120中的一個(gè)或多個(gè)的
●一個(gè)或多個(gè)硬件升級(jí)槽,所述硬件升級(jí)槽支持蜂窩模塊和/或其它硬件選項(xiàng),包含未來(lái)的硬件選項(xiàng);
●架構(gòu),所述架構(gòu)支持2g、3g以及4g蜂窩技術(shù)(例如,碼分多址(cdma)、演進(jìn)數(shù)據(jù)優(yōu)化(evdo)、長(zhǎng)期演進(jìn)(lte)、全球移動(dòng)通信系統(tǒng)(gsm)、單載波無(wú)線電傳輸技術(shù)(1xrtt)、高速分組接入(spa+)),以及未來(lái)蜂窩技術(shù);
●一個(gè)或多個(gè)多以太網(wǎng)端口,包含具有多個(gè)獨(dú)立的因特網(wǎng)協(xié)議(ip)地址的多個(gè)以太網(wǎng)端口;
●一個(gè)或多個(gè)普通老式電話服務(wù)(pots)端口(例如,v.90、v.92);
●一個(gè)或多個(gè)串行端口(例如,具有rs232、rs422和/或rs485物理接口),所述串行端口可被配置為標(biāo)準(zhǔn)串行端口(例如,用于pos和/或安全性應(yīng)用)和/或dex和mdb端口(例如,用于售貨應(yīng)用);
●一個(gè)或多個(gè)通用串行總線(usb)端口;
●一個(gè)或多個(gè)microsd槽;
●對(duì)一個(gè)或多個(gè)本地?zé)o線技術(shù)的支持,所述本地?zé)o線技術(shù)包含wi-fitm(例如802.11a/b/g/n)、zigbeetm、z-wavetm、bluetoothtm、近場(chǎng)通信(nfc)、ant等;
●一個(gè)或多個(gè)傳感器(例如,溫度傳感器、運(yùn)動(dòng)傳感器等);
●一個(gè)或多個(gè)連接器,所述連接器用于外部通用輸入/輸出(gpio),例如,使用gpio和/或usb接口;
●一個(gè)或多個(gè)內(nèi)部或外部電池;和/或
●對(duì)本地應(yīng)用的支持。
3.數(shù)據(jù)架構(gòu)
在實(shí)施方案中,通過(guò)平臺(tái)110和網(wǎng)關(guān)120用于數(shù)據(jù)的通信、處理以及存儲(chǔ)(例如,在數(shù)據(jù)庫(kù)112和/或132中)的數(shù)據(jù)架構(gòu)使得廣泛分布的部件通過(guò)標(biāo)準(zhǔn)因特網(wǎng)協(xié)議層連接,使得數(shù)據(jù)值(例如,所述數(shù)據(jù)值可表示硬件測(cè)量或設(shè)置,在基于web的用戶界面中做出的選擇等)的變化可以可靠地傳播遍及基礎(chǔ)架構(gòu)的部件(例如,平臺(tái)110和/或網(wǎng)關(guān)120)。
在實(shí)施方案中,數(shù)據(jù)架構(gòu)通過(guò)在平臺(tái)110上且在網(wǎng)關(guān)120的控制器130內(nèi)運(yùn)行的軟件實(shí)施,以在平臺(tái)110與網(wǎng)關(guān)120之間提供數(shù)據(jù)傳播。在實(shí)施方案中,數(shù)據(jù)架構(gòu)利用基于javascript對(duì)象符號(hào)(json)標(biāo)準(zhǔn)的數(shù)據(jù)格式。然而,應(yīng)理解,不同的數(shù)據(jù)標(biāo)準(zhǔn)可用作本文中論述的數(shù)據(jù)格式的基礎(chǔ)。
在實(shí)施方案中,數(shù)據(jù)架構(gòu)實(shí)施分布式數(shù)據(jù)服務(wù)器聯(lián)合,所述數(shù)據(jù)服務(wù)器聯(lián)合允許在本地網(wǎng)關(guān)120與平臺(tái)110上的基于云的管理服務(wù)之間的數(shù)據(jù)協(xié)調(diào)以用于本地網(wǎng)關(guān)120的集中控制和配置,同時(shí)允許本地網(wǎng)關(guān)120和平臺(tái)110在分布式部件之間的通信被中斷時(shí)彼此獨(dú)立地操作。另外,數(shù)據(jù)架構(gòu)可改進(jìn)用于表示通過(guò)跨越分布式系統(tǒng)的通信的時(shí)延產(chǎn)生的過(guò)渡數(shù)據(jù)狀態(tài)的常規(guī)方法。數(shù)據(jù)架構(gòu)可允許平臺(tái)110和網(wǎng)關(guān)120在這些分布式部件之間的通信被中斷時(shí)獨(dú)立地操作。
在實(shí)施方案中,數(shù)據(jù)架構(gòu)支持以下各項(xiàng)中的一個(gè)或多個(gè):
●可擴(kuò)展聯(lián)合多服務(wù)器聯(lián)網(wǎng)環(huán)境;
●用于數(shù)據(jù)完整性的狀態(tài)屬性的同步;
●針對(duì)每一屬性的中心同步權(quán)威機(jī)構(gòu)(例如,平臺(tái)110),任何數(shù)目的客戶端服務(wù)可訂閱所述屬性;
●離線工作和隨后的重新同步;和/或
●用于部件和/或第三方應(yīng)用的api。
從根本上說(shuō),數(shù)據(jù)架構(gòu)可表示數(shù)據(jù)永久策略和通信協(xié)議,所述協(xié)議允許web應(yīng)用、腳本語(yǔ)言、硬件接口以及第三方應(yīng)用通過(guò)共同的抽象和查詢語(yǔ)言(例如,經(jīng)由api)與共享數(shù)據(jù)交互。數(shù)據(jù)架構(gòu)可適用于在較小硬件裝置(例如,網(wǎng)關(guān)120)以及較大因特網(wǎng)服務(wù)器(例如,門戶網(wǎng)站)上實(shí)施。數(shù)據(jù)架構(gòu)協(xié)議可為傳輸不可知的,并經(jīng)由公共的因特網(wǎng)通信傳輸(例如,http、websocket、傳輸控制協(xié)議(tcp)等)工作。
如上文所提及,在實(shí)施方案中,數(shù)據(jù)架構(gòu)的數(shù)據(jù)格式為json。然而,應(yīng)理解,可使用除json外的格式,而不改變數(shù)據(jù)架構(gòu)的本質(zhì)特性。例如,此json數(shù)據(jù)可通過(guò)部件轉(zhuǎn)換成在所述部件內(nèi)部的格式。例如,通過(guò)每一網(wǎng)關(guān)120的裝置管理器160接收的json數(shù)據(jù)可被轉(zhuǎn)換成裝置管理器160的內(nèi)部格式。另外,平臺(tái)110的每一實(shí)例可以適合于所述實(shí)例的操作環(huán)境的任何方式保留所述實(shí)例的本地?cái)?shù)據(jù)。
圖3說(shuō)明根據(jù)實(shí)施方案的在基于云的平臺(tái)110與網(wǎng)關(guān)120之間的實(shí)例關(guān)系。平臺(tái)110可包括一個(gè)或多個(gè)數(shù)據(jù)服務(wù)器310,所述數(shù)據(jù)服務(wù)器使數(shù)據(jù)與多個(gè)網(wǎng)關(guān)120的多個(gè)網(wǎng)關(guān)服務(wù)器330(例如,在控制器130中運(yùn)行)或其它客戶端同步??蛻舳耸鞘褂糜蓴?shù)據(jù)服務(wù)器310提供的api來(lái)連接到數(shù)據(jù)服務(wù)器310的任何軟件模塊。數(shù)據(jù)服務(wù)器310中的每一個(gè)可向彼此并向外部或內(nèi)部客戶端呈現(xiàn)剛好相同的api。(例如,界面114的)門戶網(wǎng)站314和外部應(yīng)用320(例如,thingworxtm)可使用此api來(lái)提供用戶界面以用于經(jīng)由數(shù)據(jù)服務(wù)器310控制并配置網(wǎng)關(guān)120。在實(shí)施方案中,網(wǎng)關(guān)120和任何其它客戶端可經(jīng)由node.js、http、socket.io或tcp介接到數(shù)據(jù)服務(wù)器310。
在實(shí)施方案中,每一網(wǎng)關(guān)服務(wù)器330是數(shù)據(jù)服務(wù)器310的輕量級(jí)實(shí)施。例如,網(wǎng)關(guān)服務(wù)器330可經(jīng)精簡(jiǎn)以在較小的linux環(huán)境中運(yùn)行,所述linux環(huán)境執(zhí)行為網(wǎng)關(guān)120的控制器130中的操作系統(tǒng)。網(wǎng)關(guān)120上的內(nèi)部服務(wù),例如網(wǎng)關(guān)服務(wù)340、腳本管理器210以及裝置管理器160,可經(jīng)由node.js、socket.io或本地主機(jī)tcp直接地連接到所述內(nèi)部服務(wù)的本地網(wǎng)關(guān)服務(wù)器330。
在實(shí)施方案中,數(shù)據(jù)服務(wù)器310可為或包括一個(gè)或多個(gè)云服務(wù)器。云服務(wù)器提供相同的連接協(xié)議和api,但為更加可擴(kuò)展的且可經(jīng)由唯一網(wǎng)關(guān)識(shí)別符來(lái)尋址,正如網(wǎng)關(guān)服務(wù)器330一樣。每一云服務(wù)器可類似于網(wǎng)關(guān)服務(wù)器330,除了以下情況:因?yàn)樵品?wù)器可充當(dāng)網(wǎng)關(guān)服務(wù)器330的群組的通信集線器,所以在云服務(wù)器連接到網(wǎng)關(guān)服務(wù)器330時(shí),云服務(wù)器內(nèi)的某些內(nèi)部行為可為不同的。在實(shí)施方案中,每一網(wǎng)關(guān)服務(wù)器330是一個(gè)云服務(wù)器的客戶端,而一個(gè)云服務(wù)器可具有多個(gè)客戶端(但云服務(wù)器未必具有任何客戶端)。另外,一個(gè)云服務(wù)器可為另一云服務(wù)器的客戶端。
網(wǎng)關(guān)服務(wù)340、腳本管理器210以及裝置管理器160是在實(shí)施方案中在每一網(wǎng)關(guān)120內(nèi)部的過(guò)程,并且可使用數(shù)據(jù)服務(wù)器310的api來(lái)集成裝置控制與數(shù)據(jù)架構(gòu),如本文中的其它地方所描述。
3.1.離線操作
在實(shí)施方案中,平臺(tái)110使得用戶能夠作用于每一網(wǎng)關(guān)120的腳本和裝置數(shù)據(jù),即使是當(dāng)網(wǎng)關(guān)120不連接到平臺(tái)110(例如,由在網(wǎng)關(guān)120處的網(wǎng)絡(luò)故障、機(jī)械故障等導(dǎo)致)時(shí)。這可通過(guò)將每一網(wǎng)關(guān)120的相關(guān)數(shù)據(jù)(例如,在每一網(wǎng)關(guān)上執(zhí)行的腳本和驅(qū)動(dòng)器)的鏡像維持在平臺(tái)110處實(shí)現(xiàn)。當(dāng)在平臺(tái)110與網(wǎng)關(guān)120之間建立連接時(shí),此鏡像數(shù)據(jù)與在網(wǎng)關(guān)120處的數(shù)據(jù)同步。
在實(shí)施方案中,每一網(wǎng)關(guān)120獨(dú)立地操作,即使是當(dāng)所述網(wǎng)關(guān)已從平臺(tái)110斷開(kāi)(例如,由網(wǎng)絡(luò)故障導(dǎo)致)時(shí)。這可通過(guò)將網(wǎng)關(guān)120的操作所需的所有數(shù)據(jù)維持在網(wǎng)關(guān)上的鏡像本地庫(kù)(例如,數(shù)據(jù)庫(kù)132和/或腳本注冊(cè)表214)中實(shí)現(xiàn)。當(dāng)在平臺(tái)110與網(wǎng)關(guān)120之間建立連接時(shí),數(shù)據(jù)與存儲(chǔ)在平臺(tái)110處(例如,在數(shù)據(jù)庫(kù)112內(nèi))的相關(guān)數(shù)據(jù)同步。
3.2.數(shù)據(jù)同步
當(dāng)平臺(tái)110與網(wǎng)關(guān)120連接時(shí),平臺(tái)110和網(wǎng)關(guān)120的鏡像數(shù)據(jù)倉(cāng)庫(kù)持續(xù)同步。另外,在平臺(tái)110處進(jìn)行的數(shù)據(jù)改變(例如,經(jīng)由界面114)傳播遍及平臺(tái)110(例如,從聯(lián)合中的一個(gè)數(shù)據(jù)架構(gòu)服務(wù)器傳播到聯(lián)合中的所有其它數(shù)據(jù)架構(gòu)服務(wù)器)。
在實(shí)施方案中,平臺(tái)110的客戶端,例如腳本管理器210和裝置管理器160,使用平臺(tái)110的api來(lái)訂閱相關(guān)數(shù)據(jù)。當(dāng)訂閱相關(guān)數(shù)據(jù)時(shí),客戶端被告知將影響在客戶端處的動(dòng)作的任何數(shù)據(jù)改變。這可導(dǎo)致平臺(tái)110將命令發(fā)送到裝置(例如,經(jīng)由裝置管理器160),改變用戶界面(例如,在thingworx中)等。
3.3.同步狀態(tài)
常規(guī)的分布式控制系統(tǒng)通常難以準(zhǔn)確地表示在用戶請(qǐng)求遠(yuǎn)程數(shù)據(jù)的改變的時(shí)間與知道改變已生效的時(shí)間之間的時(shí)延。在實(shí)施方案中,數(shù)據(jù)架構(gòu)使用每屬性同步狀態(tài)來(lái)解決此問(wèn)題。此機(jī)制可用于驅(qū)動(dòng)可視化用戶界面,例如,界面114的gui。
具體地說(shuō),存儲(chǔ)在平臺(tái)110處的每一裝置屬性可通過(guò)值和狀態(tài)兩者表示。在實(shí)施方案中,對(duì)于每一裝置屬性,所述值和狀態(tài)必須一起設(shè)定。所述值表示所述裝置屬性的值,且所述狀態(tài)表示所述裝置屬性的同步狀態(tài),正如平臺(tái)110當(dāng)前已知。例如,在實(shí)施方案中,狀態(tài)可為“確認(rèn)的”、“未決的”或“未知的?!?/p>
在實(shí)施方案中,對(duì)于數(shù)據(jù)架構(gòu)聯(lián)合中的每一數(shù)據(jù)元素(例如,裝置屬性),僅一個(gè)參與者被指定為所述數(shù)據(jù)元素的“權(quán)威機(jī)構(gòu)?!崩?,網(wǎng)關(guān)120上的裝置管理器160是表示連接到所述網(wǎng)關(guān)120的物理裝置的裝置屬性的權(quán)威機(jī)構(gòu)。當(dāng)權(quán)威機(jī)構(gòu)將裝置屬性值設(shè)定為已知值時(shí),裝置屬性狀態(tài)被設(shè)定為“確認(rèn)的,”指示權(quán)威機(jī)構(gòu)確認(rèn)此裝置屬性。當(dāng)任何其它參與者(例如,用戶界面,例如界面114的gui)改變裝置屬性值時(shí),所述裝置屬性狀態(tài)被設(shè)定為“未決的,”且將保持“未決的”直到裝置屬性值已成功地傳播到權(quán)威機(jī)構(gòu),此時(shí)權(quán)威機(jī)構(gòu)將設(shè)定裝置屬性狀態(tài)為“確認(rèn)的?!币话愕兀瑱?quán)威機(jī)構(gòu)將具有“未決的”狀態(tài)的裝置屬性解譯為采取外部動(dòng)作的請(qǐng)求,在此之后,權(quán)威機(jī)構(gòu)將設(shè)定裝置屬性為適合的值并設(shè)定裝置屬性的狀態(tài)為“確認(rèn)的?!碑?dāng)無(wú)法確定裝置屬性的當(dāng)前狀態(tài)時(shí)(例如,在物理裝置有缺陷的情況下),權(quán)威機(jī)構(gòu)可將裝置屬性狀態(tài)設(shè)定為“未知的。”
4.簡(jiǎn)化的圖形用戶界面(gui)腳本
在實(shí)施方案中,腳本圖形用戶界面(gui)提供新手或非技術(shù)用戶對(duì)基礎(chǔ)腳本語(yǔ)言的簡(jiǎn)化使用。腳本gui允許用戶利用界面114的gui來(lái)直觀地構(gòu)造中等復(fù)雜的腳本行為,所述腳本行為隨后自動(dòng)地轉(zhuǎn)換成基礎(chǔ)腳本語(yǔ)言,例如,以用于在腳本執(zhí)行環(huán)境150內(nèi)的解析或編譯。由腳本gui提供的功能可為基礎(chǔ)腳本語(yǔ)言的功能的簡(jiǎn)化子集,且具體地說(shuō)涉及通過(guò)在網(wǎng)關(guān)120和/或裝置的數(shù)據(jù)架構(gòu)中讀取和/或?qū)懭霐?shù)據(jù)來(lái)控制遠(yuǎn)程網(wǎng)關(guān)120上的行為。在實(shí)施方案中,界面114還可包括一個(gè)或多個(gè)工具,所述工具用于管理一個(gè)或多個(gè)網(wǎng)關(guān)120上的腳本的部署和激活和/或去激活。
腳本gui可包括一個(gè)或多個(gè)簡(jiǎn)單腳本用戶界面,所述用戶界面包括用于將腳本元素的可視化表示連接成完整的腳本的輸入,所述完整的腳本隨后可在被轉(zhuǎn)換成基礎(chǔ)腳本語(yǔ)言之前被轉(zhuǎn)譯成中間表示(在本文中被稱為“gui腳本”)。替代地,可視化創(chuàng)建的腳本可在沒(méi)有中間表示的情況下直接地轉(zhuǎn)換成基礎(chǔ)腳本語(yǔ)言。另外,腳本gui的用戶界面可允許用戶將腳本文本(即,用基礎(chǔ)腳本語(yǔ)言表示)直接地插入到gui腳本中。另外或替代地,腳本gui可包括一個(gè)或多個(gè)基礎(chǔ)腳本用戶界面,所述用戶界面使得用戶能夠使用基礎(chǔ)腳本語(yǔ)言直接地寫入腳本。當(dāng)一起使用時(shí),用戶可從使用簡(jiǎn)單腳本用戶界面來(lái)創(chuàng)建簡(jiǎn)單腳本逐漸地轉(zhuǎn)變成使用基礎(chǔ)腳本用戶界面來(lái)用基礎(chǔ)腳本語(yǔ)言直接地創(chuàng)建更加復(fù)雜的腳本。
在實(shí)施方案中,腳本gui包含以下屬性中的一個(gè)或多個(gè):
●多特征門戶(例如,通過(guò)界面114實(shí)施),所述門戶允許授權(quán)用戶構(gòu)造并管理腳本和腳本庫(kù),并將那些腳本庫(kù)或來(lái)自那些腳本庫(kù)的一個(gè)或多個(gè)腳本的特定集合安裝在遠(yuǎn)程網(wǎng)關(guān)120上;
●用于產(chǎn)生gui腳本的一個(gè)或多個(gè)用戶界面,所述gui腳本通過(guò)用數(shù)據(jù)架構(gòu)的數(shù)據(jù)格式讀取和寫入裝置和網(wǎng)關(guān)數(shù)據(jù)來(lái)控制遠(yuǎn)程網(wǎng)關(guān)120上的行為;
●用數(shù)據(jù)架構(gòu)的數(shù)據(jù)格式將gui腳本存儲(chǔ)為數(shù)據(jù)的能力;和/或
●工具,所述工具用于管理針對(duì)一個(gè)或多個(gè)網(wǎng)關(guān)120的腳本的部署和激活。
在實(shí)施方案中,腳本gui包括一個(gè)或多個(gè)簡(jiǎn)單腳本用戶界面的直觀集合,所述集合使用戶經(jīng)過(guò)創(chuàng)建gui腳本的過(guò)程。將參考圖4a至圖4e描述實(shí)例腳本創(chuàng)建過(guò)程:
(1)如圖4a中所示,用戶確定腳本是否將具有觸發(fā)條件,或通過(guò)用戶或通過(guò)另一腳本單獨(dú)地激活;
(2)如果用戶指定腳本將具有觸發(fā)條件,如圖4b和圖4c中所示,那么用戶選擇一個(gè)或多個(gè)觸發(fā)條件,所述觸發(fā)條件可包含例如“與”、“或”以及“非”運(yùn)算符;
(3)如圖4d和圖4e中所示,用戶選擇將在滿足“觸發(fā)”條件后執(zhí)行的動(dòng)作;以及
(4)用戶將腳本保存(例如)到平臺(tái)110的數(shù)據(jù)庫(kù)112和/或一個(gè)或多個(gè)網(wǎng)關(guān)120的腳本注冊(cè)表214。
4.1.更新網(wǎng)關(guān)
在實(shí)施方案中,在用戶已使用腳本gui成功地創(chuàng)建或編輯腳本后,腳本gui將用于將腳本發(fā)送到一個(gè)或多個(gè)網(wǎng)關(guān)的輸入呈現(xiàn)給用戶。如果用戶選擇將gui腳本發(fā)送到網(wǎng)關(guān)(例如,通過(guò)選擇所述輸入和/或選擇或以其它方式指定目的地網(wǎng)關(guān)),那么平臺(tái)110將gui腳本發(fā)送到網(wǎng)關(guān)120(例如,經(jīng)由因特網(wǎng))。以此方式,平臺(tái)110使得用戶能夠隨時(shí)間推移做出許多編輯,并僅在每一編輯的每一次完成之后替換網(wǎng)關(guān)120上的腳本。
4.2.激活腳本
在實(shí)施方案中,已部署在網(wǎng)關(guān)120上的腳本將僅在所述腳本被激活時(shí)執(zhí)行。網(wǎng)關(guān)120上的腳本可通過(guò)用戶的動(dòng)作(例如,經(jīng)由界面114)或通過(guò)在被執(zhí)行(例如,在腳本執(zhí)行環(huán)境150中)的另一腳本中的“激活”指令來(lái)激活。
4.3.離線地創(chuàng)建腳本
傳統(tǒng)的基于因特網(wǎng)的硬件布置中的問(wèn)題是需要持續(xù)的因特網(wǎng)連接。此問(wèn)題通過(guò)使用不一致的蜂窩數(shù)據(jù)連接而復(fù)雜化。在硬件裝置失去其因特網(wǎng)連接的情況下,傳統(tǒng)布置的用戶將不能夠?qū)λ鲇布b置執(zhí)行任何更新,例如添加或修改所述硬件裝置上的腳本。
本文中描述的數(shù)據(jù)架構(gòu)的同步特征的實(shí)施方案避免此問(wèn)題。用戶可登入平臺(tái)110的界面114的gui,即使是當(dāng)通過(guò)用戶管理的網(wǎng)關(guān)120不連接到因特網(wǎng)時(shí)。在此情況下,gui可前攝地(例如,在用戶嘗試更新網(wǎng)關(guān)之前)或反應(yīng)性地(例如,在用戶嘗試更新網(wǎng)關(guān)之后)告知用戶網(wǎng)關(guān)120離線。通過(guò)用戶經(jīng)由gui針對(duì)離線網(wǎng)關(guān)120執(zhí)行的所有更新可以“未決的”狀態(tài)存儲(chǔ)。當(dāng)先前離線的網(wǎng)關(guān)120重連到因特網(wǎng)并訂閱平臺(tái)110時(shí),經(jīng)重連的網(wǎng)關(guān)120將接收所有未決的更新并將更新后的數(shù)據(jù)的狀態(tài)設(shè)定為“確認(rèn)的”?!按_認(rèn)的”狀態(tài)將被發(fā)送回到平臺(tái)110,使得所述狀態(tài)可將存儲(chǔ)在平臺(tái)110上的對(duì)應(yīng)的數(shù)據(jù)的狀態(tài)同步為“確認(rèn)的。”之后,數(shù)據(jù)的經(jīng)同步狀態(tài)將在界面114的gui中反映。
4.4.管理多個(gè)網(wǎng)關(guān)
在實(shí)施方案中,平臺(tái)110實(shí)現(xiàn)用戶與網(wǎng)關(guān)120之間的多對(duì)多關(guān)系。一旦用戶注冊(cè)網(wǎng)關(guān)120(例如,經(jīng)由界面114的管理gui),界面114的gui就可將用戶可訪問(wèn)的所有網(wǎng)關(guān)呈現(xiàn)給經(jīng)認(rèn)證用戶,如根據(jù)實(shí)施方案在圖5a中所說(shuō)明。
在實(shí)施方案中,用戶可經(jīng)由界面114的gui對(duì)用戶可訪問(wèn)的網(wǎng)關(guān)120分類。例如,用戶可創(chuàng)建類別,并將網(wǎng)關(guān)120的一個(gè)或多個(gè)表示移動(dòng)到每一創(chuàng)建的類別中。任何分類可僅應(yīng)用于當(dāng)前用戶,從而允許可訪問(wèn)相同網(wǎng)關(guān)120的其它用戶以不同方式對(duì)相同網(wǎng)關(guān)120分類。替代地,通過(guò)一個(gè)用戶對(duì)網(wǎng)關(guān)120的任何分類可自動(dòng)地應(yīng)用到另一用戶對(duì)相同網(wǎng)關(guān)120的分類。根據(jù)實(shí)施方案,提供網(wǎng)關(guān)120的實(shí)例分類的gui的實(shí)例在圖5b中說(shuō)明。特別地,圖5a和圖5b中所說(shuō)明的gui還指示每一網(wǎng)關(guān)的狀態(tài)(即,“斷開(kāi)”或“連接”)。
4.5.在多個(gè)網(wǎng)關(guān)上部署并激活腳本
在實(shí)施方案中,腳本gui能夠構(gòu)造在用戶的網(wǎng)關(guān)中的一些或全部上起作用的腳本,而不必針對(duì)通過(guò)腳本控制的每一特定裝置來(lái)創(chuàng)建腳本。這使得單一用戶能夠在簡(jiǎn)單的用戶體驗(yàn)內(nèi)管理數(shù)百個(gè)網(wǎng)關(guān)。
例如,界面114的gui可包括用戶界面,所述用戶界面具有選擇一個(gè)或多個(gè)腳本的輸入和選擇一個(gè)或多個(gè)網(wǎng)關(guān)的輸入。如在圖5c的實(shí)例實(shí)施方案中所說(shuō)明,每一腳本與“網(wǎng)關(guān)”輸入相關(guān)聯(lián)。當(dāng)用戶選擇腳本和用于所述腳本的“網(wǎng)關(guān)”輸入時(shí),顯示用戶的網(wǎng)關(guān)的全部的表示(例如,在置于gui的特定網(wǎng)頁(yè)上的幀中的列表中)。用戶隨后可從所有網(wǎng)關(guān)的所述表示選擇一個(gè)或多個(gè)網(wǎng)關(guān),選定腳本應(yīng)可用于所述一個(gè)或多個(gè)網(wǎng)關(guān)。一旦用戶已選定網(wǎng)關(guān)和/或經(jīng)由gui確認(rèn)對(duì)網(wǎng)關(guān)的選擇,平臺(tái)110就可確保選定腳本安裝在選定網(wǎng)關(guān)上,且gui可顯示上面已安裝有腳本的多個(gè)網(wǎng)關(guān)。
一旦腳本已被分布到選定網(wǎng)關(guān),用戶隨后就可激活在那些網(wǎng)關(guān)上的所述腳本。如在圖5d的實(shí)例實(shí)施方案中所說(shuō)明,每一腳本與“激活”輸入相關(guān)聯(lián)。當(dāng)用戶選擇腳本和用于所述腳本的“激活”輸入時(shí),顯示上面安裝有選定腳本的所有用戶的網(wǎng)關(guān)的表示(例如,在整體都在gui的特定網(wǎng)頁(yè)上的幀中的列表中),如圖5e中的實(shí)例實(shí)施方案中所說(shuō)明。用戶隨后可從上面安裝有選定腳本的所有網(wǎng)關(guān)的所述表示選擇一個(gè)或多個(gè)網(wǎng)關(guān),應(yīng)可針對(duì)所述一個(gè)或多個(gè)網(wǎng)關(guān)激活選定腳本。作為響應(yīng),平臺(tái)110可經(jīng)由與控制器130和/或腳本執(zhí)行環(huán)境150的通信來(lái)激活選定網(wǎng)關(guān)上的選定腳本。
4.6.識(shí)別多個(gè)網(wǎng)關(guān)上的類似裝置
跨越多個(gè)網(wǎng)關(guān)120復(fù)制腳本的困難是確保那些腳本能夠與多個(gè)網(wǎng)關(guān)120中的每一個(gè)上的裝置的不同集合介接。在常規(guī)的控制系統(tǒng)中,用戶將必須在每一網(wǎng)關(guān)上重構(gòu)腳本,針對(duì)多個(gè)網(wǎng)關(guān)中的每一個(gè)選擇適合的裝置集合。此過(guò)程對(duì)于非常大數(shù)目的網(wǎng)關(guān)和/或裝置不可行。
在數(shù)據(jù)架構(gòu)的實(shí)施方案中,以兩種方式識(shí)別每一裝置:(1)唯一的字母數(shù)字識(shí)別符;以及(2)沒(méi)有特殊性要求的名稱。在腳本引用裝置識(shí)別符且腳本執(zhí)行環(huán)境150(例如,編譯器220或vm230)不能夠用連接到網(wǎng)關(guān)120的匹配識(shí)別符定位裝置(例如,因?yàn)橐褟牧硪痪W(wǎng)關(guān)復(fù)制所述腳本)的情況下,腳本執(zhí)行環(huán)境150自動(dòng)地搜索連接到網(wǎng)關(guān)120的相同名稱的裝置以替代使用。因此,只要網(wǎng)關(guān)120包含具有相同名稱的裝置,腳本就可在沒(méi)有用戶介入的情況下恰當(dāng)?shù)仄鹱饔谩?/p>
4.7.作用于裝置的群組
在實(shí)施方案中,數(shù)據(jù)架構(gòu)提供裝置分組。具體地說(shuō),用戶可通過(guò)界面114的gui創(chuàng)建群組。一旦已創(chuàng)建群組,用戶就可將任何數(shù)目的裝置置于群組中。特定裝置可在一個(gè)或多個(gè)裝置群組中。腳本gui可使得用戶能夠在這些裝置群組中的一個(gè)或多個(gè)上以及在個(gè)別的裝置上創(chuàng)建腳本操作。圖5f和圖5g說(shuō)明根據(jù)實(shí)施方案的在腳本gui中的裝置群組的選擇。在所說(shuō)明的實(shí)例中,腳本gui可查詢裝置群組,并提供裝置群組連同個(gè)別裝置的可選擇列表。用戶可選擇這些個(gè)別裝置或裝置群組中的一個(gè)以用于操作。在圖5f和圖5g中,用戶選擇“燈光”裝置群組,并指定將“燈光”裝置群組切換到“接通”的操作。
裝置群組上的腳本操作作用于裝置群組中的所有裝置,例如,將任何改變或查詢轉(zhuǎn)發(fā)到裝置群組中所包含的每一個(gè)別裝置。在圖5f和圖5g的所說(shuō)明實(shí)例中,腳本將把“燈光”裝置群組中的所有裝置切換到“接通?!币源朔绞剑瑔我荒_本操作可設(shè)定裝置群組中的所有裝置的屬性的值。在裝置群組內(nèi)的特定裝置不具有被設(shè)定的屬性(例如,針對(duì)包含二進(jìn)制開(kāi)關(guān)和非二進(jìn)制裝置兩者的群組將二進(jìn)制開(kāi)關(guān)值設(shè)定為“接通”)的情況下,可忽略針對(duì)那些特定裝置的操作。
類似地,腳本gui可使得用戶能夠基于裝置群組創(chuàng)建觸發(fā)器。例如,腳本gui可查詢裝置群組,并提供裝置群組連同個(gè)別裝置的可選擇列表以用于觸發(fā)條件中。在實(shí)施方案中,如果“觸發(fā)”條件是基于裝置群組,那么“觸發(fā)”主體將在裝置群組內(nèi)的任何裝置滿足“觸發(fā)”條件時(shí)執(zhí)行。例如,圖5h說(shuō)明在“燈光”裝置群組中的任何裝置切換到“接通”時(shí)將警報(bào)器設(shè)定為“閃光”的實(shí)例腳本。
有利地,裝置群組的使用簡(jiǎn)化對(duì)具有相同功能的大量裝置的管理。例如,單一腳本可告知管理員裝置群組內(nèi)的任何運(yùn)動(dòng)傳感器是否檢測(cè)到設(shè)施中的運(yùn)動(dòng)。這與常規(guī)系統(tǒng)相反,所述常規(guī)系統(tǒng)將需要針對(duì)每一運(yùn)動(dòng)傳感器寫入腳本。
5.腳本執(zhí)行環(huán)境
在實(shí)施方案中,網(wǎng)關(guān)120提供支持用于控制網(wǎng)關(guān)120的基礎(chǔ)腳本語(yǔ)言的腳本執(zhí)行環(huán)境150。基礎(chǔ)腳本語(yǔ)言和腳本執(zhí)行環(huán)境150可經(jīng)設(shè)計(jì)以允許最不熟悉編程概念的用戶創(chuàng)建在多個(gè)領(lǐng)域中的復(fù)雜控制系統(tǒng)。如本文中所描述,通過(guò)小心的分層、抽象以及分割,且通過(guò)使用新的高級(jí)語(yǔ)言和解析技術(shù),結(jié)合普遍使用數(shù)據(jù)驅(qū)動(dòng)技術(shù),可實(shí)施簡(jiǎn)單強(qiáng)大且自適應(yīng)的通用控制語(yǔ)言。
圖2說(shuō)明根據(jù)實(shí)施方案的腳本執(zhí)行環(huán)境150。如所說(shuō)明,腳本執(zhí)行環(huán)境150包括腳本管理器210。在實(shí)施方案中,腳本管理器210:
●接收腳本;
●經(jīng)由腳本轉(zhuǎn)換器212提供腳本從中間gui腳本(例如,在數(shù)據(jù)架構(gòu)中表達(dá)為來(lái)自腳本gui的輸出)到基礎(chǔ)腳本語(yǔ)言的自動(dòng)轉(zhuǎn)換;
●經(jīng)由腳本轉(zhuǎn)換器212提供接收到的gui腳本和呈基礎(chǔ)腳本語(yǔ)言的經(jīng)轉(zhuǎn)換腳本兩者的同時(shí)句法檢查,以確保正確性;
●將腳本存儲(chǔ)在腳本注冊(cè)表214中;
●從腳本注冊(cè)表214檢索腳本;
●處理腳本相關(guān)的命令和通知,例如將腳本添加到腳本注冊(cè)表214,從腳本注冊(cè)表214刪除腳本,激活或去激活腳本注冊(cè)表214中的腳本,和/或類似者;和/或
●即使失去與平臺(tái)110的通信和/或針對(duì)網(wǎng)關(guān)120循環(huán)電源,也執(zhí)行激活的腳本。
如上文所論述,在實(shí)施方案中,腳本管理器210包括或訪問(wèn)本地腳本注冊(cè)表214。本地腳本注冊(cè)表214可存儲(chǔ)將通過(guò)網(wǎng)關(guān)120執(zhí)行的任何腳本的本地版本,由此實(shí)現(xiàn)網(wǎng)關(guān)120的自主操作。這確保網(wǎng)關(guān)120即使失去與平臺(tái)110的通信也可繼續(xù)操作。
在實(shí)施方案中,基礎(chǔ)腳本語(yǔ)言在句法上且在表達(dá)層面上類似于c,但被簡(jiǎn)化(例如,缺少聲明)并針對(duì)控制系統(tǒng)概念的規(guī)范而專門化?;A(chǔ)腳本語(yǔ)言可經(jīng)實(shí)施以處理以下各項(xiàng)中的一個(gè)或多個(gè):
●通過(guò)甚至新手程序員可快速習(xí)得的小且常見(jiàn)的語(yǔ)言,允許控制系統(tǒng)概念的規(guī)范,而沒(méi)有對(duì)程序員表達(dá)能力的任何限制;
●允許在所述語(yǔ)言的句法內(nèi)直接地處理并操控外部裝置和屬性;
●提供線程隱喻,所述線程隱喻使得易于創(chuàng)建獨(dú)立但互相通信的腳本線程的集合;
●消除程序員“聲明”變量的需要并操控?cái)?shù)據(jù)類型(例如,通過(guò)提供動(dòng)態(tài)數(shù)據(jù)類型模型,所述模型支持僅四種內(nèi)置類型,例如布爾型、64位整數(shù)、雙精度實(shí)數(shù)以及字符串);
●允許語(yǔ)言可擴(kuò)展性以支持效用函數(shù)的不斷增長(zhǎng)的庫(kù);
●在存儲(chǔ)器和處理器時(shí)間中具有較小“占用區(qū)域”,同時(shí)允許腳本的并行的線程狀執(zhí)行(例如,在高級(jí)精簡(jiǎn)指令集計(jì)算機(jī)器(arm)處理器上),例如,通過(guò)用完全正交的操作碼集合和簡(jiǎn)單編程隱喻實(shí)施虛擬機(jī)(vm)以執(zhí)行用基礎(chǔ)腳本語(yǔ)言寫入的腳本;
●使得通過(guò)基礎(chǔ)腳本語(yǔ)言提供的所有功能性能夠在多個(gè)處理器(例如,平臺(tái)110的多個(gè)服務(wù)器)上執(zhí)行為異構(gòu)互連網(wǎng)絡(luò)的一部分,包含一個(gè)或多個(gè)網(wǎng)關(guān)120;
●使得用基礎(chǔ)腳本語(yǔ)言寫入的腳本能夠執(zhí)行為(i)與用于裝置管理器160的過(guò)程分開(kāi)的獨(dú)立過(guò)程,和/或(ii)與裝置管理器160統(tǒng)一的過(guò)程,以進(jìn)行直接驅(qū)動(dòng)器調(diào)用以實(shí)現(xiàn)最大效率和最小開(kāi)銷;
●支持開(kāi)發(fā)人員的廣泛的調(diào)試功能、錯(cuò)誤日志、堆?;厮?、斷點(diǎn)等;
●快速地適應(yīng)于其它基礎(chǔ)架構(gòu)部件中的變化,例如數(shù)據(jù)架構(gòu)和裝置管理器160,而不改變現(xiàn)有腳本;和/或
●使用相同但受約束的句法來(lái)支持基礎(chǔ)腳本語(yǔ)言的無(wú)線程版本,以供動(dòng)態(tài)創(chuàng)建的解析器內(nèi)(即,不在vm230內(nèi))的驅(qū)動(dòng)器層164直接使用,使得用基礎(chǔ)腳本語(yǔ)言寫入的腳本能夠用無(wú)線程(經(jīng)由動(dòng)態(tài)創(chuàng)建的解析器)和線程(經(jīng)由vm230)模式兩者執(zhí)行。
在實(shí)施方案中,基礎(chǔ)腳本語(yǔ)言還具有以下屬性中的一個(gè)或多個(gè):
●易于使用但強(qiáng)大的通用裝置控制語(yǔ)言;
●由于與c的共同性而易于使用,包含對(duì)幾乎所有c邏輯、算術(shù)以及按位運(yùn)算符的支持,具有與c相同的運(yùn)算符優(yōu)先級(jí);
●經(jīng)典的“if-elsif-else”和“while”語(yǔ)句(例如,具有“break”和“continue”),類似于c;
●內(nèi)置類型,包含布爾型、64位整數(shù)、雙精度數(shù)、字符串(例如,utf-8文本)和/或未知的;
●任意嵌套的表達(dá)和函數(shù)調(diào)用,類似于c;
●函數(shù)的變量參數(shù)計(jì)數(shù);
●函數(shù)可支持多個(gè)參數(shù)類型;
●塊結(jié)構(gòu),類似于c;
●行和塊注釋,類似于c;
●支持日期、時(shí)間、一天中的時(shí)間、日歷等,例如,呈現(xiàn)為雙精度數(shù)并經(jīng)受所有適合的運(yùn)算符;
●數(shù)據(jù)類型、裝置屬性以及裝置類型在運(yùn)行時(shí)間處動(dòng)態(tài)地確定,使得不需要聲明,由此使得腳本為簡(jiǎn)單且自適應(yīng)的;
●在激活后對(duì)vm程序的動(dòng)態(tài)編譯,而不會(huì)對(duì)所需腳本重新編譯;
●線程模型,所述線程模型與函數(shù)調(diào)用隱喻緊密集成并包含參數(shù)傳遞(例如,通過(guò)值和/或通過(guò)引用);
●使用標(biāo)準(zhǔn)語(yǔ)言令牌來(lái)直接地引用裝置和裝置屬性;
●內(nèi)置庫(kù)函數(shù)的套件,所述套件可通過(guò)開(kāi)發(fā)人員擴(kuò)展;
●局部和全局符號(hào)類型動(dòng)態(tài)地確定,使得所述符號(hào)類型通過(guò)賦值來(lái)簡(jiǎn)單地創(chuàng)建;
●腳本可同步地或異步地激活、去激活、啟動(dòng)以及卸載其它腳本,并將參數(shù)/輸出傳遞到其它腳本;
●從激活中的腳本(即,祖先腳本或父腳本)到激活后的腳本(即,后裔腳本或子腳本)的分層符號(hào)范圍;
●動(dòng)態(tài)構(gòu)造的解析器,所述解析器允許語(yǔ)言的快速修改和/或擴(kuò)展;
●觸發(fā)語(yǔ)句(具有可選的“else”語(yǔ)句),所述語(yǔ)句用可選的滯后項(xiàng)對(duì)狀態(tài)轉(zhuǎn)變做出響應(yīng);
●任何符號(hào)或?qū)傩钥删哂形粗?,且語(yǔ)言邏輯以未知值恰當(dāng)?shù)倪\(yùn)行;
●“pause”操作,所述操作提供精確延遲;
●“when”結(jié)構(gòu),所述結(jié)構(gòu)將一個(gè)或多個(gè)指令封鎖在腳本中,直到滿足指定條件;
●“every”結(jié)構(gòu),所述結(jié)構(gòu)以精確時(shí)間間隔將一個(gè)或多個(gè)指令封鎖在腳本中;
●內(nèi)置控制臺(tái)和輸出日志;
●正交集操控和索引函數(shù);
●“assignandwaitwhilepending”運(yùn)算符(例如,“:=”),所述運(yùn)算符處理困擾通用編程語(yǔ)言的經(jīng)典異步問(wèn)題;
●對(duì)于嵌入式系統(tǒng)理想的具有較小存儲(chǔ)器占用區(qū)域的高性能;
●下推自動(dòng)機(jī)vm匯編器編程模型;
●使用美國(guó)國(guó)家標(biāo)準(zhǔn)協(xié)會(huì)(ansi)c并不需要第三方外部庫(kù)來(lái)加強(qiáng)可移性;
●在虛擬機(jī)內(nèi)解譯;和/或
●經(jīng)由激活祖先腳本分層符號(hào)范圍,其中所有腳本共享根本的祖先,所述根本的祖先的范圍定義可用于所有執(zhí)行的腳本的共用動(dòng)態(tài)全局參數(shù)集。
另外,腳本執(zhí)行環(huán)境150可具有或支持以下各項(xiàng)中的一個(gè)或多個(gè):
●將gui腳本的表示轉(zhuǎn)換成基礎(chǔ)腳本語(yǔ)言的能力;
●用基礎(chǔ)腳本語(yǔ)言直接地將語(yǔ)句插入到腳本gui中的能力;
●通過(guò)vm230并行地執(zhí)行多個(gè)腳本(例如,數(shù)百個(gè)腳本)的能力,每個(gè)腳本在單獨(dú)模擬的線程中;
●將腳本編譯成vm程序以用于快速執(zhí)行;
●在其它平臺(tái)(例如,pc)上運(yùn)行同時(shí)仍控制經(jīng)由ip訪問(wèn)并連接到多個(gè)分布式網(wǎng)關(guān)120和平臺(tái)110的裝置的能力;
●調(diào)試設(shè)施;
●隱藏傳輸層和裝置特定的協(xié)議的細(xì)節(jié);
●通過(guò)vm230運(yùn)行腳本的能力,即使是當(dāng)從平臺(tái)110斷開(kāi)時(shí);
●通過(guò)名稱和識(shí)別符進(jìn)行的裝置解析;
●對(duì)基礎(chǔ)腳本語(yǔ)言隱藏驅(qū)動(dòng)器指定的偽影;
●裝置和裝置屬性的動(dòng)態(tài)發(fā)現(xiàn);
●用于自主操作的本地腳本注冊(cè)表214;
●與用于裝置管理器160中的適配器語(yǔ)言的共同性,以及與用于所提供的通用驅(qū)動(dòng)器抽象內(nèi)的物理到邏輯映射語(yǔ)言的共同性,以易于學(xué)習(xí);
●從平臺(tái)110動(dòng)態(tài)下載新的和/或經(jīng)修正的腳本,其中網(wǎng)關(guān)120在腳本的改變后自動(dòng)更新;
●在云中可經(jīng)由界面114的gui訪問(wèn)的腳本狀態(tài)和日志;
●能夠通過(guò)名稱或識(shí)別符來(lái)引用和解析裝置并將裝置布置成群組,使得可創(chuàng)建通用(即,非裝置特定的)腳本且所述腳本可在多個(gè)不同的設(shè)施(例如,具有不同外部硬件裝置設(shè)施的網(wǎng)關(guān)120)上運(yùn)行,且可通過(guò)簡(jiǎn)單地將屬性分配給表示裝置群組的虛擬裝置來(lái)將屬性分配給裝置的群組;
●能夠創(chuàng)建網(wǎng)關(guān)120的分層,并寫入以虛擬裝置為中介的元腳本(即,控制網(wǎng)關(guān)和其它腳本的腳本);
5.1.基礎(chǔ)腳本語(yǔ)言
在實(shí)施方案中,基礎(chǔ)腳本語(yǔ)言在通用解析或解譯器框架內(nèi)操作,所述框架可用于指定特定于每一界面的自定義語(yǔ)言句法,并用于通過(guò)提供回調(diào)來(lái)實(shí)施行為。此框架的技術(shù)方法例如在以下文件中描述:2007年4月24日發(fā)布的且標(biāo)題為“用于解析數(shù)據(jù)的方法和系統(tǒng)(systemandmethodforparsingdata)”的第7,210,130號(hào)美國(guó)專利案(“‘130專利案”),以及2008年2月5日發(fā)布的且標(biāo)題為“用于分析數(shù)據(jù)和執(zhí)行詞法分析的方法(methodforanalyzingdataandperforminglexicalanalysis)”的第7,328,430號(hào)美國(guó)專利案(“‘430專利案”),所述專利案都特此通過(guò)引用并入本文中。基礎(chǔ)腳本語(yǔ)言的語(yǔ)言句法將在本文中使用在‘130專利案中描述的擴(kuò)充巴科斯-諾爾范式(bnf)來(lái)描述,且所描述的代碼實(shí)施使用在‘130專利案中描述的已注冊(cè)的“解析器”和“插件”架構(gòu)來(lái)組織?;A(chǔ)腳本語(yǔ)言的詞法結(jié)構(gòu)將在本文中使用在‘430專利案中定義的形式化來(lái)描述。雖然有可能使用其它解析器生成工具來(lái)實(shí)施所公開(kāi)的基礎(chǔ)腳本語(yǔ)言的功能,但在實(shí)施方案中,基礎(chǔ)腳本語(yǔ)言基于在‘130專利案和‘430專利案中描述的庫(kù)來(lái)構(gòu)建。
5.1.1.詞法結(jié)構(gòu)
根據(jù)實(shí)施方案,下方的列表1表示根據(jù)在‘430專利案中定義的形式化的基礎(chǔ)腳本語(yǔ)言的詞法結(jié)構(gòu):
在實(shí)施方案中,除列表1中的“<begin>”與“<next>”分隔符之間的各種關(guān)鍵字和運(yùn)算符外,基礎(chǔ)腳本語(yǔ)言還支持以下變量詞法令牌:
●令牌1:變量或符號(hào)值(例如,counter、idx_1、a、varname等);
●令牌2:具有換碼的單或多字符常量(例如,“x、”“\n”、“\x34、”“abcd”);
●令牌3:十進(jìn)制64位整數(shù)(例如,1234);
●令牌4和5:具有可選指數(shù)的雙精度浮點(diǎn)數(shù)(例如,1.234、1.3e5);
●令牌6:裝置屬性(例如,@dev.temperature、@[xxydd].contact、@.prop等);
●令牌7:十六進(jìn)制64位整數(shù)(例如,0xffff、0x34ab);
●令牌8和9:未經(jīng)使用,因?yàn)樗械恼麛?shù)都是相同大??;
●令牌10:八進(jìn)制64位整數(shù)常量(例如,03777);
●令牌11:未經(jīng)使用,因?yàn)樗械恼麛?shù)都是相同大??;和/或
●令牌12和13:具有換碼的字符串常量(例如,“helloworld\n”)。
在實(shí)施方案中,通過(guò)基礎(chǔ)腳本語(yǔ)言支持的運(yùn)算符集類似于在標(biāo)準(zhǔn)c語(yǔ)言內(nèi)支持的運(yùn)算符集,除了基礎(chǔ)腳本語(yǔ)言可不包含自動(dòng)遞增/遞減形式,且c邏輯操作(即,&&、||、!)可分別通過(guò)關(guān)鍵字“and”、“or”以及“not”替代,以便于新手程序員理解。
在實(shí)施方案中,除了內(nèi)置類型外,基礎(chǔ)腳本語(yǔ)言不允許定義類型,所述內(nèi)置類型可緊密地對(duì)應(yīng)于詞法令牌。內(nèi)置類型可包括:
●布爾型:布爾值(例如,保持為64位整數(shù)),所述布爾值可采用“真”或“假”的值。
●整數(shù):64位整數(shù)值(但可使用不同大小的整數(shù)值);
●實(shí)數(shù):雙精度浮點(diǎn)值(例如,等效于c中的雙精度數(shù));
●字符串:任意長(zhǎng)度的字符串值(例如,“helloworld”);
●符號(hào):符號(hào)值,所述符號(hào)值自動(dòng)地呈現(xiàn)數(shù)據(jù)類型和賦給所述符號(hào)值的任何項(xiàng)的值(例如,myvariablename),使得符號(hào)可具有任何基礎(chǔ)類型(例如,布爾型、整數(shù)、實(shí)數(shù)、字符串或未知的);和/或
●屬性:裝置屬性值(例如,@dev.temperature),其中屬性的數(shù)據(jù)類型通過(guò)模式和處理所述模式的裝置驅(qū)動(dòng)器確定為任何基礎(chǔ)類型(例如,布爾型、整數(shù)、實(shí)數(shù)、字符串或未知的)。
在實(shí)施方案中,基礎(chǔ)腳本語(yǔ)言是動(dòng)態(tài)類型語(yǔ)言,所述語(yǔ)言利用與裝置相關(guān)聯(lián)的所有字段和屬性的數(shù)據(jù)驅(qū)動(dòng)運(yùn)行時(shí)間發(fā)現(xiàn)。換句話說(shuō),符號(hào)呈現(xiàn)數(shù)據(jù)類型和最近賦給符號(hào)的任何項(xiàng)的值。這消除了對(duì)與類型定義相關(guān)聯(lián)的句法或邏輯的需要,所述需要使其它編程語(yǔ)言復(fù)雜化。
如上文所提及,在實(shí)施方案中,符號(hào)和屬性數(shù)據(jù)類型可賦有基礎(chǔ)數(shù)據(jù)類型中的任何類型,以及表示“unknown”的值。如本文中其它地方將描述,“unknown”值可具有特殊意義,尤其是在給表達(dá)式賦值時(shí)。
在實(shí)施方案中,基礎(chǔ)腳本語(yǔ)言支持塊和行注釋兩者,類似于c?;A(chǔ)腳本語(yǔ)言還可支持塊語(yǔ)句(例如,通過(guò)括號(hào)“{”和“}”包圍),類似于c。列表1中所說(shuō)明的其它關(guān)鍵字的使用和語(yǔ)義將在本文中的其它地方參考基礎(chǔ)腳本語(yǔ)言的句法來(lái)描述。
5.1.2.句法
根據(jù)實(shí)施方案,給出列表1中定義的詞法結(jié)構(gòu)并根據(jù)在‘130專利案中定義的形式化,下方的列表2表示基礎(chǔ)腳本語(yǔ)言的句法:
列表2中的bnf的區(qū)段,從“expression”的左手側(cè)(lhs)產(chǎn)生式開(kāi)始并以“real”的lhs產(chǎn)生式結(jié)束,基本上指定可用于表達(dá)式內(nèi)的所有運(yùn)算符,和通過(guò)bnf內(nèi)的聲明序列實(shí)施的對(duì)應(yīng)的運(yùn)算符優(yōu)先級(jí)規(guī)則。
在實(shí)施方案中,基礎(chǔ)腳本語(yǔ)言的句法在根本上與c編程語(yǔ)言類似或相同,且因此,將不進(jìn)行詳細(xì)描述。此外,在實(shí)施方案中,所有這些語(yǔ)言功能都通過(guò)基于‘130專利案的解析器技術(shù)而內(nèi)置在庫(kù)中的代碼實(shí)施,如通過(guò)呈“<@0:n>”形式的語(yǔ)法元素指示。出于此原因,基礎(chǔ)腳本語(yǔ)言的這些方面,包含任意深度的嵌套表達(dá)式的賦值,將也不在本文中詳細(xì)描述。在實(shí)施方案中,與標(biāo)準(zhǔn)c編程語(yǔ)言的唯一句法差異是用邏輯運(yùn)算符“and”替代“&&,”用“or”替代“||,”且用“not”替代“!,”并在“primary”的產(chǎn)生式中允許值“unknown?!?/p>
在實(shí)施方案中,基礎(chǔ)腳本語(yǔ)言支持對(duì)內(nèi)置函數(shù)(返回某一值)和程序(返回“unknown”的值)的調(diào)用,可將零個(gè)或更多個(gè)逗號(hào)分隔的參數(shù)傳遞到所述內(nèi)置函數(shù)和程序。每一參數(shù)可為任意表達(dá)式(包含嵌套函數(shù)調(diào)用),所述表達(dá)式產(chǎn)生可采用基礎(chǔ)數(shù)據(jù)類型中的任何數(shù)據(jù)類型的形式的參數(shù)值。與此功能相關(guān)聯(lián)的語(yǔ)法產(chǎn)生式包含“object”、“rstof_object”、“parameter_list”以及“rstof_param_list?!焙瘮?shù)可確定傳遞到所述函數(shù)的參數(shù)的數(shù)量和數(shù)據(jù)類型,且許多函數(shù)可對(duì)于任何給定參數(shù)接受超過(guò)一個(gè)數(shù)據(jù)類型,并根據(jù)傳遞作為給定參數(shù)的數(shù)據(jù)類型操作。可用內(nèi)置函數(shù)的取樣在本文中的其它地方出于說(shuō)明性目的而描述。
應(yīng)理解,雖然本文中將使用并描述某些特定關(guān)鍵字,但可將任何數(shù)目的不同關(guān)鍵字(例如,傳達(dá)相同或相似的理念)用作所描述的那些關(guān)鍵字的替代。
5.1.3.聲明和參數(shù)化
列表2中的產(chǎn)生式,在“program”處開(kāi)始并在“end_sfishid”處結(jié)束,涉及用基礎(chǔ)腳本語(yǔ)言寫入的腳本的聲明和參數(shù)化。腳本包括一個(gè)或多個(gè)函數(shù)聲明和主體。在實(shí)施方案中,在腳本源文件內(nèi)遇到的第一聲明被視為腳本的“主”函數(shù)。主函數(shù)表示在腳本已通過(guò)編譯器220編譯成vm程序并加載到vm230中以用于執(zhí)行之后實(shí)際執(zhí)行的代碼。
在實(shí)施方案中,如果在主函數(shù)定義后出現(xiàn)另外的函數(shù)定義,那么這些另外的函數(shù)表示另外的靜態(tài)范圍的腳本,所述腳本可僅從具有同一腳本源文件的代碼(例如,通過(guò)在“主”函數(shù)或另一函數(shù)內(nèi)的代碼)激活。正如主函數(shù)一樣,這些另外的函數(shù)可采用零個(gè)或更多個(gè)參數(shù)。列表2中的產(chǎn)生式“program、”“function”以及“opt_more_funcs”描述腳本的整個(gè)主要和子例程內(nèi)容。
在實(shí)施方案中,腳本可具有可選的相關(guān)聯(lián)id(見(jiàn)例如,列表2中的產(chǎn)生式“script_prototype”)和字符串描述。id值一般與本文中在其它地方描述的gui腳本的id相同,從所述gui腳本可得出基礎(chǔ)語(yǔ)言腳本(例如,經(jīng)由腳本轉(zhuǎn)換器212)。此腳本id形成方便的方式,通過(guò)所述方式,腳本可被引用回到原始gui腳本源(如果適當(dāng))。針對(duì)基礎(chǔ)語(yǔ)言腳本的描述一般還可對(duì)應(yīng)于gui腳本的描述。描述形成用于識(shí)別哪一個(gè)腳本在執(zhí)行并用于其目的的方便的人可讀方式。id和描述兩者可用于調(diào)試界面內(nèi)。在從gui腳本得出的基礎(chǔ)語(yǔ)言腳本的情況下,轉(zhuǎn)換過(guò)程(例如,通過(guò)腳本轉(zhuǎn)換器212實(shí)施)可在基礎(chǔ)語(yǔ)言腳本的描述前方插入gui腳本的原始名稱(例如,呈“[原始gui腳本名稱][描述的剩余部分]”的形式)。這允許腳本管理器210在必要時(shí)恢復(fù)原始gui腳本名稱,所述原始gui腳本名稱可符合或可不符合基礎(chǔ)語(yǔ)言命名要求。
在實(shí)施方案中,所有腳本可接受零個(gè)或更多個(gè)逗號(hào)分隔的參數(shù),所述參數(shù)可通過(guò)值或通過(guò)引用傳遞(見(jiàn)例如,列表2中的產(chǎn)生式“opt_io”和“more_opt_io”)。當(dāng)在給定腳本內(nèi)腳本原型內(nèi)的識(shí)別符在關(guān)鍵字“value”之前時(shí),所述識(shí)別符將在范圍中且將初始化為通過(guò)調(diào)用腳本傳遞為所述參數(shù)的值的任何表達(dá)式的值和數(shù)據(jù)類型。當(dāng)參數(shù)以此方式通過(guò)值傳遞時(shí),在父腳本或激活腳本中的所傳遞值的改變將不影響子腳本中的值。子腳本還無(wú)法經(jīng)由已通過(guò)值傳遞的參數(shù)而返回到值。
另一方面,如果在腳本的參數(shù)之前是關(guān)鍵字“reference,”父腳本或激活腳本必須傳遞包含將通過(guò)引用傳遞的符號(hào)或裝置屬性的名稱的字符串值。在此情況下,在子腳本內(nèi)執(zhí)行的代碼可通過(guò)參數(shù)的局部名稱訪問(wèn)參數(shù),但所有此類訪問(wèn)自動(dòng)地解析為對(duì)初始命名的符號(hào)或?qū)傩缘囊谩=Y(jié)果是,如果子腳本更改已通過(guò)引用傳遞的參數(shù)的值,那么所述值立刻在父腳本中改變,且反之亦然。因?yàn)榉?hào)具有通過(guò)使用所述符號(hào)的腳本定義的范圍,所以子腳本能夠引用并更改在父腳本的范圍內(nèi)的符號(hào)值。此機(jī)制允許腳本之間的簡(jiǎn)單通信,并允許子腳本將結(jié)果值返回到父腳本(即,通過(guò)改變?cè)诟改_本的范圍內(nèi)的符號(hào)或?qū)傩缘闹?。腳本參數(shù)的使用在本文中的其它地方更詳細(xì)論述。
5.1.4.簡(jiǎn)單語(yǔ)句
在實(shí)施方案中,基礎(chǔ)腳本語(yǔ)言提供多個(gè)簡(jiǎn)單語(yǔ)句。這些簡(jiǎn)單語(yǔ)句中的每一個(gè)可通過(guò)分號(hào)與下一個(gè)分隔,所述分號(hào)在實(shí)施方案中是語(yǔ)句分隔符。如通過(guò)列表2中的“simple_stmt”產(chǎn)生式所說(shuō)明,無(wú)論簡(jiǎn)單語(yǔ)句可存在于何處,所述簡(jiǎn)單語(yǔ)句都可被包含另外的內(nèi)部語(yǔ)句的塊語(yǔ)句(即,“{more_statements}”)替代。另外,在任何簡(jiǎn)單語(yǔ)句為合法的情況下,空語(yǔ)句(即,只有“;”)是合法的。
在實(shí)施方案中,可用于基礎(chǔ)腳本語(yǔ)言中的簡(jiǎn)單語(yǔ)句包括以下各項(xiàng)中的一個(gè)或多個(gè):
●“break:”可用于任何循環(huán)內(nèi)以立即中斷包含“break”的循環(huán)?!癰reak”語(yǔ)句在功能上與c中的“break”語(yǔ)句相同。出現(xiàn)在任何循環(huán)外部的“break”語(yǔ)句可忽略。
●“continue:”可用于任何循環(huán)內(nèi)以立即使得循環(huán)的下一迭代開(kāi)始?!癱ontinue”語(yǔ)句在功能上與c中的“continue”語(yǔ)句相同。出現(xiàn)在任何循環(huán)外部的“continue”語(yǔ)句可忽略。
●“pause:”使得腳本在指定量的時(shí)間上暫停且不進(jìn)行其它操作?!皃ause”語(yǔ)句看起來(lái)就像對(duì)名稱為“pause”的函數(shù)(見(jiàn)例如,“simple_stmt”產(chǎn)生式)的函數(shù)調(diào)用一樣。然而,所述“pause”語(yǔ)句的實(shí)施可以不同方式處理,如在本文中的其它地方所說(shuō)明。在實(shí)施方案中,“pause”語(yǔ)句接受兩個(gè)參數(shù):(a)整數(shù)或?qū)崝?shù)表達(dá)式,所述表達(dá)式指定構(gòu)成所述暫停的時(shí)間單位的數(shù)目,以及(b)字符串值,所述字符串值包含合法的固定長(zhǎng)度時(shí)間單位(例如,“week、”“day、”“hour”、“minute”、“second”或“tick,”和/或這些單詞的復(fù)數(shù)形式,例如,“weeks,”...“ticks”)中的一個(gè)的名稱。因此,語(yǔ)句“pause(1.5,‘seconds’)”將使得當(dāng)前腳本的活動(dòng)暫停1.5秒,同時(shí)允許并行地執(zhí)行的任何其它腳本在暫停期間繼續(xù)正常執(zhí)行。作為實(shí)例,“pause”語(yǔ)句可用于將簡(jiǎn)單的延遲引入到腳本中,同時(shí)等待現(xiàn)實(shí)世界的事件達(dá)到穩(wěn)定狀態(tài);
●“@devname.property=x”(即,某一形式,其中x表示任何任意復(fù)雜的表達(dá)式,devname表示任何裝置名稱,且property表示通過(guò)devname表示的裝置的任何裝置屬性):將賦值運(yùn)算符(即,“=”或“:=”)的右手側(cè)的值(即,通過(guò)“x”表示的值)賦給通過(guò)“@devname.property”指定的裝置屬性;
●“symbolname=x”(即,某一形式,其中x表示任何任意復(fù)雜的表達(dá)式,且symbolname表示任何符號(hào)的名稱):將賦值運(yùn)算符(即,“=”或“:=”)的右手側(cè)的值(即,通過(guò)“x”表示的值)賦給通過(guò)“symbolname”指定的符號(hào)。如果“symbolname”是已通過(guò)引用(與值相對(duì))傳遞到腳本的參數(shù)的名稱,那么最終賦值可賦給在父腳本的范圍內(nèi)的裝置屬性或所引用的符號(hào);
●對(duì)內(nèi)置程序或內(nèi)置函數(shù)的調(diào)用(丟棄結(jié)果值)構(gòu)成有效的簡(jiǎn)單語(yǔ)句(見(jiàn)例如,列表2中的“assign_or_call”);
●“deactivatemyscriptname()”(即,某一形式,其中myscriptname表示任何任意腳本的名稱):立即去激活通過(guò)“myscriptname”表示的命名腳本。腳本可同時(shí)被激活(在不同的vm線程中并行的),或不同時(shí)被激活(即,串行的)?!癲eactivate”語(yǔ)句用于去激活同時(shí)運(yùn)行的腳本。在實(shí)施方案中,“deactivate”語(yǔ)句不應(yīng)用于沒(méi)有關(guān)鍵字“concurrently”的已激活的腳本。每當(dāng)腳本被去激活時(shí),所有后裔腳本也可被去激活。去激活從vm環(huán)境去除腳本;和/或
●“activatemyscriptname(...)”(即,某一形式,其中myscriptname表示任何任意腳本的名稱,且“...”表示逗號(hào)分隔的參數(shù)的任意長(zhǎng)集合,包含零個(gè)參數(shù)):激活通過(guò)“myscriptname”表示的命名腳本,且可選地通過(guò)值或通過(guò)引用將一個(gè)或多個(gè)參數(shù)傳遞到腳本。在實(shí)施方案中,激活的腳本是調(diào)用“activate”語(yǔ)句的腳本的子腳本(且可使用關(guān)鍵字“concurrently”激活以同時(shí)運(yùn)行)。激活將命名的腳本添加到vm環(huán)境以作為激活中的腳本的子腳本,并開(kāi)始新近激活的腳本的執(zhí)行。
5.1.5.循環(huán)和條件語(yǔ)句
在實(shí)施方案中,基礎(chǔ)腳本語(yǔ)言提供僅單個(gè)循環(huán)語(yǔ)句。在實(shí)施方案中,此單個(gè)循環(huán)語(yǔ)句是“while”循環(huán)語(yǔ)句?!皐hile”循環(huán)可在功能上和句法上與c中的“while”循環(huán)相同。在循環(huán)的每一迭代后,評(píng)估“while”條件,當(dāng)“while”條件為真時(shí)執(zhí)行循環(huán)主體,且當(dāng)“while”條件為假時(shí)終止循環(huán)。在實(shí)例中,“while”條件可表達(dá)為“while(true)”以創(chuàng)建無(wú)限循環(huán),所述無(wú)限循環(huán)可通過(guò)循環(huán)主體內(nèi)的“break”或在祖先腳本中執(zhí)行的“deactivate”語(yǔ)句終止。意圖連續(xù)運(yùn)行的大部分腳本將包括外部無(wú)限“while”循環(huán)。在沒(méi)有外部無(wú)限“while”循環(huán)的情況下,腳本將運(yùn)行至完成,且隨后自動(dòng)地去激活(可能地將執(zhí)行的結(jié)果用通過(guò)引用通過(guò)激活中的腳本傳遞的參數(shù)返回到激活中的腳本)。通過(guò)其它語(yǔ)言提供的此標(biāo)準(zhǔn)循環(huán)結(jié)構(gòu)的簡(jiǎn)化簡(jiǎn)化了學(xué)習(xí)曲線。應(yīng)理解,在替代實(shí)施方案中,可使用另一循環(huán)結(jié)構(gòu)(例如,“do...while”語(yǔ)句、“repeat”語(yǔ)句、“for”語(yǔ)句等)來(lái)替代“while”循環(huán)結(jié)構(gòu)。
另一方面,在實(shí)施方案中,基礎(chǔ)腳本語(yǔ)言提供比常規(guī)編程語(yǔ)言更復(fù)雜的條件語(yǔ)句以支持控制系統(tǒng)專門化?;A(chǔ)腳本語(yǔ)言的“if”語(yǔ)句可類似于c中的“if”語(yǔ)句,除了在實(shí)施方案中,基礎(chǔ)腳本語(yǔ)言通過(guò)禁止任何條件或循環(huán)語(yǔ)句直接嵌套在另一條件語(yǔ)句的主體內(nèi)來(lái)避免c中的懸掛“else”問(wèn)題和其它問(wèn)題。這意味著人們不能寫入“if(x)statement;elseif(y)statement;...”的結(jié)構(gòu),因?yàn)樵跊](méi)有圍繞的塊語(yǔ)句的情況下禁止第二個(gè)“if”語(yǔ)句。另一方面,在基礎(chǔ)腳本語(yǔ)言中將可接受“if(x)statement;else{if(y)statement;}”的結(jié)構(gòu)。這同樣適用于在“if”子句內(nèi)嵌套條件語(yǔ)句或循環(huán)?!癳lseif”結(jié)構(gòu)允許在創(chuàng)建條件語(yǔ)句的擴(kuò)展列表時(shí)克服此限制。
在實(shí)施“trigger”條件語(yǔ)句的實(shí)施方案中,“trigger”語(yǔ)句,類似于“if”語(yǔ)句,也可具有可選的“else”子句?!癷f”與“trigger”語(yǔ)句之間的差異是,在“if”語(yǔ)句中,在評(píng)估條件時(shí)條件的值確定執(zhí)行“if”語(yǔ)句的哪個(gè)分支(即,“if”子句或“else”子句),而在“trigger”語(yǔ)句中,必定存在正確的布爾條件值和到/從正/假值的轉(zhuǎn)變,以便執(zhí)行“trigger”子句一次。相同的子句將不再執(zhí)行,直到條件從滿足的條件改變且然后返回到滿足的條件。對(duì)于“trigger”語(yǔ)句在外部循環(huán)內(nèi)的最初執(zhí)行,先前狀態(tài)被視為“unknown,”所述“unknown”意味著,在外部循環(huán)的第一次迭代中,“trigger”語(yǔ)句表現(xiàn)得像“if”語(yǔ)句,但在外部循環(huán)的每一隨后的迭代中,“trigger”語(yǔ)句需要到滿足的條件的轉(zhuǎn)變。相同的轉(zhuǎn)變要求適用于“trigger”語(yǔ)句的可選“else”子句。換句話說(shuō),“trigger”子句將在滿足條件后執(zhí)行一次(在第一次迭代上或在轉(zhuǎn)變之后),且“else”子句將在條件不再被滿足時(shí)執(zhí)行一次(在第一次迭代上或在轉(zhuǎn)變之后)。
“trigger”語(yǔ)句是用于處理在現(xiàn)實(shí)世界中的屬性以某一明顯方式改變狀態(tài)時(shí)發(fā)生的情況的理想工具,而不必?fù)?dān)心跟蹤狀態(tài)以確保腳本并不一遍又一遍地執(zhí)行相同操作的復(fù)雜性。因此,“trigger”語(yǔ)句是處理跟蹤控制系統(tǒng)中的狀態(tài)的復(fù)雜性的創(chuàng)新方法。
在實(shí)施方案中,“trigger”語(yǔ)句可接受第二參數(shù)(即,除觸發(fā)條件外),所述第二參數(shù)表示與觸發(fā)條件的任何比較必須超出以便檢測(cè)到“邊緣”(即,狀態(tài)轉(zhuǎn)變)的變量或閾值。例如,對(duì)于語(yǔ)句“trigger(a>100,1),”直到“a”的值在增加方向上超出101或在下降方向上下降至低于99時(shí)才出現(xiàn)邊緣。此句法將“滯后”添加到“trigger”語(yǔ)句。滯后可用于避免例如在溫度徘徊在100左右時(shí)的常見(jiàn)問(wèn)題,因此快速地觸發(fā)“trigger”和“else”子句兩者的一系列調(diào)用,而非通過(guò)斷點(diǎn)值在每一轉(zhuǎn)變上的單個(gè)觸發(fā)。
在實(shí)施方案中,基礎(chǔ)腳本語(yǔ)言還實(shí)施“every”語(yǔ)句?!癳very”語(yǔ)句滿足定期地執(zhí)行代碼的主體的控制系統(tǒng)要求,而非另外跳過(guò)所述代碼的主體,且可尤其有益于監(jiān)視函數(shù)和具有中間靜止的常規(guī)活動(dòng)的產(chǎn)生(例如,灑水車控制系統(tǒng))。“every”條件語(yǔ)句瑣碎地處理所有此類情況。對(duì)于“every”語(yǔ)句,條件不是布爾條件,而是整數(shù)、實(shí)數(shù)、雙精度數(shù)或日期(見(jiàn)例如,本文中在其它地方描述的“stringtotime”的內(nèi)置函數(shù)),其指定將在“every”語(yǔ)句的主體的每一次執(zhí)行之間傳遞的經(jīng)過(guò)時(shí)間。類似于“trigger”語(yǔ)句,第一次在循環(huán)內(nèi)遇到“every”語(yǔ)句時(shí),先前值是“unknown,”且因此,執(zhí)行“every”語(yǔ)句的主體。在循環(huán)的每一隨后迭代中,跳過(guò)“every”語(yǔ)句的主體直到已經(jīng)過(guò)指定時(shí)間,此時(shí)“every”語(yǔ)句的主體再執(zhí)行一次。
5.1.6.線程模型
在實(shí)施方案中,基礎(chǔ)腳本語(yǔ)言實(shí)施簡(jiǎn)單但強(qiáng)大的線程模型,如通過(guò)“activateconcurrently”語(yǔ)句指定。為說(shuō)明此特征和此特征如何與基礎(chǔ)腳本語(yǔ)言的其它功能交互,將參考下方的列表3描述簡(jiǎn)單的測(cè)試案例實(shí)例:
列表3的實(shí)例中的主腳本是“illustratethreading,”所述腳本不采用參數(shù)且同時(shí)激活被稱為“sawtooth”的局部聲明的子腳本(即,“illustratethreading”是父腳本,且“sawtooth”是子腳本),從而通過(guò)引用傳遞單個(gè)參數(shù),所述參數(shù)在“sawtooth”內(nèi)稱為符號(hào)“property?!碑?dāng)激活“sawtooth”時(shí),“illustratethreading”將裝置屬性“@thermometer1.temperature”(例如,表示被稱為“thermometer1”的裝置的溫度值)傳遞作為在“sawtooth”內(nèi)稱為符號(hào)“property”的參數(shù)。“sawtooth”子腳本執(zhí)行無(wú)限循環(huán),在所述無(wú)限循環(huán)內(nèi),“property”的值交替地遞增至上限110,且隨后遞減至下限90。因?yàn)椤癅thermometer1.temperature”通過(guò)引用傳遞,所以“sawtooth”子腳本中的“property”的值的改變立即在“@thermometer1.temperature”中反映出。結(jié)果是“sawtooth”子腳本以與主腳本“illustratethreading”異步且完全并行的線程創(chuàng)建“@thermometer1.temperature”屬性的值的三角波或鋸齒波。在“sawtooth”子腳本內(nèi)傳遞到“pause”語(yǔ)句的值設(shè)定所產(chǎn)生的鋸齒波的頻率。
在激活“sawtooth”子腳本之后,主“illustratethreading”腳本進(jìn)入循環(huán),其中每當(dāng)執(zhí)行內(nèi)部“trigger”子句或“else”子句時(shí),定義條件的變量遞增一次。因?yàn)椤皌rigger”語(yǔ)句的每一子句在“@thermometer1.temperature”的值經(jīng)過(guò)100的均值時(shí)僅執(zhí)行一次,所以對(duì)于符號(hào)“heatwave”和“cooling”中的每一個(gè),恰當(dāng)執(zhí)行的“illustratingthreading”腳本應(yīng)產(chǎn)生最終值4。注意,同步子線程“sawtooth”通過(guò)更改裝置屬性“@thermometer1.temperature”的值來(lái)直接地且同時(shí)地與父腳本“illustratethreading”交互,由此交替地迫使“trigger”語(yǔ)句的“trigger”子句或“else”子句在每當(dāng)所述值在任一方向上經(jīng)過(guò)100時(shí)執(zhí)行。
此簡(jiǎn)單精巧設(shè)計(jì)的實(shí)例說(shuō)明線程模型的實(shí)施方案的能力和簡(jiǎn)單性,如通過(guò)“activateconcurrently”語(yǔ)句所提供。“activateconcurrently”語(yǔ)句可用于創(chuàng)建復(fù)雜的系統(tǒng),所述復(fù)雜的系統(tǒng)將對(duì)用其它編程語(yǔ)言實(shí)施具有大得多的挑戰(zhàn)性,且將需要高得多的水平的編程專業(yè)知識(shí)。并行線程的實(shí)際實(shí)施將在本文中的其它地方參考vm230的實(shí)施方案描述。
5.1.7.內(nèi)置函數(shù)
在實(shí)施方案中,基礎(chǔ)腳本語(yǔ)言可提供內(nèi)置函數(shù)的庫(kù)。以下是可在基礎(chǔ)腳本語(yǔ)言的庫(kù)中提供的內(nèi)置函數(shù)中的一些的非窮盡性列表,其中“[i]”指示整數(shù)參數(shù),“[b]”指示布爾參數(shù),“[f]”指示實(shí)數(shù)參數(shù),“[s]”指示字符串參數(shù),且“[v]”指示空返回值(即,程序而非函數(shù)):
●[f]stringtotime([[s]datetimestring]):將日期(和/或可選地,時(shí)間)字符串轉(zhuǎn)換成雙精度日期。在實(shí)施方案中,日期必須用以下“yyyy/mm/dd[hh:mm[:ss[:tt]][am/pm]]”的格式指定。所述函數(shù)可僅支持公歷。滴答值“tt”(如果存在)表示一秒的1/100(范圍為00...99)。日期可指定為“0000/00/00”以便將一天中的時(shí)間值/偏移轉(zhuǎn)換成等效雙精度值。如果日期字符串是無(wú)效的,那么可返回值0.0。被返回的雙精度日期的整數(shù)部分是日期序列號(hào)(sdn)。sdn是日期的順序編號(hào),其中sdn1是公歷公元前4714年11月25號(hào),且sdn2447893是1990年1月1號(hào)。此日期編號(hào)系統(tǒng)有時(shí)被稱為“julian”日期,但為避免混淆我們?cè)诒疚闹惺褂眯g(shù)語(yǔ)“sdn。”實(shí)際值的小數(shù)部分包含一天中的時(shí)間,使得一小時(shí)=1/24.0,一分鐘=1/1440.0等等。此外部表示的優(yōu)點(diǎn)是以此格式表示的日期可使用基礎(chǔ)腳本語(yǔ)言的普通算術(shù)運(yùn)算符來(lái)容易地比較和操控。如果省略“datetimestring”參數(shù),那么函數(shù)返回當(dāng)前日期和時(shí)間值。此函數(shù)還接受形式“yyyy-mm-ddt...”的字符串,所述字符串可通過(guò)本文中的其它地方描述的腳本gui輸出(其中從t向前的所有字符被忽略);
●[i]round([f]realvalue):將實(shí)數(shù)四舍五入到最近的整數(shù)值;
●[i]int([i/r/s]avalue):將整數(shù)、實(shí)數(shù)或字符串值轉(zhuǎn)換成整數(shù)值。字符串轉(zhuǎn)換可類似于c中的“strtoll()”函數(shù);
●[f]real([i/r/s]avalue):將整數(shù)、實(shí)數(shù)或字符串值轉(zhuǎn)換成實(shí)數(shù)值。字符串轉(zhuǎn)換可類似于c中的“strtod()”函數(shù);
●[s]sprintf([s]formatstring,...):類似于c中的“sprintf()”函數(shù),除了整數(shù)和實(shí)數(shù)可變自變量大小始終分別為int64和雙精度數(shù);
●[f]random():產(chǎn)生在0至1的范圍內(nèi)的隨機(jī)實(shí)數(shù);
●[i]randomirange([i]min,[i]max):產(chǎn)生在“min”至“max-1”的范圍內(nèi)的隨機(jī)整數(shù);
●[i]setoptions([i]options/[s]optionsstr):用于開(kāi)始選定的解析器選項(xiàng)。此函數(shù)可用于調(diào)試腳本的選定部分,而不會(huì)通過(guò)跟蹤其它的每一項(xiàng)而使控制臺(tái)混亂。字符串形式允許符號(hào)化地設(shè)定選項(xiàng)。在執(zhí)行所設(shè)定的操作后,此函數(shù)返回選項(xiàng)設(shè)定以作為結(jié)果;
●[i]clroptions([i]options/[s]optionsstr):清除指定的解析選項(xiàng)。此函數(shù)與setoptions()相反,并在清除操作后返回選項(xiàng)設(shè)定以作為結(jié)果。字符串形式允許符號(hào)化地清除選項(xiàng);
●[i]getoptions():獲得并返回解析選項(xiàng)的當(dāng)前設(shè)定;
●[s]timetostring([[f]datedouble]):將雙精度日期轉(zhuǎn)換成公歷日期字符串,隨后是時(shí)間值(24小時(shí)制);
●[i]timeelement([f]datedouble,][s]elementname):獲得指定時(shí)間元素以作為來(lái)自日期雙精度值的整數(shù)?!癳lementname”的有效字符串值是:“year”(年值),“month”(在用于1月的0與用于12月的11之間的月值),“dayofyear”(在1與365之間的一年中的天數(shù)),“day”(在1與31之間的一月中的天數(shù)),“dayofweek”(在用于星期天的0與用于星期六的6之間的一周的天數(shù)),“weekdayofmonth”(從1至5的一月中的某周的天數(shù),例如,一月的第3個(gè)星期天),“hour”(在0與23之間的一天的小時(shí)),“hour12”(在1與12之間的鐘面小時(shí)),“ampm”(在用于am的0與用于pm的1之間的am/pm),“minute”(在0與59之間的一小時(shí)的分鐘),“second(”在0與59之間的一分鐘的秒),和/或“tick”(在0與99之間的一秒的滴答);
●[f/i]timeunit([s]unitname):返回等效于指定的固定長(zhǎng)度時(shí)間單位的雙精度值。值“unitname”字符串是“week”、“day”、“hour”、“minute”、“second”以及“tick?!崩?,表達(dá)式“3*timeunit(‘week’)”將用于獲得三周的雙精度值等效物。此函數(shù)可取決于哪個(gè)合適而返回實(shí)數(shù)值或整數(shù)值;
●[s]exit([s]areason):使得當(dāng)前腳本清楚地退出,且可選地(向控制臺(tái))顯示退出的原因,如果通過(guò)“areason”參數(shù)指定的話;
●[i]linenum():返回當(dāng)前腳本的源文件中的當(dāng)前行號(hào);
●[s/i/f]indexset([i]index,[s/i/f]set1,...[s/i/f]setn):通過(guò)索引從給定成員列表選擇特定的成員集,并返回選定成員作為結(jié)果。如果指定索引在范圍外,那么返回指示“novalue”的值。函數(shù)的返回?cái)?shù)據(jù)類型通過(guò)集合成員的數(shù)據(jù)類型(所述集合成員的數(shù)據(jù)類型必定全都相同且為整數(shù)、實(shí)數(shù)或字符串?dāng)?shù)據(jù)類型中的一個(gè))確定;
●[i]setindex([s/i/f]src,[s/i/f]set1,…[s/i/f]setn):比較“src”與所提供的可能匹配值的集合中的元素中的每一個(gè),并在找到匹配時(shí)返回所找到的匹配的索引(從1開(kāi)始),或在未找到匹配時(shí)返回零。如果“src”為整數(shù),待檢查的其余的集合值必定也為整數(shù)。類似地,如果“src”為字符串,那么待檢查的其余的集合值必定也為字符串,并且,如果“src”為實(shí)數(shù),那么待檢查的其余的集合值必定也為實(shí)數(shù)。此函數(shù)表示用以針對(duì)值的集合中的成員關(guān)系檢查值的方便方式,并且可用僅單個(gè)函數(shù)調(diào)用來(lái)替代大量的個(gè)別比較;
●[f]timeofday([[f]datedouble]):返回“datedouble”的對(duì)應(yīng)于一天中的時(shí)間的小數(shù)部分;
●[f]sunrise():返回對(duì)應(yīng)于在當(dāng)前日期上的當(dāng)前位置處的日出的小數(shù)datetime值。如果在當(dāng)前日期上的當(dāng)前位置處太陽(yáng)未升起,那么函數(shù)返回指示“unknown”的值。否則,函數(shù)返回所請(qǐng)求的小數(shù)日期雙精度實(shí)數(shù)值;
●[f]sunset():返回對(duì)應(yīng)于在當(dāng)前日期上的當(dāng)前位置處的日落的小數(shù)datetime值。如果在當(dāng)前日期上的當(dāng)前位置處太陽(yáng)未落下,那么函數(shù)返回指示“unknown”的值。否則,函數(shù)返回所請(qǐng)求的小數(shù)日期雙精度實(shí)數(shù)值;
●[i]rangeindex([i/f]src,[i/f]set1,…[i/f]setn):類似于setindex()函數(shù),但在集合中尋找匹配的“l(fā)essthanorequalto”值,而非相等。因此,此函數(shù)可用于索引數(shù)值范圍的有序集合,由此替代較大數(shù)目的條件語(yǔ)句。不同于setindex()函數(shù),在rangeindex()函數(shù)中禁止字符串值;
●[s]consolemessage([s]formatstr[,…]):執(zhí)行與c中的“sprintf()”函數(shù)類似的函數(shù),返回所產(chǎn)生的字符串作為結(jié)果,且同時(shí)將所產(chǎn)生的字符串發(fā)送到控制臺(tái)。此函數(shù)可用于產(chǎn)生調(diào)試或進(jìn)展消息;
●[v]log([s]action,[s]formatstring[,…]):對(duì)應(yīng)于腳本gui“l(fā)og”命令,并將所得字符串發(fā)送到界面114的gui的登錄頁(yè)面,由此充當(dāng)記錄整個(gè)系統(tǒng)活動(dòng)的方式。在實(shí)施方案中,腳本gui自身僅傳遞簡(jiǎn)單的字符串。然而,廣義“l(fā)og”函數(shù)將第二參數(shù)視為c“sprintf()”兼容格式區(qū)分符。所傳遞的任何另外參數(shù)用于替換值,正如c中的“sprintf()”一樣。因此,最終的日志輸出可包含可變值,而非僅固定字符串;和/或
●可提供多種其它內(nèi)置函數(shù),包含但不限于以下各項(xiàng)中的一個(gè)或多個(gè),以下各項(xiàng)已經(jīng)選擇以說(shuō)明環(huán)境功能:
[b]scriptactive([s]scriptname):在通過(guò)“scriptname”指定的腳本活動(dòng)且在vm230內(nèi)運(yùn)行時(shí)返回“true,”以及否則返回“false。”注意,對(duì)于在腳本內(nèi)聲明的子腳本,僅激活中的腳本具有可視性。因此,僅僅激活中的腳本可確定子腳本的狀態(tài);
[b]between([i/f]val,[i/f]low,[i/f]high):檢查通過(guò)“val”表示的值是否在通過(guò)“l(fā)ow”和“high”表示的限制值之間;
[i]configoptions([i]index,[s]optionstoset,[s]optionstoclear):動(dòng)態(tài)地改變系統(tǒng)配置和/或調(diào)試選項(xiàng);
[b]known([s]asymbol[,[s]devtype]):確定符號(hào)是否是“known;”
[v]forget([s]asymbol[,[s]devtype]):“forgets”符號(hào)的定義或值;
[v]newblock_pid([s]asymbol,[s]currentval,[f]windupguard,[f]propgain,[f]intgain,[f]derivgain):創(chuàng)建參數(shù)化比例-積分-微分(pid)控制器。這是能夠創(chuàng)建具有持續(xù)狀態(tài)的任意塊的實(shí)例;
[i/f/s/v]updateblock([r]blockref{,[i/f/s]paramn}):更新“block”的狀態(tài);
[s]record([s]adschannel,[s]aname,[i/f/s]avalue[,[i/f]deltavalue]):將值記錄到“datastream”虛擬裝置的指定信道;和/或
[s]setdevice([s]devnameandorref):設(shè)定通過(guò)所允許的語(yǔ)言形式“@.propertyname”意指的裝置引用。在本文中的其它地方描述的適配器語(yǔ)言中,此隱式裝置可通過(guò)上下文自動(dòng)設(shè)定。
5.1.8.解析器上下文和符號(hào)
在實(shí)施方案中,基礎(chǔ)腳本語(yǔ)言中的腳本可通過(guò)以下操作執(zhí)行:(i)通過(guò)編譯器220編譯成在vm230中執(zhí)行的vm程序;或(ii)通過(guò)解析器直接地解譯,而不必被編譯成vm程序。
如在本文中的其它地方所論述,在基礎(chǔ)腳本語(yǔ)言中,符號(hào)一被賦值并接受最近賦給符號(hào)的內(nèi)容的數(shù)據(jù)類型和值,就在局部范圍內(nèi)被創(chuàng)建。換句話說(shuō),基礎(chǔ)腳本語(yǔ)言是動(dòng)態(tài)類型的語(yǔ)言。符號(hào)是基本解析器抽象能夠使任意上下文與解析器的任何給定實(shí)例相關(guān)聯(lián)的一個(gè)實(shí)例。
在實(shí)施方案中,解析器結(jié)合值將符號(hào)存儲(chǔ)為字符串,包含符號(hào)的名稱,所述值可具有內(nèi)置數(shù)據(jù)類型(例如,布爾型、整數(shù)、實(shí)數(shù)、字符串或未知的)中的一個(gè)。每一符號(hào)還可具有相關(guān)聯(lián)的標(biāo)志值。例如,標(biāo)志可用于指示,特定符號(hào)實(shí)際上是已通過(guò)引用傳遞的腳本參數(shù),在此情況下,出于讀取或?qū)懭肽康亩L問(wèn)所述符號(hào)的任何代碼可遵循引用以執(zhí)行讀取或?qū)懭?。每?dāng)解析器遇到符號(hào)名稱時(shí),所述解析器可在本地解析器的符號(hào)注冊(cè)表中實(shí)施查找以尋找符號(hào)名稱的條目,且隨后在符號(hào)注冊(cè)表中檢索或設(shè)定數(shù)據(jù)類型和值。在實(shí)施方案中,使用‘430專利案的詞法分析器抽象來(lái)索引符號(hào)注冊(cè)表以用于快速查找。這使符號(hào)查找?guī)缀跏撬矔r(shí)的,而不管符號(hào)注冊(cè)表中的符號(hào)的數(shù)目。
解析器抽象還支持解析器之間的父子關(guān)系的創(chuàng)建。例如,在跟蹤給定父腳本的子腳本時(shí)利用此父子關(guān)系。每個(gè)和每一腳本,無(wú)論是父腳本還是子腳本,都具有相關(guān)聯(lián)的解析器,而不管所述腳本是直接地在所述解析器內(nèi)還是在vm230內(nèi)執(zhí)行。在實(shí)施方案中,vm230不使用解析器來(lái)解譯執(zhí)行的腳本的操作碼,而是確實(shí)使用所述解析器來(lái)維持上下文和符號(hào)以及腳本所有權(quán)的層次。這意味著,相對(duì)于在解析器上下文內(nèi)實(shí)施的功能,在基于解析器的直接執(zhí)行與vm230執(zhí)行之間的操作不存在差異。采取將腳本轉(zhuǎn)換成vm程序以用于在vm230中執(zhí)行的額外步驟的主要原因是,vm程序的速度可優(yōu)于基于解析器的形式。vm程序還更易于理解并描述線程實(shí)施的實(shí)施方案。
解析器之間的父子關(guān)系和符號(hào)被維持在解析器上下文內(nèi)的事實(shí)意味著,基礎(chǔ)腳本語(yǔ)言可維持分層符號(hào)范圍。具體地說(shuō),如果在子腳本的局部腳本范圍內(nèi)未聲明相同名稱的符號(hào),則子解析器可直接地引用父解析器內(nèi)的符號(hào)。然而,此特征可被停用以避免可能的混淆,因?yàn)?,在?30專利案中描述的抽象中,所有解析器通過(guò)“cloning”祖先解析器動(dòng)態(tài)地創(chuàng)建。這意味著基礎(chǔ)腳本語(yǔ)言的所有解析器都是此祖先解析器的后裔,所述祖先解析器本身在開(kāi)始時(shí)通過(guò)列表1中的詞法分析規(guī)范和列表2中的bnf規(guī)范動(dòng)態(tài)地創(chuàng)建。因此,將祖先解析器范圍用作全局變量的庫(kù),所述全局變量可從所有腳本訪問(wèn)且可在腳本設(shè)計(jì)者需要時(shí)使用??啥x專門初始化腳本,所述腳本設(shè)定此祖先上下文中的所有全局變量的初始值。
在實(shí)施方案中,當(dāng)將經(jīng)編譯的腳本運(yùn)行為vm230中的vm程序時(shí),解析器上下文具有到和來(lái)自vm程序的雙向鏈接,所述vm程序已被加載到vm230中以用于執(zhí)行。
5.1.9.控制特定的結(jié)構(gòu)
在實(shí)施方案中,基礎(chǔ)腳本語(yǔ)言具有特定于控制領(lǐng)域的多個(gè)獨(dú)特功能。雖然這些功能中的一些在本文中的其它地方更詳細(xì)描述,但現(xiàn)將簡(jiǎn)單地描述每一所述功能。
在實(shí)施方案中,數(shù)據(jù)架構(gòu)使用數(shù)據(jù)格式,所述數(shù)據(jù)格式包含與每個(gè)和每一裝置屬性相關(guān)聯(lián)的狀態(tài)字段。此狀態(tài)字段可采用指示“確認(rèn)”的值、指示“未決”的值,或指示“未知”的值。與特定裝置控制器170通信的裝置驅(qū)動(dòng)器166是所述特定裝置的屬性和屬性狀態(tài)的權(quán)威機(jī)構(gòu)。當(dāng)數(shù)據(jù)架構(gòu)中除裝置屬性的權(quán)威機(jī)構(gòu)外的任何部件(例如,gui、解譯器、vm230等)請(qǐng)求對(duì)屬性值的改變時(shí),屬性的狀態(tài)設(shè)定為“未決。”隨后,權(quán)威機(jī)構(gòu)(即,對(duì)應(yīng)于與給定屬性相關(guān)聯(lián)的裝置的裝置驅(qū)動(dòng)器166)以所實(shí)現(xiàn)的值(所述值可能不同或可能并非不同于所請(qǐng)求的值)回復(fù),且屬性的狀態(tài)設(shè)定為“確認(rèn),”指示現(xiàn)實(shí)世界值已設(shè)定為所請(qǐng)求的值。此使用“未決”和“確認(rèn)”狀態(tài)的方法實(shí)現(xiàn)裝置屬性變化在整個(gè)系統(tǒng)上的受良好控制的分布。
在實(shí)施方案中,為改進(jìn)性能,腳本執(zhí)行環(huán)境150維持所有已知裝置屬性的狀態(tài)的內(nèi)部高速緩存。高速緩存中的條目可使用可用函數(shù)(例如,rg_setpropertystate()和rg_getpropertystate())來(lái)創(chuàng)建、更新和讀取。對(duì)于每一裝置屬性,高速緩存包含對(duì)裝置屬性的引用、值和數(shù)據(jù)類型以及狀態(tài)。當(dāng)裝置屬性值被腳本讀取時(shí),所述裝置屬性的值一般將來(lái)自此內(nèi)部高速緩存,使得vm230不必等待來(lái)自裝置驅(qū)動(dòng)器166的響應(yīng)。裝置驅(qū)動(dòng)器166負(fù)責(zé)在每當(dāng)裝置屬性值改變時(shí)調(diào)用函數(shù)(例如,dm_devmgrnfy()),以更新內(nèi)部高速緩存中的裝置屬性值。結(jié)果是內(nèi)部高速緩存中的裝置屬性值一般將不具有“未決”狀態(tài),因?yàn)樗鲅b置屬性值通過(guò)其相應(yīng)的權(quán)威機(jī)構(gòu)(即,相應(yīng)的裝置驅(qū)動(dòng)器166)更新,從而產(chǎn)生“確認(rèn)”狀態(tài)。
必須等待來(lái)自裝置驅(qū)動(dòng)器166的實(shí)際更新以便改變裝置屬性值的內(nèi)部表示的影響是控制系統(tǒng)的特征,所述特征常常對(duì)不習(xí)慣于使用實(shí)時(shí)編程的程序員造成混淆。在標(biāo)準(zhǔn)的編程隱喻中,當(dāng)設(shè)定某一值時(shí),可假定已設(shè)定所述值。然而,在現(xiàn)實(shí)世界的控制系統(tǒng)中,當(dāng)設(shè)定某一值時(shí),可能不能立即獲取所述值,而是僅在命令到達(dá)裝置且裝置按命令操作后才獲取所述值。例如,缺乏經(jīng)驗(yàn)的程序員可寫入腳本,例如下文的腳本,并預(yù)期log()消息將永不被發(fā)送,因?yàn)椤癷f”條件應(yīng)永不被滿足:
相反,在控制系統(tǒng)環(huán)境中,log()消息很可能將被發(fā)送,因?yàn)椤癅thermostat.setpoint=60;”語(yǔ)句到“if”條件被測(cè)試時(shí)不太可能被適當(dāng)?shù)难b置驅(qū)動(dòng)器確認(rèn)(即,“@thermostat.setpoint”的內(nèi)部高速緩存值將很可能仍為70,因此,滿足“if”條件)。這是不熟悉實(shí)時(shí)編程的程序員混淆的源。
有利地,“未決”狀態(tài)的存在為此混淆的源提供解決方案。在基礎(chǔ)腳本語(yǔ)言的實(shí)施方案中,存在可應(yīng)用到裝置屬性的兩個(gè)相異賦值運(yùn)算符:“=”和“:=?!薄?=”賦值運(yùn)算符在本文中可被稱為“assignandwaitwhilepending”運(yùn)算符。如果在以上腳本中的“@thermostat.setpoint=60;”被“@thermostate.setpoint:=60;”替代,則腳本將按預(yù)期操作。具體地說(shuō),log()消息將不被發(fā)送。
每當(dāng)腳本將值賦給裝置屬性且隨后在不久之后引用所述值時(shí),“:=”運(yùn)算符是適合的。為實(shí)施此“assignandwaitwhilepending”運(yùn)算符,實(shí)施vm230的邏輯,使得當(dāng)腳本使用所述運(yùn)算符對(duì)裝置屬性賦值時(shí),所述邏輯將內(nèi)部高速緩存中的裝置屬性的狀態(tài)設(shè)定為“未決,”但不改變內(nèi)部高速緩存中的裝置屬性的值。最終,權(quán)威機(jī)構(gòu)(例如,具有屬性的裝置的裝置驅(qū)動(dòng)器166)將改變內(nèi)部高速緩存中的裝置屬性的值,并將內(nèi)部高速緩存中的狀態(tài)更新為“確認(rèn)?!睂?duì)于以上實(shí)例,“:=”運(yùn)算符可用vm匯編器格式實(shí)施為:
如所說(shuō)明,在load“:=”運(yùn)算符的操作碼后添加標(biāo)簽和跳躍,且jmc操作碼知道所包括的屬性(“@thermostat.setpoint”),因?yàn)樗霾僮鞔a在load后仍在堆棧上。在此情況下,jmc操作碼將使得邏輯在屬性的狀態(tài)仍為“未決”時(shí)封鎖(即,繼續(xù)跳回到標(biāo)簽“l(fā)1”)。換句話說(shuō),語(yǔ)句“@thermostat.setpoint:=60;”的使用使得邏輯等待直到賦值已被確認(rèn),才繼續(xù)執(zhí)行下一語(yǔ)句。最終結(jié)果是用以解決常規(guī)的控制語(yǔ)言中的普遍問(wèn)題的優(yōu)良的解決方案。
根據(jù)實(shí)施方案,基礎(chǔ)腳本語(yǔ)言的另一控制相關(guān)的特征是能夠在語(yǔ)言的句法內(nèi)直接地處理裝置屬性(例如,如在以上實(shí)例中的“@thermostat.setpoint”中)。另外,由于基本數(shù)據(jù)架構(gòu)的和通過(guò)腳本執(zhí)行環(huán)境150在開(kāi)始時(shí)訂閱的模式,基礎(chǔ)腳本語(yǔ)言已知道所引用的屬性的數(shù)據(jù)類型而不需要任何聲明。換句話說(shuō),在運(yùn)行時(shí)間處發(fā)現(xiàn)關(guān)于裝置和其屬性的所有事物,使得不需要任何編輯、編譯或構(gòu)建周期來(lái)進(jìn)行改變。這使得基礎(chǔ)腳本語(yǔ)言以其它語(yǔ)言不用的方式自適應(yīng)。
在實(shí)施方案中,裝置可通過(guò)名稱、id或名稱和id兩者來(lái)引用。因此,以上引用的完整句法可為“@thermostat[deviceid].setpoint?!边@是通過(guò)從gui腳本語(yǔ)言得出的腳本使用的格式。腳本執(zhí)行環(huán)境150(例如,在解析器或vm230內(nèi))的邏輯嘗試通過(guò)以下操作解析所引用的裝置:(1)首先,通過(guò)所述裝置的id(如果存在),以及(2)其次,如果所述失敗,通過(guò)所述裝置的名稱。結(jié)果是腳本可從一個(gè)網(wǎng)關(guān)120復(fù)制到另一網(wǎng)關(guān)120,且即使所復(fù)制的腳本中的裝置id可能為無(wú)效的,如果名稱類似的裝置存在于新網(wǎng)關(guān)120上,則所復(fù)制的腳本也正常地在新網(wǎng)關(guān)120上運(yùn)行。具體地說(shuō),腳本執(zhí)行環(huán)境150將以透明方式將所復(fù)制的腳本中的丟失的id更新為新網(wǎng)關(guān)120上具有與所引用的裝置相同的名稱的第一裝置的id。類似地,如果裝置重命名,則當(dāng)腳本執(zhí)行環(huán)境150(例如,vm230)發(fā)現(xiàn)在執(zhí)行中的腳本中所引用的重命名裝置不存在(即,因?yàn)樗鲅b置已經(jīng)重命名)時(shí),vm230通過(guò)所引用的裝置的id查找新名稱,且如果找到,自動(dòng)地將腳本中的裝置的名稱改變?yōu)樾旅Q。腳本在沒(méi)有中斷的情況下繼續(xù)正常運(yùn)行。特征的此組合通過(guò)自動(dòng)地編輯腳本以使所述腳本適應(yīng)于上面執(zhí)行有所述腳本的當(dāng)前網(wǎng)關(guān)120的特定裝置配置來(lái)使復(fù)雜安裝的設(shè)置變?nèi)菀住?/p>
在實(shí)施方案中,基礎(chǔ)腳本語(yǔ)言支持裝置群組。裝置群組表示為虛擬裝置,所述虛擬裝置可包含任何數(shù)目的物理裝置和/或其它虛擬裝置的集合。裝置群組實(shí)現(xiàn)通用腳本的創(chuàng)建,所述通用腳本在控制上下文中是高度有利的特征。另外,裝置群組使得能夠使用單個(gè)語(yǔ)句(即,單個(gè)賦值運(yùn)算)將值賦給所有裝置群組成員(即,裝置群組內(nèi)的所有物理或虛擬裝置)的屬性。
在實(shí)施方案中,基礎(chǔ)腳本語(yǔ)言提供“trigger”語(yǔ)句,如本文中在其它地方所描述。“trigger”語(yǔ)句是對(duì)裝置屬性值或其它值的邊緣(即,狀態(tài)轉(zhuǎn)變)作出響應(yīng)的控制特定的句法結(jié)構(gòu)。
在實(shí)施方案中,基礎(chǔ)腳本語(yǔ)言用同步形式(正如標(biāo)準(zhǔn)函數(shù)調(diào)用一樣)或異步線程形式通過(guò)關(guān)鍵字“concurrently”的簡(jiǎn)單使用來(lái)統(tǒng)一腳本激活和去激活的概念。關(guān)鍵字“concurrently”創(chuàng)建對(duì)于復(fù)雜的控制系統(tǒng)任務(wù)理想的簡(jiǎn)單但強(qiáng)大的線程隱喻,所述任務(wù)包括并行地并以緊密協(xié)作的方式操作的許多獨(dú)立線程。用于通過(guò)引用或值以同步或異步形式傳遞參數(shù)的語(yǔ)言支持為在控制系統(tǒng)應(yīng)用中常常需要的多種并行性提供廣泛支持,同時(shí)維持使用的簡(jiǎn)單性。
有利地,基礎(chǔ)腳本語(yǔ)言的解譯性質(zhì)與基本vm架構(gòu)的組合提供在存儲(chǔ)器和在控制器130中的較小占用區(qū)域,以及嵌入式和控制應(yīng)用的快速性能,同時(shí)提供快速自適應(yīng)的腳本執(zhí)行環(huán)境150。
5.2.解析json數(shù)據(jù)編碼標(biāo)準(zhǔn)
在實(shí)施方案中,數(shù)據(jù)架構(gòu)使用json標(biāo)準(zhǔn)實(shí)施,以對(duì)所有通信包中的命令和數(shù)據(jù)編碼。因此,數(shù)據(jù)架構(gòu)的所有部件可解析并解譯包含多種信息的json數(shù)據(jù)。為此目的,通用json解析抽象可用于針對(duì)每一不同用途創(chuàng)建解析器。此抽象可基于‘130專利案中的抽象,并利用ut_initjson()、ut_termjson()以及ut_parsejson的api函數(shù)(constcharptrastring、ut_jsoncallbackacallback,長(zhǎng)上下文)。ut_initjson()復(fù)制通過(guò)以下列表4中的json語(yǔ)言規(guī)范創(chuàng)建的通用json解析器:
json解析包裝器用庫(kù)解析器抽象(如在語(yǔ)言規(guī)范中的符號(hào)“<@1:n>”中)來(lái)注冊(cè)單個(gè)插件式函數(shù)。被視為插件1內(nèi)的特殊情況的“n”的各種值如下被符號(hào)化地引用:
鑒于此,為實(shí)施特定的json解析器,僅需將ut_jsoncallback類型的適合的處理程序供應(yīng)給ut_parsejson()。此類處理程序的大部分工作是檢查json內(nèi)的“path”以便提取并處理重要數(shù)據(jù)。因?yàn)榇嬖谠S多不同的解析器(主要在細(xì)節(jié)上而非結(jié)構(gòu)上不同),所以所述解析器無(wú)法在本文中全部描述。替代地,所述技術(shù)將使用單個(gè)解析器來(lái)說(shuō)明:同時(shí)檢查任何json的句法并將json轉(zhuǎn)換成人可讀的形式的json的“美化打印機(jī)?!贝私馕銎骺稍诋a(chǎn)生json處用作交叉檢查。在主要目標(biāo)為句法檢查的情況下,可丟棄人可讀輸出。下文示出用于實(shí)施“美化打印機(jī)”的c源代碼:
在“美化打印機(jī)”實(shí)施中調(diào)用的所有函數(shù)通過(guò)與‘130專利案相關(guān)聯(lián)并在‘130專利案中描述的庫(kù)來(lái)供應(yīng)。本質(zhì)上,代碼記錄“context”中的嵌套(見(jiàn)“pcp->”)并使用此來(lái)縮進(jìn)并格式化輸出,所述輸出在“pcp->string”內(nèi)構(gòu)建。同時(shí),解析器檢查json自身的句法并報(bào)告所述句法中的任何錯(cuò)誤。
當(dāng)本文中描述數(shù)據(jù)架構(gòu)的更專門化的解析器時(shí),可假定所述解析器的實(shí)施根本上類似于“美化打印機(jī),”即使所述解析器的實(shí)施更加專門化且復(fù)雜。
雖然json編碼用于所描述的解析器中,但應(yīng)理解,在基本數(shù)據(jù)架構(gòu)中可通過(guò)替代所描述的解析器來(lái)使用其它編碼。因此,數(shù)據(jù)架構(gòu)中不存在根本上需要json編碼的事物。
5.3.從gui腳本進(jìn)行轉(zhuǎn)換
圖6a說(shuō)明根據(jù)實(shí)施方案的簡(jiǎn)單實(shí)例腳本的腳本gui的外觀。所說(shuō)明的腳本包括“trigger”語(yǔ)句,所述語(yǔ)句在指定日期后,在車道接觸傳感器被激活時(shí),在1.5分鐘的時(shí)段內(nèi)打開(kāi)裝置群組“室外燈”中的所有燈。
腳本gui包括已通過(guò)用戶與腳本gui的交互產(chǎn)生的基本數(shù)據(jù)的視覺(jué)表示。基本數(shù)據(jù)包括gui腳本對(duì)象,所述gui腳本對(duì)象描述gui外觀且將在執(zhí)行之前被轉(zhuǎn)換(例如,通過(guò)腳本轉(zhuǎn)換器212)成呈基礎(chǔ)腳本語(yǔ)言的腳本。在使用json編碼的實(shí)施方案中,圖6a中的gui腳本的經(jīng)json編碼的輸出可如下在列表5中(經(jīng)格式化以易于讀取,且關(guān)于json的與腳本gui本身相關(guān)聯(lián)并被轉(zhuǎn)換過(guò)程忽略的一些方面,為了清晰性而省略):
在列表5中的經(jīng)json編碼的輸出中,在gui外觀與用各種json鍵-值對(duì)表達(dá)的實(shí)際數(shù)據(jù)內(nèi)容之間存在一一對(duì)應(yīng)。應(yīng)清楚,此經(jīng)json編碼的格式可能不適合于直接用作編程語(yǔ)言或用于在解析器內(nèi)直接執(zhí)行。因此,在實(shí)施方案中,將經(jīng)json編碼的輸出轉(zhuǎn)換成可通過(guò)標(biāo)準(zhǔn)解析技術(shù)解析的形式,且所述形式符合普遍施加于經(jīng)設(shè)計(jì)用于機(jī)器執(zhí)行的所有編程語(yǔ)言的語(yǔ)法約束。確切地說(shuō),編程語(yǔ)言語(yǔ)法往往為ll(1)或類似的(例如,lalr(1))以使所述語(yǔ)法易處理用于機(jī)器執(zhí)行。因此,腳本gui輸出本身并非編程語(yǔ)言,且由于通過(guò)基于gui的產(chǎn)生機(jī)制隱含的約束,腳本gui輸出可能不能夠表達(dá)更加復(fù)雜的編程結(jié)構(gòu)。
在實(shí)施方案中,轉(zhuǎn)換過(guò)程用于將表示gui創(chuàng)建的腳本(在本文中簡(jiǎn)稱為“gui腳本”)的輸出轉(zhuǎn)換成基礎(chǔ)腳本語(yǔ)言。此轉(zhuǎn)換過(guò)程可實(shí)施為腳本轉(zhuǎn)換器212。尤其地,腳本gui可表達(dá)基礎(chǔ)腳本語(yǔ)言的小但有用的子集,所述子集經(jīng)設(shè)計(jì)以允許非技術(shù)人員表達(dá)簡(jiǎn)單的腳本行為,例如在以上實(shí)例中的腳本行為。
用于解析數(shù)據(jù)的過(guò)程在本文中的其它地方描述。此相同方法可用于創(chuàng)建實(shí)施腳本轉(zhuǎn)換器212的解析器。在此解析器中,跟蹤數(shù)據(jù)內(nèi)的當(dāng)前路徑和用基礎(chǔ)腳本語(yǔ)言產(chǎn)生輸出構(gòu)成大部分工作。例如,當(dāng)解析器路徑以“:{:sysscript:{:value:{:trigger:{:type”結(jié)束時(shí),如在列表5中,解析器確定所述解析器開(kāi)始在隱含的無(wú)限循環(huán)內(nèi)處理腳本gui“trigger”語(yǔ)句。因此,解析器將推動(dòng)“while(true){,”并將在路徑“:{:sysscript:{:value”結(jié)束時(shí)推動(dòng)另外的“}”以便產(chǎn)生隱含的“while”塊的結(jié)束。在處理程序內(nèi)傳遞到ut_parsejson()的所有其它解析活動(dòng)在結(jié)構(gòu)上類似,但根據(jù)不同的特定語(yǔ)言元素而在細(xì)節(jié)上有所不同。
根據(jù)實(shí)施方案,來(lái)自解析列表5中的經(jīng)json編碼的輸出的解析器的輸出在下文的列表6中得到說(shuō)明。
尤其地,如列表6中示出,已丟棄所有不需要的數(shù)據(jù)架構(gòu)元素,且重要的部分已被轉(zhuǎn)換成基礎(chǔ)腳本語(yǔ)言。另外,gui腳本的名稱(即,“其它測(cè)試腳本”)、gui腳本的id以及gui腳本的描述(gui腳本的“原始”名稱已插在其前方)在基礎(chǔ)語(yǔ)言腳本中保留。
出于進(jìn)一步說(shuō)明的目的,將參考圖6b至圖6g說(shuō)明若干另外的實(shí)例腳本的輸出:
在實(shí)施方案中,執(zhí)行全錯(cuò)誤檢查(例如,通過(guò)腳本轉(zhuǎn)換器212或編譯器220),且報(bào)告在轉(zhuǎn)換過(guò)程中出現(xiàn)的任何錯(cuò)誤。所產(chǎn)生的基礎(chǔ)語(yǔ)言腳本的錯(cuò)誤檢查可以與通過(guò)用于json的“美化打印機(jī)”解析器執(zhí)行的錯(cuò)誤檢查相似的方式執(zhí)行。具體地說(shuō),錯(cuò)誤檢查可包括使用基礎(chǔ)腳本語(yǔ)言的句法構(gòu)建的解析器,而沒(méi)有腳本的實(shí)際執(zhí)行。在實(shí)施方案中,此解析器(例如,通過(guò)編譯器220實(shí)施)還可產(chǎn)生vm輸出以用于可選地加載到vm230中。
尤其地,對(duì)于開(kāi)發(fā)和測(cè)試,能夠執(zhí)行基礎(chǔ)語(yǔ)言腳本而無(wú)需編譯成vm程序的全基礎(chǔ)語(yǔ)言解析器是有用的。然而,出于優(yōu)化目的,vm編譯器220可替代地用于將腳本編譯成可通過(guò)vm230執(zhí)行的vm程序。
5.4.腳本管理器
在實(shí)施方案中,腳本管理器210主要地負(fù)責(zé)在每一網(wǎng)關(guān)120的文件系統(tǒng)內(nèi)存儲(chǔ)并檢索呈基礎(chǔ)腳本語(yǔ)言的腳本(用基礎(chǔ)腳本語(yǔ)言創(chuàng)建或從腳本gui的輸出轉(zhuǎn)換)。每一網(wǎng)關(guān)120的文件系統(tǒng)存儲(chǔ)腳本注冊(cè)表214的永久性本地復(fù)本(例如,在數(shù)據(jù)庫(kù)132中)。
在實(shí)施方案中,腳本管理器210執(zhí)行以下功能中的一個(gè)或多個(gè):
●將從腳本轉(zhuǎn)換器212接收的經(jīng)轉(zhuǎn)換gui腳本保存到腳本注冊(cè)表214;
●將腳本從腳本注冊(cè)表214加載到編譯器220中以用于轉(zhuǎn)換到vm程序和隨后的執(zhí)行;
●從腳本注冊(cè)表214刪除腳本,以響應(yīng)于接收到“刪除”命令(例如,從平臺(tái)110接收到);
●激活和去激活腳本以響應(yīng)于命令(例如,來(lái)自平臺(tái)110和/或其它腳本);
●維持解析器和/或vm程序之間的父子關(guān)系;和/或
●列出并搜索腳本注冊(cè)表214(例如,出于實(shí)用目的)。
5.5.腳本注冊(cè)表
在實(shí)施方案中,腳本在腳本注冊(cè)表214中保存為簡(jiǎn)單的文本文件(例如,擴(kuò)展名為“.syt”)。用于存儲(chǔ)構(gòu)成腳本注冊(cè)表214的腳本的文件系統(tǒng)或數(shù)據(jù)庫(kù)(例如,數(shù)據(jù)庫(kù)132)的特定目錄可為可配置選項(xiàng)。
5.6.編譯器
在實(shí)施方案中,編譯器220將呈基礎(chǔ)腳本語(yǔ)言的腳本編譯成vm程序,所述vm程序可被加載在vm230內(nèi)并在所述vm內(nèi)執(zhí)行。腳本在其被加載到vm230中時(shí)可自動(dòng)地編譯成等效vm程序。編譯過(guò)程可根據(jù)與本文中描述的基礎(chǔ)語(yǔ)言解析器相同的語(yǔ)言規(guī)范來(lái)執(zhí)行。與基礎(chǔ)語(yǔ)言解析器的唯一差異是,編譯器220在任何執(zhí)行之前將全部腳本轉(zhuǎn)換成vm形式,而非在腳本被解析時(shí)執(zhí)行腳本。vm形式的腳本可看起來(lái)與匯編語(yǔ)言中的程序相似,并包括通過(guò)vm230理解的多個(gè)基礎(chǔ)操作碼。下文的列表7說(shuō)明根據(jù)實(shí)施方案的通過(guò)編譯器220輸出的列表6中的腳本(所述腳本轉(zhuǎn)而從列表5中的gui腳本得到)的vm程序:
尤其地,在所說(shuō)明的實(shí)例中,在列表7中表示的vm程序包含原始基礎(chǔ)語(yǔ)言腳本的全部源代碼以作為注釋行。注釋行的前面是分號(hào),所述分號(hào)是vm匯編器的所說(shuō)明實(shí)施方案中的行注釋分隔符。在每一注釋行內(nèi),源代碼的前面是其在源代碼中的行號(hào),如通過(guò)腳本管理器210從腳本注冊(cè)表214加載。這些具有行號(hào)的注釋和源代碼可通過(guò)在腳本執(zhí)行環(huán)境150內(nèi)提供的調(diào)試工具使用。例如,“斷點(diǎn)”可置于vm程序內(nèi)的任何源行上,以便檢查在程序執(zhí)行中在所述點(diǎn)的狀態(tài)。
在實(shí)施方案中,在腳本執(zhí)行環(huán)境150的開(kāi)始期間,基于列表1和列表2中的基礎(chǔ)語(yǔ)言規(guī)范,創(chuàng)建復(fù)制所有其它解析器所依從的第一“原始”解析器,并創(chuàng)建第二編譯器解析器(例如,實(shí)施編譯器220),如下:
以上代碼中的所有函數(shù)調(diào)用都是針對(duì)與基礎(chǔ)抽象相關(guān)聯(lián)的庫(kù)以用于詞法分析和解析,如分別在‘430專利案和‘130專利案中所描述。
尤其地,在加載bnf之后,以上代碼用序列“<@2:”替換序列“<@0:”的所有事件。在實(shí)施方案中,插件零通過(guò)解析器抽象提供并實(shí)際上執(zhí)行對(duì)應(yīng)的操作。當(dāng)用于編譯和句法檢查時(shí),一般不期望實(shí)際地執(zhí)行程序。因此,為防止抽象的插件零調(diào)用的出現(xiàn),所述語(yǔ)言經(jīng)修改以替代地引用插件二。插件二產(chǎn)生適合的vm輸出,而非執(zhí)行操作。對(duì)此插件的引用在代碼中的語(yǔ)句“ps_setplugin(parser,&ma_marlinplugintwox,2)”中被傳遞到解析器抽象。在解析器抽象的形式化中,ma_marlingplugintwox()的實(shí)施可表達(dá)為:
如所說(shuō)明,插件必須進(jìn)行的所有操作是輸出對(duì)應(yīng)于在‘130專利案中詳述的原始“<@0:n>”運(yùn)算符的適合的vm操作碼。
在實(shí)施方案中,插件一(即,ma_marlinpluginonex)負(fù)責(zé)進(jìn)行與插件二類似的操作。然而,插件一輸出通過(guò)列表2中的原始基礎(chǔ)語(yǔ)言規(guī)范中的對(duì)應(yīng)的“<@1:n>”點(diǎn)隱含的適合的vm操作碼。通過(guò)條件和循環(huán)結(jié)構(gòu)隱含的跳轉(zhuǎn)標(biāo)簽的產(chǎn)生和引用通過(guò)以下操作來(lái)處理:跟蹤解析器(類似于json“美化打印機(jī)”的描述)內(nèi)的基礎(chǔ)語(yǔ)言腳本的嵌套深度,并使用當(dāng)前深度來(lái)產(chǎn)生適合于所涉及的跳轉(zhuǎn)的標(biāo)簽號(hào)。標(biāo)簽解析問(wèn)題在兩個(gè)階段中處理。第一階段基于嵌套深度來(lái)符號(hào)化地產(chǎn)生標(biāo)簽和標(biāo)簽引用,而不實(shí)際地解析特定標(biāo)簽(例如,列表7中的l1...l4)。第二階段在對(duì)“kresolversaybyebye”(見(jiàn)‘130專利案)的無(wú)錯(cuò)誤調(diào)用上調(diào)用,并處理這些符號(hào)的基于深度的標(biāo)簽到實(shí)際順序且唯一標(biāo)簽號(hào)的轉(zhuǎn)換,例如,在列表7的最終vm輸出中所說(shuō)明的。
在實(shí)施方案中,在實(shí)現(xiàn)vm編譯器220的“解析程序”函數(shù)(即,ma_marlinresolveronex)中,“kresolverevaluate”和“kresolverassign”代碼實(shí)質(zhì)上為空,因?yàn)榻馕銎髡?jiǎn)單地編譯腳本,而非執(zhí)行腳本。所有其余動(dòng)作受限于“kresolvernoaction”情況,所述情況可如下處理:
在以上代碼中,所調(diào)用的函數(shù)通過(guò)庫(kù)供應(yīng)且可參考‘130專利案和‘430專利案來(lái)理解。
“if(atype==0)”條件的主體實(shí)施基礎(chǔ)語(yǔ)言源行對(duì)vm形式輸出的回應(yīng),且還實(shí)施與處理基礎(chǔ)語(yǔ)言行和塊注釋相關(guān)聯(lián)的邏輯。
“if(atype==1)”條件的主體基于所遇到的各種類型的令牌(例如,字符串、整數(shù)、實(shí)數(shù),布爾型等)來(lái)產(chǎn)生vm“push”操作碼和操作數(shù)。
所描述的解析器和編譯器220的一個(gè)副效應(yīng)是對(duì)基礎(chǔ)語(yǔ)言源腳本的腳本id的開(kāi)始和結(jié)束、腳本參數(shù)以及腳本描述(如果存在)的識(shí)別。此信息由調(diào)用函數(shù)用于在腳本激活期間處理參數(shù)傳遞。
5.7.腳本激活和去激活
在實(shí)施方案中,腳本激活的過(guò)程通過(guò)函數(shù)“su_activatescript()”實(shí)施,所述函數(shù)在下文列表8中的高級(jí)偽代碼中詳述:
在以上的列表8中對(duì)“su_xferparams()”例程的調(diào)用通過(guò)值并通過(guò)引用將參數(shù)從調(diào)用解析器傳遞到子解析器的本地符號(hào)表,使所傳遞的參數(shù)可用于在vm230內(nèi)運(yùn)行的子vm程序。這可通過(guò)以下操作實(shí)施:提取參數(shù)規(guī)范文本,并循環(huán)經(jīng)過(guò)每一參數(shù)以基于所述參數(shù)的前面是否由關(guān)鍵字“value”或“reference”來(lái)處理所述參數(shù)。所傳遞的參數(shù)的實(shí)際值可從調(diào)用中的解析器的執(zhí)行堆棧獲得,因?yàn)樗鰧?shí)際值將已在先前通過(guò)響應(yīng)于“activate”語(yǔ)句而產(chǎn)生的“push”指令被推動(dòng)到所述堆棧上。如果參數(shù)已通過(guò)值傳遞,那么在本地解析器的符號(hào)表中創(chuàng)建新符號(hào),所述新符號(hào)具有在激活的腳本的參數(shù)規(guī)范中指定的名稱,并賦有來(lái)自調(diào)用中的解析器的評(píng)估堆棧的值和數(shù)據(jù)類型。
另一方面,如果參數(shù)已通過(guò)引用傳遞,那么唯一合法的數(shù)據(jù)類型是字符串?dāng)?shù)據(jù)類型,所述數(shù)據(jù)類型必須包含在調(diào)用中的腳本的上下文中所述參數(shù)引用的符號(hào)或?qū)傩缘拿Q。在此情況下,將內(nèi)部范圍中的符號(hào)設(shè)定為數(shù)據(jù)類型“string”并匹配傳入的字符串。然而,另外,針對(duì)所述符號(hào)設(shè)定標(biāo)志“kreferencedsymbol,”使得在vm程序執(zhí)行期間調(diào)用的訪問(wèn)包裝器代碼可透明地檢測(cè)到這是引用并解析它。訪問(wèn)代碼將遞歸地檢測(cè)到具有“kreferencedsymbol”標(biāo)志設(shè)定的符號(hào)被訪問(wèn),并將所述符號(hào)解析成父解析器中的符號(hào)。因?yàn)榇私馕鲞^(guò)程是遞歸的,所以腳本可通過(guò)引用將值傳遞到子腳本,所述子腳本自身已通過(guò)引用從父腳本接收。此解析過(guò)程將從子腳本遞歸地前進(jìn)到任何祖先腳本。
在實(shí)施方案中,直到所有此類子腳本已結(jié)束,才允許父腳本結(jié)束,所述父腳本通過(guò)引用將參數(shù)傳遞到已使用“concurrent”關(guān)鍵字激活的一個(gè)或多個(gè)子腳本。否則,通過(guò)在子腳本的操作期間結(jié)束父腳本,由此使子腳本的操作脫軌,可使得已通過(guò)引用傳遞的參數(shù)無(wú)效。
5.8.虛擬機(jī)
在實(shí)施方案中,最后所有腳本,無(wú)論是以基礎(chǔ)腳本語(yǔ)言寫入還是從通過(guò)腳本gui產(chǎn)生的gui腳本轉(zhuǎn)換的,都通過(guò)vm230執(zhí)行。
5.8.1.vm程序格式
在實(shí)施方案中,經(jīng)編譯的腳本,在本文中稱為“vm程序,”對(duì)應(yīng)于包含腳本的每一行的文本內(nèi)容的字符串的有序列表。例如,在列表7的vm程序中,文本的每個(gè)和每一行,包含僅含注釋或標(biāo)簽的行,為在有序列表中的單獨(dú)的字符串值。每一字符串值可具有與所述字符串值相關(guān)聯(lián)的相關(guān)聯(lián)64位值(實(shí)數(shù)或整數(shù))以作為“標(biāo)記,”以及多個(gè)邏輯標(biāo)志。在實(shí)施方案中,vm230基于平面存儲(chǔ)器模型來(lái)使用“et_stringlist”結(jié)構(gòu)實(shí)施此,所述平面存儲(chǔ)器模型描述于2006年9月5日發(fā)布的且標(biāo)題為“用于管理存儲(chǔ)器的系統(tǒng)和方法(systemandmethodformanagingmemory)”的第7,103,749號(hào)美國(guó)專利案(“‘749專利案”)中,所述專利案通過(guò)引用特此并入本文中。
使用此模型對(duì)字符串列表庫(kù)的訪問(wèn)通過(guò)‘130專利案中的解析器抽象庫(kù)提供。以下描述將基于使用‘749專利案的字符串列表的實(shí)施。雖然可使用替代的實(shí)施,但存在將‘749專利案的字符串列表用作所加載的可執(zhí)行vm程序的基礎(chǔ)表示的多個(gè)原因,包含以下各項(xiàng)中的一個(gè)或多個(gè):
●字符串列表形式提供任意長(zhǎng)度的字符串的列表,每一字符串具有可用于外部代碼所需要的任何目的的相關(guān)聯(lián)的64位標(biāo)記值;
●字符串列表形式支持與每一字符串相關(guān)聯(lián)的邏輯“flags”關(guān)鍵字;
●不管有序列表中的字符串的數(shù)目是多少,字符串列表需要僅單堆存儲(chǔ)器分配。此單個(gè)分配對(duì)于到vm230中的高效加載和卸載是理想的。所有存儲(chǔ)器為連續(xù)(不同于常規(guī)的鏈接列表)的事實(shí)意味著,處理器高速緩存一般更加有效地操作。字符串列表自身可被鏈接,從而創(chuàng)建相關(guān)聯(lián)的字符串列表的集合。鏈接的字符串列表的所述集合可包括加載在vm230中的所有活動(dòng)vm程序;
●字符串列表的“平坦性”使得字符串列表理想的用于經(jīng)過(guò)隊(duì)列,所述隊(duì)列在搶占式線程或不同的過(guò)程之間傳遞復(fù)雜信息。有利地,不需要序列化和去序列化;
●因?yàn)樗凶址荚趩蝹€(gè)存儲(chǔ)器分配內(nèi),所以用于執(zhí)行vm程序的程序計(jì)數(shù)器可適用api調(diào)用實(shí)施為僅到單個(gè)存儲(chǔ)器分配中的字符串偏移;
●字符串列表可通過(guò)經(jīng)設(shè)計(jì)以輔助腳本開(kāi)發(fā)人員的相關(guān)聯(lián)的調(diào)試代碼來(lái)容易地操控和/或顯示。例如,單步執(zhí)行和斷點(diǎn)變得易于在此框架內(nèi)實(shí)施;
●字符串列表還在代碼的其余部分上廣泛地使用以用于其它目的。例如,符號(hào)表、注冊(cè)表搜索以及多個(gè)其它功能可實(shí)施為字符串列表。此共同性簡(jiǎn)化整體程序大小和復(fù)雜性;和/或
●類似于解析器和詞法分析抽象,字符串列表抽象是成熟的且得到良好測(cè)試的,由此節(jié)省相當(dāng)大的開(kāi)發(fā)和調(diào)試努力。
5.8.2.加載vm程序
待在vm230中運(yùn)行的腳本可首先通過(guò)編譯器220編譯成vm形式(例如,在所描述的實(shí)施方案中,被稱為“vm程序”的字符串列表)。腳本隨后被激活,例如,如列表8中所描述。在執(zhí)行vm程序時(shí)的最后步驟是用傳遞為參數(shù)的適合的選項(xiàng)調(diào)用“ma_runmarlin()?!比Q于配置設(shè)定,ma_runmarlin()直接地在解析器內(nèi)執(zhí)行程序(例如,用于測(cè)試/調(diào)試),或通常通過(guò)加載到vm230中執(zhí)行程序(同時(shí)維持到相關(guān)聯(lián)的解析器的鏈接,例如,以使用符號(hào)表)。
在本文中實(shí)施為“ma_marlinvmprogram”的加載過(guò)程首先經(jīng)過(guò)各種字符串,檢查每一行上的操作碼(如果存在),并將操作碼轉(zhuǎn)換成存儲(chǔ)在相關(guān)聯(lián)的“flags”關(guān)鍵字中的二進(jìn)制值,使得,在執(zhí)行期間,不再需要字符串比較以便確定操作碼。
每一ma_marlinvmprogram實(shí)例與當(dāng)前活動(dòng)的且在vm230內(nèi)運(yùn)行的所有其它ma_marlinvmprogram實(shí)例的鏈鏈接。vm程序的執(zhí)行通過(guò)添加到ma_marlinvmprogram實(shí)例的此鏈接列表來(lái)開(kāi)始。
默認(rèn)地,將初始程序計(jì)數(shù)器設(shè)定為ma_marlinvmprogram實(shí)例中的第一字符串,即,主腳本的起始,所述主腳本的起始始終是文件中的第一個(gè)。在作為稍后在vm程序的文本中聲明的靜態(tài)局部子腳本的腳本開(kāi)始的情況下,程序計(jì)數(shù)器初始化為子腳本的起始,如在列表8中所描述。從此點(diǎn)開(kāi)始,腳本通過(guò)對(duì)來(lái)自vm過(guò)程的主循環(huán)的“ma_stepmarlinvm()”函數(shù)的連續(xù)調(diào)用,以一次一個(gè)操作碼的方式與所有其它腳本并行地執(zhí)行。
5.8.3.定義的vm操作碼
在實(shí)施方案中,vm230可支持以下操作碼的一個(gè)或多個(gè):
5.8.4.vm機(jī)編程模型
在實(shí)施方案中,vm230具有編程模型,所述編程模型具有單個(gè)評(píng)估堆棧。所有操作可涉及評(píng)估堆棧的頂部少量元素,所述評(píng)估堆棧表現(xiàn)得像關(guān)于算術(shù)運(yùn)算的逆波蘭計(jì)算器。堆棧的每一元素可具有基礎(chǔ)數(shù)據(jù)類型中的任何類型的值或?yàn)槲粗?。某些操作碼預(yù)期特定的數(shù)據(jù)類型,而其它操作碼將恰當(dāng)?shù)夭僮鞫还芏褩V械臄?shù)據(jù)類型。所有基礎(chǔ)算術(shù)和邏輯運(yùn)算都通過(guò)‘130專利案中的解析器抽象提供(通過(guò)插件零)。因此,所述運(yùn)算在ma_stepprogram()內(nèi)的實(shí)施通過(guò)調(diào)用庫(kù)api的ps_evaluation()函數(shù)來(lái)完成。
在實(shí)施方案中,所允許的僅非堆棧運(yùn)算是到或來(lái)自符號(hào)或?qū)傩缘倪\(yùn)算,所述符號(hào)或?qū)傩缘拿Q必須作為字符串推動(dòng)到堆棧上。
5.8.5.運(yùn)行vm程序
在實(shí)施方案中,頂層ma_stepmarlinvm()函數(shù)調(diào)用ma_stepprogram()來(lái)經(jīng)過(guò)所加載的ma_marlinvmprogram實(shí)例的列表,所述ma_stepprogram()將執(zhí)行“時(shí)隙”給予通過(guò)每一ma_marlinvmprogram表示的vm程序。ma_stepprogram()函數(shù)是執(zhí)行實(shí)際執(zhí)行的函數(shù)。因此,調(diào)用鏈對(duì)于vm環(huán)境非常淺。ma_stepprogram()函數(shù)現(xiàn)將通過(guò)將其邏輯分成不同的描述的集合來(lái)描述,所述不同的描述中的每一個(gè)有效地實(shí)施在每一執(zhí)行步驟中遇到的vm操作碼中的一個(gè)。
在每一次進(jìn)入ma_stepprogram()時(shí),初始邏輯執(zhí)行循環(huán),從字符串標(biāo)志提取操作碼(如果存在),并跳過(guò)沒(méi)有操作碼的任何行(例如,其中通過(guò)字符串標(biāo)志表示的操作碼等于零的行,表示例如注釋行或具有僅標(biāo)簽的行)。
如果操作碼是通過(guò)基本解析器抽象(見(jiàn)表1)提供的操作碼,那么所述操作碼通過(guò)對(duì)ps_evaluation()的調(diào)用來(lái)實(shí)施,因?yàn)楸匾牟僮鲾?shù)將已被推動(dòng)到評(píng)估堆棧上。
在實(shí)施方案中,push操作碼采用各種形式的單個(gè)操作數(shù)。在實(shí)施方案中,push操作碼是在于頂部少數(shù)堆棧元素上調(diào)用另一操作碼之前通過(guò)其使所有數(shù)據(jù)值和引用到達(dá)評(píng)估堆棧上的操作碼。
在實(shí)施方案中,push操作碼將前面為“#”字符的任何操作數(shù)視為常量數(shù)值,并將適合的值和數(shù)據(jù)類型推動(dòng)到堆棧上以作為新頂部元素(即,s[0])。符號(hào)“#true”、“#false”以及“#unknown”產(chǎn)生適合的值。否則,數(shù)值令牌格式與在基礎(chǔ)腳本語(yǔ)言中指定的那些格式(見(jiàn)例如,列表1)相同。數(shù)值令牌格式使用用于相關(guān)聯(lián)的解析器的注冊(cè)詞法分析器來(lái)識(shí)別,并被轉(zhuǎn)換成適合的二進(jìn)制堆棧值和數(shù)據(jù)類型。未能識(shí)別push操作數(shù)可導(dǎo)致“unknown”值被推動(dòng)到堆棧上,以及可選的錯(cuò)誤報(bào)告。
在實(shí)施方案中,在首先對(duì)任何嵌入的換碼字符進(jìn)行解碼之后,以字符串引號(hào)開(kāi)始的push操作數(shù)被推動(dòng)到評(píng)估堆棧上以作為字符串??墒褂猛ㄟ^(guò)c語(yǔ)言支持的換碼字符的相同的約定。
在實(shí)施方案中,以“@”開(kāi)始的push操作數(shù)可被視為裝置屬性引用,所述裝置屬性的值可通過(guò)調(diào)用dm_getdeviceproperty()函數(shù)來(lái)獲得。dm_getdeviceproperty()函數(shù)經(jīng)由裝置管理器抽象層162讀取裝置屬性的值,并返回所讀取的值。
在實(shí)施方案中,直接地引用符號(hào)的push操作數(shù)前面沒(méi)有任何特殊字符,且導(dǎo)致評(píng)估字符并將字符的等效值推動(dòng)到評(píng)估堆棧上。這執(zhí)行符號(hào)標(biāo)志“kreferencedsymbol”以便處理通過(guò)引用傳遞的參數(shù)。如果無(wú)法找到所引用的符號(hào),那么將堆棧的頂部設(shè)定為“unknown,”且可報(bào)告錯(cuò)誤。vm230可包括邏輯(例如,使用字符串標(biāo)志位),所述邏輯用以確保錯(cuò)誤僅在錯(cuò)誤對(duì)于vm程序中的任何給定指令第一次出現(xiàn)時(shí)記錄,以便避免錯(cuò)誤雪崩。
在實(shí)施方案中,jmc操作碼負(fù)責(zé)實(shí)施基礎(chǔ)腳本語(yǔ)言的各種循環(huán)和條件語(yǔ)句的大部分邏輯。jmc操作碼采用兩個(gè)操作數(shù):(i)字符串,所述字符串指定其將實(shí)施的特定類型的邏輯(例如,“if”、“trigger”、“while、”“every”、“when”);(ii)標(biāo)簽,如果不滿足邏輯,則跳轉(zhuǎn)到所述標(biāo)簽。
在實(shí)施方案中,jmc操作碼利用與字符串元素相關(guān)聯(lián)的多個(gè)標(biāo)志位(表示行)以便維持狀態(tài)。此類標(biāo)志的實(shí)例包含:
●“kwaitingforcompletion:”例如,用于“every”語(yǔ)句的實(shí)施中。第一次遇到“every”語(yǔ)句時(shí),此標(biāo)志將為清除的。jmc邏輯是,如果s[0]的值為“unknown,”那么執(zhí)行無(wú)條件跳轉(zhuǎn)。否則,提取s[0]的整數(shù)或?qū)崝?shù)值并將所述值添加到當(dāng)前時(shí)間(作為雙精度日期),將字符串標(biāo)記設(shè)定為結(jié)果,針對(duì)字符串設(shè)定“kwaitingforcompletion”標(biāo)志,且通過(guò)將“stepon”設(shè)定為“false”來(lái)禁止程序計(jì)數(shù)器的前進(jìn)。因此,在下一次將時(shí)隙給予vm程序時(shí),程序計(jì)數(shù)器將再次處于jmc指令處,但這次將針對(duì)字符串設(shè)定“kwaitingforcompletion?!彼鲞壿媽⒈容^當(dāng)前時(shí)間與保存在標(biāo)記中的最后時(shí)間,且如果當(dāng)前時(shí)間較小,那么邏輯將跳轉(zhuǎn)到指定標(biāo)簽(通過(guò)設(shè)定程序計(jì)數(shù)器)。當(dāng)經(jīng)過(guò)所述時(shí)段時(shí),邏輯清除“kwaitingforcompletion”標(biāo)志,且“every”循環(huán)將在下一遍次時(shí)重復(fù)。
●“previoustrigstate”和“knotthefirsttrigpass:”例如,用于“trigger”語(yǔ)句的實(shí)施中。jmc邏輯是,如果s[0]的值為“unknown,”那么執(zhí)行無(wú)條件跳轉(zhuǎn)。否則,如果未設(shè)定“knotthefirsttrigpass”標(biāo)志,那么邏輯設(shè)定“knotthefirsttrigpass”標(biāo)志并使程序計(jì)數(shù)器前進(jìn)到下一語(yǔ)句。如果s[0]的值為零(即,假)或其設(shè)定并非與“kprevioustrigstate”標(biāo)志的設(shè)定不同,那么邏輯按需要設(shè)定“kprevioustrigstate”標(biāo)志,并將所述標(biāo)志視為無(wú)條件跳轉(zhuǎn)。否則,邏輯通過(guò)使程序計(jì)數(shù)器前進(jìn)到下一語(yǔ)句來(lái)執(zhí)行條件主體。如果“trigger”語(yǔ)句包含“else”子句,那么“else”子句的標(biāo)簽之后緊跟“not”操作碼,且隨后緊跟另一jmc操作碼(通過(guò)編譯器220產(chǎn)生)。此否定的結(jié)果是,當(dāng)值在與觸發(fā)所述觸發(fā)語(yǔ)句本身的條件主體的方向相反的方向上轉(zhuǎn)變時(shí),“else”子句的第二jmc將觸發(fā)執(zhí)行。
在實(shí)施方案中,“if、”“if-else、”“elseif”以及“while”邏輯所需的動(dòng)作簡(jiǎn)單地為s[0]的值的結(jié)果。使用“stepon”的邏輯標(biāo)志來(lái)禁止程序計(jì)數(shù)器的前進(jìn)促進(jìn)線程行為,而不影響所有其它vm程序的并行執(zhí)行。針對(duì)必須處理并行性的其它操作碼重復(fù)此模式。
在實(shí)施方案中,“when”邏輯在適當(dāng)位置循環(huán),直到條件變成真,由此阻斷另外的腳本前進(jìn)。因此,“when”邏輯與“if”或“trigger”邏輯不同,不同之處在于,所述“when”邏輯阻斷當(dāng)前腳本內(nèi)的所有執(zhí)行直到滿足條件。
在腳本gui的實(shí)施方案中,“trigger”語(yǔ)句始終作為腳本中的第一語(yǔ)句出現(xiàn),并具有隱含的無(wú)限外部循環(huán)。因此,“when”和“trigger”語(yǔ)句的語(yǔ)義呈現(xiàn)為類似的。然而,在基礎(chǔ)腳本語(yǔ)言內(nèi),“when”和“trigger”語(yǔ)句可在腳本內(nèi)的任何地方且多次出現(xiàn)。并且,不同于經(jīng)由腳本gui的實(shí)施方案創(chuàng)建的gui腳本,trigger語(yǔ)句可具有可選的“else”條件。因此,“trigger”與“when”之間的語(yǔ)義差異是清晰的。
在實(shí)施方案中,jmp操作碼執(zhí)行到目標(biāo)標(biāo)簽的無(wú)條件跳轉(zhuǎn),所述目標(biāo)標(biāo)簽被指定為jmp操作碼的操作數(shù)。第一次遇到j(luò)mp操作數(shù)時(shí),邏輯掃描腳本以尋找指定標(biāo)簽。當(dāng)找到指定標(biāo)簽時(shí),邏輯將對(duì)應(yīng)的偏移(即,程序計(jì)數(shù)器值)存放在字符串標(biāo)記中。因此,邏輯不必在任何隨后的遍次上重新掃描腳本,從而提供大量的時(shí)間優(yōu)化。
在實(shí)施方案中,call操作碼調(diào)用內(nèi)置函數(shù)或程序。call操作碼僅需要一個(gè)操作數(shù),即,“opcount,”所述“opcount”是實(shí)際傳遞的參數(shù)的數(shù)目。一些函數(shù)可接受可變數(shù)目的參數(shù)。當(dāng)遇到函數(shù)或程序名稱時(shí),將所述函數(shù)或程序名稱作為字符串推動(dòng)到堆棧上,且隨后有序地將參數(shù)中的每一個(gè)推動(dòng)到堆棧上,或作為參數(shù)表達(dá)式賦值的結(jié)果而在適當(dāng)位置結(jié)束。因此,call操作碼發(fā)現(xiàn)函數(shù)或程序的名稱被稱為s[opcount]+1,并調(diào)用所述函數(shù)或程序,傳遞“opcount。”所述函數(shù)或程序?qū)⒄业剿龊瘮?shù)或程序在堆棧上接受的所有參數(shù),執(zhí)行函數(shù)或程序的邏輯,并在堆棧上在s[opcount]+1處替代函數(shù)名稱返回結(jié)果(或“unknown,”如果是程序的話)。隨后將所有參數(shù)彈出堆棧。
在實(shí)施方案中,load操作碼的等效于賦值的操作類似于對(duì)解析器抽象解析程序kresolverassign()的調(diào)用。load操作碼不采用操作碼,并預(yù)期s[0]為待賦的值且s[1]為包含將值所賦給的符號(hào)或?qū)傩缘拿Q的字符串。正如push操作碼一樣,load操作碼遵守“kreferencedsymbol”標(biāo)志,為“reference”參數(shù)提供支持。并且,類似于push操作碼,load操作碼使用dm_setdeviceproperty()函數(shù)來(lái)設(shè)定屬性,所述函數(shù)導(dǎo)致經(jīng)由裝置管理器抽象層162來(lái)寫入值。
在實(shí)施方案中,ret操作碼通過(guò)從vm230卸載vm程序并去激活vm程序來(lái)結(jié)束當(dāng)前vm程序的執(zhí)行。vm程序的相關(guān)聯(lián)解析器可保留在存儲(chǔ)器中,使得較高級(jí)代碼和調(diào)試器實(shí)用程序可仍在處理解析器和符號(hào)表之前檢查符號(hào)表的狀態(tài)。具有活動(dòng)相關(guān)的終止在包括pass-by-reference參數(shù)時(shí)受到約束。
在實(shí)施方案中,acts操作碼同步地設(shè)定并運(yùn)行指定的子vm程序,使得父vm程序在移動(dòng)到下一指令之前必須等待結(jié)束。當(dāng)子vm程序已開(kāi)始時(shí),acts指令針對(duì)父vm程序中的當(dāng)前字符串設(shè)定“kwaitingforcompletion”標(biāo)志,并禁止程序計(jì)數(shù)器的前進(jìn)。對(duì)于子vm程序,設(shè)定“kwaitingtillcompletion”和“knestedinvoke”標(biāo)志,使得,當(dāng)子vm程序結(jié)束時(shí),子vm程序?qū)⒍ㄎ桓竩m程序并清除用于程序計(jì)數(shù)器指令的“kwaitingforcompletion?!备竩m程序?qū)⒃谑谟杵涞拿恳浑S后的vm時(shí)隙上固定在同一程序計(jì)數(shù)器處,直到“kwaitingforcompletion”標(biāo)志已被清除。此邏輯允許以類似于在同一線程內(nèi)的函數(shù)調(diào)用的方式處理子腳本。
在實(shí)施方案中,acta操作碼是vm230內(nèi)的線程行為的基礎(chǔ),因?yàn)樗鯽cta操作碼提供開(kāi)始自主并行過(guò)程的方法。acta操作碼設(shè)定并運(yùn)行子vm程序,如針對(duì)腳本激活所描述。當(dāng)子vm程序已開(kāi)始時(shí),acta指令使程序計(jì)數(shù)器前進(jìn),而不針對(duì)當(dāng)前字符串設(shè)定“kwaitingforcompletion”標(biāo)志。對(duì)于子vm程序,僅設(shè)定“knestedinvoke”標(biāo)志,使得,當(dāng)子vm程序結(jié)束時(shí),邏輯知道其不必定位父vm程序以清除“kwaitingforcompletion”標(biāo)志。
在實(shí)施方案中,dact操作碼去激活在指令中指定的腳本名稱。
在實(shí)施方案中,當(dāng)堆棧需要彈出以便避免堆棧溢流時(shí),通過(guò)編譯器220產(chǎn)生pop操作碼。大部分vm操作執(zhí)行其自身的堆棧維護(hù)。因此,一般不需要明確的pop操作碼。然而,涉及跳轉(zhuǎn)的一些復(fù)雜行為可需要明確的pop指令來(lái)保持事情順利。
在實(shí)施方案中,paws操作碼實(shí)施“pause”語(yǔ)句,并接受指定所傳遞的堆棧參數(shù)的數(shù)目的數(shù)值操作數(shù)(類似于call操作碼)。在實(shí)施方案中,始終存在兩個(gè)參數(shù)。paws操作碼的操作包括從堆棧提取乘數(shù)和時(shí)間單位字符串,將其乘積添加到當(dāng)前時(shí)間,并將相加的結(jié)果保存到字符串標(biāo)記中,同時(shí)設(shè)定相關(guān)聯(lián)的“kwaitingforcompletion”標(biāo)志并禁止程序計(jì)數(shù)器的前進(jìn)。與“every”語(yǔ)句很像,paws操作碼將禁止程序計(jì)數(shù)器的前進(jìn),直到已經(jīng)過(guò)指定時(shí)間段,此時(shí)“kwaitingforcompletion”標(biāo)志被清除且程序計(jì)數(shù)器再次開(kāi)始前進(jìn)。此實(shí)施的線程友好性是在實(shí)施方案中“pause”語(yǔ)句不實(shí)施為內(nèi)置函數(shù)調(diào)用的原因。
6.裝置管理器
在實(shí)施方案中,每一網(wǎng)關(guān)120包括裝置管理器160,所述裝置管理器提供廣泛多種插件式軟件驅(qū)動(dòng)器166,所述軟件驅(qū)動(dòng)器中的每一個(gè)可向裝置管理器160動(dòng)態(tài)地注冊(cè)并符合指定驅(qū)動(dòng)器接口。每一驅(qū)動(dòng)器166可能或可能不對(duì)應(yīng)于可用硬件裝置控制器170,且經(jīng)設(shè)計(jì)以使用傳輸層或協(xié)議來(lái)通信。多個(gè)驅(qū)動(dòng)器166的可用性實(shí)現(xiàn)異構(gòu)系統(tǒng)的創(chuàng)建,所述異構(gòu)系統(tǒng)能夠跨越多個(gè)傳輸層和協(xié)議與廣泛多種不同裝置類型通信。能夠經(jīng)由特定傳輸層通信的可用插件式驅(qū)動(dòng)器166的集合可按需要與對(duì)應(yīng)的硬件控制器170組合以處理所有類型的控制系統(tǒng)要求,而不需要托付于單個(gè)基本數(shù)據(jù)架構(gòu)。
在實(shí)施方案中,驅(qū)動(dòng)器層164確保個(gè)別的驅(qū)動(dòng)器166不需要知道數(shù)據(jù)如何在數(shù)據(jù)架構(gòu)內(nèi)存儲(chǔ)并被操控的細(xì)節(jié)。具體地說(shuō),驅(qū)動(dòng)器層164使用可通過(guò)系統(tǒng)模式配置的可動(dòng)態(tài)編程的數(shù)據(jù)驅(qū)動(dòng)的映射接口,在通過(guò)數(shù)據(jù)架構(gòu)使用的那些裝置屬性值、名稱、縮放、格式化以及類型與通過(guò)每一驅(qū)動(dòng)器166在內(nèi)部使用的那些裝置屬性值、名稱、縮放、格式化以及類型之間轉(zhuǎn)換裝置屬性值、名稱、縮放、格式化以及類型。這允許驅(qū)動(dòng)器166以數(shù)據(jù)格式不可知方式插入到裝置管理器160中,從而使得此類驅(qū)動(dòng)器166相比于常規(guī)方法相對(duì)較快地被寫入和測(cè)試。驅(qū)動(dòng)器166基于傳輸協(xié)議和/或裝置自由地使用內(nèi)部表示,并忽略將這些內(nèi)部表示轉(zhuǎn)換成數(shù)據(jù)架構(gòu)的數(shù)據(jù)格式或從所述數(shù)據(jù)格式轉(zhuǎn)換出這些內(nèi)部表示所必需的活動(dòng)。
在實(shí)施方案中,模式在網(wǎng)關(guān)120啟動(dòng)時(shí)從平臺(tái)110取出。因此,在平臺(tái)110處的模式的修改可被傳播到訂閱平臺(tái)110的任何數(shù)目的網(wǎng)關(guān)120。定義驅(qū)動(dòng)器層164的模式可包括用經(jīng)解譯的適配器語(yǔ)言的“片段”寫入的指令,所述適配器語(yǔ)言是基礎(chǔ)腳本語(yǔ)言的全包含子集。
在實(shí)施方案中,裝置管理器160在裝置控制器170與網(wǎng)關(guān)120的部件之間提供雙向通信。裝置管理器160可從腳本執(zhí)行環(huán)境150(例如,通過(guò)由vm230執(zhí)行的直接函數(shù)調(diào)用)直接地接收裝置相關(guān)的命令,或由于對(duì)在網(wǎng)關(guān)120訂閱(例如,經(jīng)由包括控制器130和通信層140的通信路徑,但不包括腳本執(zhí)行環(huán)境150)的數(shù)據(jù)中發(fā)生的對(duì)數(shù)據(jù)(例如,裝置屬性)的更新而間接地接收裝置相關(guān)的命令。數(shù)據(jù)架構(gòu)中的數(shù)據(jù)的(例如,裝置屬性的)改變可源自界面114的gui,或源自腳本執(zhí)行環(huán)境150,所述腳本執(zhí)行環(huán)境運(yùn)行為平臺(tái)110上的遠(yuǎn)程過(guò)程,運(yùn)行為本地網(wǎng)關(guān)120的控制器130上的本地過(guò)程,和/或運(yùn)行為遠(yuǎn)程網(wǎng)關(guān)120的控制器130上的遠(yuǎn)程過(guò)程。
用于控制裝置的傳輸層和協(xié)議的豐富和連續(xù)演進(jìn)已禁止家庭自動(dòng)化中的進(jìn)展。具體地說(shuō),創(chuàng)建可與這些層和協(xié)議中的全部通信同時(shí)保持便宜且易于使用的系統(tǒng)是壓倒性的任務(wù)。因此,在實(shí)施方案中,裝置管理器160提供便宜且完全模塊化的硬件平臺(tái),裝置模塊可插入所述平臺(tái)以用于與每一特定的傳輸層通信;以及匹配的軟件架構(gòu),所述軟件架構(gòu)簡(jiǎn)化對(duì)用于不同傳輸協(xié)議的多個(gè)驅(qū)動(dòng)器的維護(hù)。
在實(shí)施方案中,裝置管理器160使得多個(gè)不同驅(qū)動(dòng)器166能夠通過(guò)api插入到驅(qū)動(dòng)器層164中。驅(qū)動(dòng)器166通過(guò)驅(qū)動(dòng)器層164與基礎(chǔ)架構(gòu)部件的其余部分的約定和數(shù)據(jù)需要隔離,所述驅(qū)動(dòng)器層包括數(shù)據(jù)驅(qū)動(dòng)的適配器語(yǔ)言,所述適配器語(yǔ)言在值在任一方向上傳遞時(shí)被動(dòng)態(tài)地調(diào)用(例如,以改變屬性名稱、格式化、縮放、類型以及其它方面),使得驅(qū)動(dòng)器層164沒(méi)有一側(cè)知道在驅(qū)動(dòng)器層164的另一側(cè)上正發(fā)生什么。這意味著每一驅(qū)動(dòng)器166可獨(dú)立地存在且從不需要在系統(tǒng)的其它方面改變時(shí)發(fā)生改變,從而促進(jìn)用于廣泛范圍的傳輸協(xié)議的驅(qū)動(dòng)器的快速創(chuàng)建,而對(duì)現(xiàn)有設(shè)施或架構(gòu)沒(méi)有影響。同樣地,較寬的基礎(chǔ)架構(gòu)部件(例如,數(shù)據(jù)架構(gòu)、腳本執(zhí)行環(huán)境150等)不需要改變以適應(yīng)驅(qū)動(dòng)器的改變??赡苄枰憫?yīng)于在驅(qū)動(dòng)器層164的一側(cè)或兩側(cè)上的改變而做出的唯一改變是模式定義的更新(例如,在平臺(tái)110上的數(shù)據(jù)文件中表示)。這實(shí)現(xiàn)在驅(qū)動(dòng)器層164的兩側(cè)上的獨(dú)立演進(jìn)。
在實(shí)施方案中,裝置管理器160經(jīng)實(shí)施以具有或支持以下屬性中的一個(gè)或多個(gè):
●將不變接口提供給所有驅(qū)動(dòng)器166,所述不變接口防止每一驅(qū)動(dòng)器166必須考慮通過(guò)數(shù)據(jù)架構(gòu)使用的協(xié)議和表示;
●將不變接口提供給網(wǎng)關(guān)120,所述不變接口防止網(wǎng)關(guān)120的任何其它部件必須考慮任何給定驅(qū)動(dòng)器166或傳輸層的獨(dú)特需要;
●提供適配器編程語(yǔ)言,所述適配器編程語(yǔ)言是所公開(kāi)的基礎(chǔ)腳本語(yǔ)言的全包含子集,且所述適配器編程語(yǔ)言可訪問(wèn)基礎(chǔ)腳本語(yǔ)言的內(nèi)置函數(shù)中的一個(gè)或多個(gè)或大部分以便產(chǎn)生映射。有利地,此共同性使集成人員和開(kāi)發(fā)人員的學(xué)習(xí)曲線最小化。另外,映射函數(shù)可在平臺(tái)110上的模式內(nèi)定義,且可為數(shù)據(jù)驅(qū)動(dòng)且自適應(yīng)的。用適配器語(yǔ)言寫入并實(shí)施驅(qū)動(dòng)器層164的程序在本文中可被稱為“片段;”
●適配器語(yǔ)言利用與基礎(chǔ)腳本語(yǔ)言相同的裝置引用令牌結(jié)構(gòu);
●提供可編寫腳本驅(qū)動(dòng)器層164,所述可編寫腳本驅(qū)動(dòng)器層根據(jù)在平臺(tái)110上的模式內(nèi)指定的映射,透明地并高效地更改層164上的屬性值、類型、范圍、名稱等,以適應(yīng)于每一驅(qū)動(dòng)器166。此柔性數(shù)據(jù)驅(qū)動(dòng)的驅(qū)動(dòng)器層164跨越裝置管理器160雙向地執(zhí)行所有格式和名稱改變,使得每一側(cè)都不需要知道另一側(cè)如何操作或另一側(cè)需要的數(shù)據(jù)格式;
●所有映射和片段在網(wǎng)關(guān)120的啟動(dòng)期間從平臺(tái)110上的模式檢索,且平臺(tái)110上的模式的改變直接地在網(wǎng)關(guān)120上更新,而沒(méi)有與映射所述片段相關(guān)聯(lián)的構(gòu)建周期,由此使得裝置管理器160高度自適應(yīng);
●跨越裝置管理器160的屬性的映射通過(guò)片段執(zhí)行,所述片段即,用適配器編程語(yǔ)言寫入的程序;
●為接口提供格式化數(shù)據(jù)架構(gòu)的流的能力以便允許腳本gui、其它云過(guò)程和/或獨(dú)立的腳本執(zhí)行環(huán)境150讀取并寫入裝置屬性,而不管驅(qū)動(dòng)器;
●將直接api連接提供到在vm230中執(zhí)行的腳本以便實(shí)現(xiàn)最大性能;
●能夠通過(guò)使用標(biāo)準(zhǔn)化數(shù)據(jù)模型和基于驅(qū)動(dòng)器的路由而以完全集成(單過(guò)程)或遠(yuǎn)程腳本/控制(多過(guò)程)的模式操作;
●能夠注冊(cè)用于各種傳輸協(xié)議的多個(gè)同時(shí)順從的插件式驅(qū)動(dòng)器166,且隨后,自動(dòng)地使裝置控制器170與驅(qū)動(dòng)器166相關(guān)聯(lián)以用于控制裝置控制器170的目的。
●每一裝置屬性包括無(wú)序的已命名鍵-值對(duì)和狀態(tài),所述關(guān)鍵字-值對(duì)和狀態(tài)允許在整個(gè)數(shù)據(jù)架構(gòu)上的改變的控制器傳播;
●支持未知屬性值和不可達(dá)的裝置;
●易于使用的驅(qū)動(dòng)器接口,所述接口對(duì)驅(qū)動(dòng)器166隱藏?cái)?shù)據(jù)架構(gòu)需要,同時(shí)簡(jiǎn)化驅(qū)動(dòng)器的編程模型;
●標(biāo)準(zhǔn)化裝置發(fā)現(xiàn)過(guò)程,所述過(guò)程允許驅(qū)動(dòng)器166動(dòng)態(tài)地注冊(cè)并公布所連接的裝置;
●驅(qū)動(dòng)器166可在單獨(dú)的線程/過(guò)程中運(yùn)行,由此允許合法的驅(qū)動(dòng)器被包裝并集成到裝置管理器160中;
●能夠添加與特定傳輸層相關(guān)聯(lián)的自定義驅(qū)動(dòng)器166;
●能夠創(chuàng)建虛擬裝置和/或執(zhí)行高級(jí)路由或控制行為;
●通過(guò)裝置名稱和/或裝置識(shí)別符進(jìn)行的裝置解析;
●能夠通過(guò)對(duì)表示多個(gè)裝置的群組的對(duì)應(yīng)的屬性的單次賦值來(lái)針對(duì)多個(gè)裝置設(shè)定屬性;
●完全支持?jǐn)?shù)據(jù)架構(gòu)所需的所有行為和協(xié)議;
●能夠注冊(cè)控制其它網(wǎng)關(guān)120的驅(qū)動(dòng)器166,由此實(shí)現(xiàn)用于較大項(xiàng)目的分布式子系統(tǒng)的分層系統(tǒng)的創(chuàng)建;
●一個(gè)或多個(gè)api,所述api用以簡(jiǎn)化新驅(qū)動(dòng)器166的創(chuàng)建;
●整個(gè)驅(qū)動(dòng)器接口由三個(gè)回調(diào)函數(shù)組成;和/或
●提供通用驅(qū)動(dòng)器(ud)抽象層;相關(guān)聯(lián)的物理到邏輯基礎(chǔ)架構(gòu),所述基礎(chǔ)架構(gòu)用以將物理裝置的屬性轉(zhuǎn)換成在通用驅(qū)動(dòng)器中的注冊(cè)表內(nèi)的表示(所述表示可在本文中被稱為“pdev”);以及構(gòu)件,所述構(gòu)件用以注冊(cè)相關(guān)聯(lián)的邏輯裝置表示(所述表示可在本文中被稱為“l(fā)devs”)和必要的驅(qū)動(dòng)器內(nèi)部映射片段,所述映射片段用以在任何裝置屬性在任一方向上改變時(shí)映射到和映射自pdevs和ldevs。如本文中可使用,“tophysical”是指源自數(shù)據(jù)架構(gòu)的屬性變化,而“tological”是指源自硬件(例如,物理裝置)的屬性變化。映射邏輯可以類似于本文中描述的適配器語(yǔ)言的方式用基礎(chǔ)腳本語(yǔ)言的變型或子集寫入,但所述變型或子集比適配器語(yǔ)言強(qiáng)大得多,如通過(guò)表示并操控布置的精確表示和/或硬件裝置屬性和命令(例如,改變字大小,位掩蔽,數(shù)組,子結(jié)構(gòu)等)的所有可能形式和包裝的需要所需。在一些實(shí)施中,大部分驅(qū)動(dòng)器可經(jīng)由ud抽象層連接,而非直接地連接到裝置管理器api中,因?yàn)檫@簡(jiǎn)化寫入驅(qū)動(dòng)器的任務(wù)。在實(shí)施方案中,ud抽象層是經(jīng)設(shè)計(jì)以簡(jiǎn)化寫入順從驅(qū)動(dòng)器的過(guò)程的單獨(dú)且獨(dú)立的層。
在實(shí)施方案中,裝置管理器160是自適應(yīng)且強(qiáng)大的接口,所述接口可同時(shí)連接到多個(gè)順從的插件式驅(qū)動(dòng)器166并平滑所有傳輸特定的和驅(qū)動(dòng)器特定的急轉(zhuǎn),使得較高級(jí)架構(gòu)甚至不必考慮這些事情以實(shí)現(xiàn)對(duì)應(yīng)的裝置的控制。此外,為增強(qiáng)其效用,裝置管理器160還可在統(tǒng)一架構(gòu)中利用通過(guò)用戶界面部件(例如,在界面114內(nèi))、數(shù)據(jù)聯(lián)網(wǎng)部件和/或編寫腳本部件的任何使用的相同基本數(shù)據(jù)抽象。通過(guò)在整個(gè)擴(kuò)展的且分布式系統(tǒng)上推動(dòng)此共同性,一直到裝置管理器160,可實(shí)現(xiàn)簡(jiǎn)單且通用的用戶體驗(yàn)。
6.1.適配器語(yǔ)言
6.1.1.詞法結(jié)構(gòu)
根據(jù)實(shí)施方案,下方的列表9表示根據(jù)在‘430專利案中定義的形式化的適配器語(yǔ)言的詞法結(jié)構(gòu):
在實(shí)施方案中,除在列表9中的“<begin>”與“<next>”分隔符之間的各種關(guān)鍵字和運(yùn)算符外,適配器語(yǔ)言支持以下可變?cè)~法令牌:
●令牌1:變量或符號(hào)值(例如,counter、idx_1、a、varname等);
●令牌2:具有換碼的單或多字符常量(例如,“x、”“\n”、“\x34、”“abcd”);
●令牌3:十進(jìn)制64位整數(shù)(例如,1234);
●令牌4和5:具有可選指數(shù)的雙精度浮點(diǎn)數(shù)(例如,1.234、1.3e5);
●令牌6:裝置屬性(例如,@dev.temperature、@[xxydd].contact、@.prop等);
●令牌7:十六進(jìn)制64位整數(shù)(例如,0xffff、0x34ab);
●令牌8和9:未經(jīng)使用,因?yàn)樗械恼麛?shù)都是相同大??;
●令牌10:八進(jìn)制64位整數(shù)常量(例如,03777);
●令牌11:未經(jīng)使用,因?yàn)樗械恼麛?shù)都是相同大?。缓?或
●令牌12和13:具有換碼的字符串常量(例如,“helloworld\n”)。
在實(shí)施方案中,適配器語(yǔ)言支持與基礎(chǔ)腳本語(yǔ)言相同的運(yùn)算符句法,但消除基礎(chǔ)腳本語(yǔ)言中的所有關(guān)鍵字,除了“if、”“else”以及預(yù)定義常量“true”、“false”以及“unknown?!币虼?,除“if”結(jié)構(gòu)外,適配器語(yǔ)言缺少基礎(chǔ)腳本語(yǔ)言的所有線程、循環(huán)以及控制結(jié)構(gòu)。此簡(jiǎn)化是批準(zhǔn)的,因?yàn)轵?qū)動(dòng)器層164的工作僅是將值從一種形式或名稱轉(zhuǎn)換成另一形式或名稱。由此,適配器語(yǔ)言不需要基礎(chǔ)腳本語(yǔ)言的更加復(fù)雜的結(jié)構(gòu)。此簡(jiǎn)化還使驅(qū)動(dòng)器層164易于實(shí)施,并消除對(duì)用于適配器片段的vm230的等效物的需要。
通過(guò)基礎(chǔ)腳本語(yǔ)言和適配器語(yǔ)言兩者提供的運(yùn)算符集可類似于在標(biāo)準(zhǔn)c語(yǔ)言內(nèi)支持的那些運(yùn)算符集,但不包括自動(dòng)遞增和遞減結(jié)構(gòu),且分別用關(guān)鍵字“and”、“or”以及“not”替換c邏輯運(yùn)算符“&&、”“||”以及“!。”這使新手程序員容易理解。
正如基礎(chǔ)腳本語(yǔ)言一樣,在實(shí)施方案中,除了內(nèi)置類型外,基礎(chǔ)腳本語(yǔ)言不允許定義類型,所述內(nèi)置類型可緊密地對(duì)應(yīng)于詞法令牌。內(nèi)置類型可包括:
●布爾型:布爾值(例如,保持為64位整數(shù)),所述布爾值可采用“真”或“假”的值。
●整數(shù):64位整數(shù)值(但可使用不同大小的整數(shù)值);
●實(shí)數(shù):雙精度浮點(diǎn)值(例如,等效于c中的雙精度數(shù));
●字符串:任意長(zhǎng)度的字符串值(例如,“helloworld”);
●符號(hào):符號(hào)值,所述符號(hào)值自動(dòng)地呈現(xiàn)數(shù)據(jù)類型和賦給所述符號(hào)值的任何項(xiàng)的值(例如,myvariablename),使得符號(hào)可具有任何基礎(chǔ)類型(例如,布爾型、整數(shù)、實(shí)數(shù)、字符串或未知的);和/或
●屬性:裝置屬性值(例如,@dev.temperature),其中屬性的數(shù)據(jù)類型通過(guò)模式和處理所述模式的裝置驅(qū)動(dòng)器確定,使得所述屬性可為任何基礎(chǔ)類型(例如,布爾型、整數(shù)、實(shí)數(shù)、字符串或未知的)。
正如基礎(chǔ)腳本語(yǔ)言一樣,在實(shí)施方案中,適配器語(yǔ)言是動(dòng)態(tài)類型的語(yǔ)言。換句話說(shuō),符號(hào)呈現(xiàn)數(shù)據(jù)類型和最近賦給符號(hào)的任何項(xiàng)的值。這消除了對(duì)與類型定義相關(guān)聯(lián)的句法或邏輯的需要。
如上文所提及,在實(shí)施方案中,符號(hào)和屬性數(shù)據(jù)類型可賦有基礎(chǔ)數(shù)據(jù)類型中的任何類型,以及表示“unknown”的值。如本文中其它地方將描述,“unknown”值可具有特殊意義,尤其是在給表達(dá)式賦值時(shí)。
正如基礎(chǔ)腳本語(yǔ)言一樣,在實(shí)施方案中,適配器語(yǔ)言支持塊語(yǔ)句(例如,通過(guò)括號(hào)“{“和“}”包圍)。然而,不同于基礎(chǔ)腳本語(yǔ)言,在實(shí)施方案中,適配器語(yǔ)言不支持任何類型的注釋。適配器程序通常足夠簡(jiǎn)單(例如,僅單個(gè)語(yǔ)句),使得一般不需要對(duì)嵌入式注釋的支持。出于此原因,適配器程序可在本文中被稱為“片段,”而非“程序。”然而,替代地,適配器語(yǔ)言可例如以與基礎(chǔ)腳本語(yǔ)言相似的方式支持注釋。
6.1.2.句法
根據(jù)實(shí)施方案,給出列表9中定義的詞法結(jié)構(gòu)并根據(jù)在‘130專利案中定義的形式化,下方的列表10表示適配器語(yǔ)言的句法:
列表10中的bnf的區(qū)段,從“expression”的lhs產(chǎn)生式開(kāi)始并以“object”的lhs產(chǎn)生式結(jié)束,基本上指定可用于表達(dá)式內(nèi)的所有運(yùn)算符,和通過(guò)bnf內(nèi)的聲明序列實(shí)施的對(duì)應(yīng)的運(yùn)算符優(yōu)先級(jí)規(guī)則。
此語(yǔ)法區(qū)域與基礎(chǔ)腳本語(yǔ)言相同,且因此,將不詳細(xì)描述此語(yǔ)法區(qū)域。此外,在實(shí)施方案中,所有這些語(yǔ)言功能都通過(guò)基于‘130專利案的解析器技術(shù)而內(nèi)置在庫(kù)中的代碼實(shí)施,如通過(guò)呈“<@0:n>”形式的語(yǔ)法元素指示。出于此原因,適配器語(yǔ)言的這些方面,包含任意深度的嵌套表達(dá)式的賦值,將也不在本文中詳細(xì)描述。
在實(shí)施方案中,適配器語(yǔ)言支持內(nèi)置函數(shù)調(diào)用和程序調(diào)用,可將零個(gè)或更多個(gè)逗號(hào)分隔的參數(shù)傳遞到所述內(nèi)置函數(shù)和程序。每一參數(shù)可為任意表達(dá)式(包含嵌套函數(shù)調(diào)用),所述表達(dá)式產(chǎn)生可采用基礎(chǔ)數(shù)據(jù)類型中的任何數(shù)據(jù)類型的形式的參數(shù)值。與此功能相關(guān)聯(lián)的語(yǔ)法產(chǎn)生式包含“rstof_object”、“parameter_list”以及“rstof_param_list?!焙瘮?shù)可確定傳遞到所述函數(shù)的參數(shù)的數(shù)量和數(shù)據(jù)類型,且許多函數(shù)可對(duì)于任何給定參數(shù)接受超過(guò)一個(gè)數(shù)據(jù)類型,并根據(jù)傳遞作為給定參數(shù)的數(shù)據(jù)類型操作??捎脙?nèi)置函數(shù)的取樣在本文中的其它地方出于說(shuō)明性目的而描述。
6.1.3.片段結(jié)構(gòu)
列表10中的產(chǎn)生式,在“program”處開(kāi)始并以“else_body”結(jié)束,涉及用適配器語(yǔ)言寫入的片段的基礎(chǔ)結(jié)構(gòu)。在實(shí)施方案中,每一片段包括通過(guò)分號(hào)分隔的一系列語(yǔ)句。不同于基礎(chǔ)腳本語(yǔ)言,在實(shí)施方案中,不需要最外層包圍塊分隔符(即,“{“和“}”)和函數(shù)聲明。適配器片段可從通過(guò)驅(qū)動(dòng)器層164在其被調(diào)用時(shí)在內(nèi)部傳遞的信息得到所述適配器片段需要的所有上下文。
6.1.4.簡(jiǎn)單語(yǔ)句
在實(shí)施方案中,適配器語(yǔ)言提供兩個(gè)簡(jiǎn)單的語(yǔ)句形式:(1)賦值語(yǔ)句;以及(2)具有可選的“else”子句的“if”語(yǔ)句。這些簡(jiǎn)單語(yǔ)句中的每一個(gè)可通過(guò)分號(hào)與下一個(gè)分隔,所述分號(hào)是語(yǔ)句分隔符?!癷f”或“else”塊的內(nèi)容可為單個(gè)語(yǔ)句或包括另外的內(nèi)部語(yǔ)句的塊語(yǔ)句(即,在通過(guò)“{“和“}”定義的塊內(nèi))。在任何簡(jiǎn)單語(yǔ)句為合法的情況下,空語(yǔ)句(即,只有“;”)是合法的。
6.1.5.內(nèi)置函數(shù)
在實(shí)施方案中,適配器語(yǔ)言可提供內(nèi)置函數(shù)的庫(kù)。此庫(kù)可與在基礎(chǔ)腳本語(yǔ)言中可用的內(nèi)置函數(shù)的庫(kù)相同。然而,并非所有所述內(nèi)置函數(shù)都將適用于適配器操作。因此,可用于適配器語(yǔ)言的庫(kù)可包括與適配器操作相關(guān)的內(nèi)置函數(shù)的縮小集合。
以下是可在適配器語(yǔ)言的庫(kù)中提供的內(nèi)置函數(shù)中的一些的說(shuō)明性非窮盡性列表,其中“[i]”指示整數(shù)參數(shù),“[b]”指示布爾參數(shù),“[f]”指示實(shí)數(shù)參數(shù),“[s]”指示字符串參數(shù),且“[v]”指示空返回值(即,程序而非函數(shù)):
●[i]round([f]realvalue):將實(shí)數(shù)四舍五入到最近的整數(shù)值;
●[i]int([i/r/s]avalue):將整數(shù)、實(shí)數(shù)或字符串值轉(zhuǎn)換成整數(shù)值。字符串轉(zhuǎn)換可類似于c中的“strtoll()”函數(shù);
●[f]real([i/r/s]avalue):將整數(shù)、實(shí)數(shù)或字符串值轉(zhuǎn)換成實(shí)數(shù)值。字符串轉(zhuǎn)換可類似于c中的“strtod()”函數(shù);
●[s]sprintf([s]formatstring,...):類似于c中的“sprintf()”函數(shù),除了整數(shù)和實(shí)數(shù)可變自變量大小始終分別為int64和雙精度數(shù);
●[i]setoptions([i]options/[s]optionsstr):用于開(kāi)始選定的解析器選項(xiàng)。此函數(shù)可用于調(diào)試腳本的選定部分,而不會(huì)通過(guò)跟蹤其它的每一項(xiàng)而使控制臺(tái)混亂。字符串形式允許符號(hào)化地設(shè)定選項(xiàng)。在執(zhí)行所設(shè)定的操作后,此函數(shù)返回選項(xiàng)設(shè)定以作為結(jié)果;
●[i]clroptions([i]options/[s]optionsstr):清除指定的解析選項(xiàng)。此函數(shù)與setoptions()相反,并在清除操作后返回選項(xiàng)設(shè)定以作為結(jié)果。字符串形式允許符號(hào)化地清除選項(xiàng);
●[i]getoptions():獲得并返回解析選項(xiàng)的當(dāng)前設(shè)定;
●[s/i/f]indexset([i]index,[s/i/f]set1,...[s/i/f]setn):通過(guò)索引從給定成員列表選擇特定的成員集,并返回選定成員作為結(jié)果。如果指定索引在范圍外,那么返回指示“novalue”的值。函數(shù)的返回?cái)?shù)據(jù)類型通過(guò)集合成員的數(shù)據(jù)類型(所述集合成員的數(shù)據(jù)類型必定全都相同且為整數(shù)、實(shí)數(shù)或字符串?dāng)?shù)據(jù)類型中的一個(gè))確定;
●[i]setindex([s/i/f]src,[s/i/f]set1,…[s/i/f]setn):比較“src”與所提供的可能匹配值的集合中的元素中的每一個(gè),并在找到匹配時(shí)返回所找到的匹配的索引(從1開(kāi)始),或在未找到匹配時(shí)返回零。如果“src”為整數(shù),待檢查的其余的集合值必定也為整數(shù)。類似地,如果“src”為字符串,那么待檢查的其余的集合值必定也為字符串,并且,如果“src”為實(shí)數(shù),那么待檢查的其余的集合值必定也為實(shí)數(shù)。此函數(shù)表示用以針對(duì)值的集合中的成員關(guān)系檢查值的方便方式,并且可用僅單個(gè)函數(shù)調(diào)用來(lái)替代大量的個(gè)別比較;
●[i]rangeindex([i/f]src,[i/f]set1,…[i/f]setn):類似于setindex()函數(shù),但在集合中尋找匹配的“l(fā)essthanorequalto”值,而非相等。因此,此函數(shù)可用于索引數(shù)值范圍的有序集合,由此替代較大數(shù)目的條件語(yǔ)句。不同于setindex()函數(shù),在rangeindex()函數(shù)中禁止字符串值;和/或
●[s]consolemessage([s]formatstr[,…]):執(zhí)行與c中的“sprintf()”函數(shù)類似的函數(shù),返回所產(chǎn)生的字符串作為結(jié)果,且同時(shí)將所產(chǎn)生的字符串發(fā)送到控制臺(tái)。此函數(shù)可用于產(chǎn)生調(diào)試或進(jìn)展消息。
6.1.6.解析器上下文和符號(hào)
類似于基礎(chǔ)腳本語(yǔ)言,在適配器語(yǔ)言中,符號(hào)一被賦值并接受最近賦給符號(hào)的內(nèi)容的數(shù)據(jù)類型和值,就在局部范圍內(nèi)被創(chuàng)建。換句話說(shuō),適配器語(yǔ)言是動(dòng)態(tài)類型的語(yǔ)言。
在實(shí)施方案中,適配器語(yǔ)言的解析器結(jié)合值將符號(hào)存儲(chǔ)為字符串,包含符號(hào)的名稱,所述值可具有內(nèi)置數(shù)據(jù)類型(例如,布爾型、整數(shù)、實(shí)數(shù)、字符串或未知的)中的一個(gè)。每當(dāng)適配器解析器遇到符號(hào)名稱時(shí),所述解析器可在本地解析器的符號(hào)注冊(cè)表中實(shí)施查找以尋找符號(hào)名稱的條目,且隨后在符號(hào)注冊(cè)表中檢索或設(shè)定數(shù)據(jù)類型和值。在實(shí)施方案中,使用‘430專利案的詞法分析器抽象來(lái)索引符號(hào)注冊(cè)表以用于快速查找。這使符號(hào)查找?guī)缀跏撬矔r(shí)的,而不管符號(hào)注冊(cè)表中的符號(hào)的數(shù)目。
不同于基礎(chǔ)腳本語(yǔ)言,在實(shí)施方案中,適配器語(yǔ)言片段在解析器抽象內(nèi)直接地運(yùn)行。換句話說(shuō),不存在等效于vm230的適配器語(yǔ)言。此簡(jiǎn)化是由于以下事實(shí):適配器語(yǔ)言沒(méi)有線程模型,且在解析器內(nèi)的直接執(zhí)行實(shí)施起來(lái)更簡(jiǎn)單。另外,因?yàn)槠我话闶乾嵥榈那覂H在裝置屬性值被讀取或?qū)懭霑r(shí)執(zhí)行,所以不太需要優(yōu)化執(zhí)行。這是尤其真實(shí)的,因?yàn)榛A(chǔ)語(yǔ)言解譯器為當(dāng)前裝置屬性值維持內(nèi)部高速緩存,這意味著讀操作通常由內(nèi)部高速緩存服務(wù),且很少一直“流”至驅(qū)動(dòng)器166。原理是,驅(qū)動(dòng)器166負(fù)責(zé)在裝置屬性值已改變時(shí)通知裝置管理器160(例如,使用dm_devmgrnfy()函數(shù))。然而,如關(guān)于基礎(chǔ)腳本語(yǔ)言所論述,任一執(zhí)行形式在功能上是等效的,所以適配器語(yǔ)言全都與基礎(chǔ)腳本語(yǔ)言一樣利用解析器抽象(例如,用于符號(hào)表存儲(chǔ))。然而,在適配器語(yǔ)言的解析器之間不存在父子關(guān)系的概念。每一適配器片段在功能上與所有其它適配器片段不同。替代地,如果需要優(yōu)化,那么可提供與基礎(chǔ)語(yǔ)言vm230類似但更簡(jiǎn)單的適配器vm。
6.1.7.在模式中指定片段
在實(shí)施方案中,模式定義用于通過(guò)每一所注冊(cè)的驅(qū)動(dòng)器166來(lái)讀取或?qū)懭朊恳谎b置屬性(例如,溫度、亮度、鎖定等)的處理片段。具體地說(shuō),模式可將驅(qū)動(dòng)器的每一裝置屬性映射到數(shù)據(jù)架構(gòu)中的裝置屬性。
下方的列表11說(shuō)明根據(jù)實(shí)施方案映射數(shù)據(jù)架構(gòu)中的三個(gè)裝置屬性(即,“roomtemp”、“doorlockstatus”以及“brightness”)的實(shí)例模式:
在實(shí)施方案中,裝置管理器160訂閱數(shù)據(jù)架構(gòu)內(nèi)的所有模式定義。因此,在開(kāi)始,對(duì)于所有裝置屬性,裝置管理器160從平臺(tái)110接收模式定義的完整集合。裝置管理器160可將接收到的模式定義的集合轉(zhuǎn)換成平坦的裝置屬性注冊(cè)表,所述注冊(cè)表包括用于檢索用于任何定義的裝置屬性的映射的所有必要信息。類似于腳本注冊(cè)表214,裝置屬性注冊(cè)表可基于‘749專利案的字符串列表抽象(即,et_stringlist)。具體地說(shuō),每一條目可使用專門化的解析器從模式提取,并記錄在字符串列表中(例如,使用da_addpropertymapping()函數(shù))。然而,可使用替代的實(shí)施。
記錄在字符串列表中的每一條目的格式可為如下:
drivername;;sysmappropname;;driverpropname;;readsnippet;;writesnippet
其中drivername表示裝置屬性的抽象名稱,sysmappropname表示數(shù)據(jù)架構(gòu)中的裝置屬性的名稱,driverpropname表示驅(qū)動(dòng)器中的裝置屬性的名稱,readsnippet是用于從裝置讀取裝置屬性的適配器片段,且writesnippet是用于將裝置屬性寫入到裝置的適配器片段。然而,應(yīng)理解,可使用其它格式(例如,非基于json的格式)和其它解析器。
在實(shí)施方案中,每一字符串列表?xiàng)l目與一個(gè)或多個(gè)標(biāo)志相關(guān)聯(lián),所述標(biāo)志記錄數(shù)據(jù)架構(gòu)和驅(qū)動(dòng)器兩者的所表示屬性的數(shù)據(jù)類型(例如,布爾型,64位整數(shù),雙精度實(shí)數(shù),字符串,未知的)。某一條目可使用da_findpropertymapping()函數(shù)和所需信息在裝置屬性注冊(cè)表中找到,所述所需信息使用da_getpropertymappingfield()函數(shù)提取。根據(jù)實(shí)施方案,與每一字符串列表?xiàng)l目相關(guān)聯(lián)的標(biāo)志可包括以下各項(xiàng)中的一個(gè)或多個(gè):
●“kmapdrivername:”驅(qū)動(dòng)器名稱(*valuep=字符串最大長(zhǎng)度32);
●“kmapsysmapproperty:”數(shù)據(jù)架構(gòu)屬性名稱(*valuep=字符串最大長(zhǎng)度32);
●“kmapdriverproperty:”驅(qū)動(dòng)器屬性名稱(*valuep=字符串最大長(zhǎng)度64);
●“kmapreadprogram:”讀取程序(*valuep=字符串最大長(zhǎng)度stringbuffsize);
●“kmapwriteprogram:”寫入程序(*valuep=字符串最大長(zhǎng)度stringbuffsize);
●“kmappropertytype:”數(shù)據(jù)架構(gòu)屬性類型(*valuep=int16,連續(xù)的kboolvalue型的值,...);和/或
●“kmapdrivertype:”驅(qū)動(dòng)器屬性類型(*valuep=int16,連續(xù)的kboolvalue型的值,...)。
裝置屬性注冊(cè)表中的這些標(biāo)志可通過(guò)解析模式來(lái)提取,使得,對(duì)于每一屬性:
●最外“id”值變成“kmapsysmapproperty;”
●在驅(qū)動(dòng)器內(nèi)的屬性名稱(例如,列表11中的“thingworx”、“zwave”以及“justtesting”)變成“kmapdrivername;”
●屬性的模式的“read”值變成“kmapreadprogram;”
●屬性的模式的“write”值變成“kmapwriteprogram;”
●模式的“$ref”值被編碼為“kmappropertytype;”
●在驅(qū)動(dòng)器特定的值內(nèi)的模式的“name”值變成“kmapdriverproperty;”以及
●在驅(qū)動(dòng)器特定的值內(nèi)的模式的“type”值被編碼為“kmapdrivertype?!?/p>
鑒于在基礎(chǔ)腳本語(yǔ)言的上下文中的解析的論述,應(yīng)清楚如何通過(guò)調(diào)用da_addpropertymapping()function來(lái)實(shí)施傳遞到ut_parsejson()函數(shù)的dm_genericcallback()函數(shù)以創(chuàng)建裝置屬性注冊(cè)表。
驅(qū)動(dòng)器層164的根本操作是使用驅(qū)動(dòng)器名稱和屬性類型以檢索適合的讀或?qū)懫?如果存在)。當(dāng)從驅(qū)動(dòng)器166取得屬性時(shí),檢索讀片段,且當(dāng)將屬性寫入到驅(qū)動(dòng)器166時(shí),檢索寫片段。驅(qū)動(dòng)器層164隨后使用適配器解析器執(zhí)行檢索到的片段以執(zhí)行轉(zhuǎn)換。如果未找到驅(qū)動(dòng)器名稱的映射,那么驅(qū)動(dòng)器層164可執(zhí)行以下邏輯:
●如果操作為寫入,那么將屬性傳遞到驅(qū)動(dòng)器166,所述驅(qū)動(dòng)器可忽略其未識(shí)別的任何屬性。一個(gè)例外是,如果屬性狀態(tài)為“未決,”那么驅(qū)動(dòng)器將屬性的狀態(tài)改變成“確認(rèn)”以確認(rèn)接收到屬性;以及
●如果操作為讀取,那么不將屬性傳遞到數(shù)據(jù)架構(gòu),且忽略屬性,除非所述屬性是專門未映射的屬性的集合中的一個(gè),包含基礎(chǔ)和通用裝置屬性,例如“name、”“id”、“group、”“type”等。此邏輯確保數(shù)據(jù)架構(gòu)未用其不理解的內(nèi)部驅(qū)動(dòng)器產(chǎn)生的屬性填滿,同時(shí)允許驅(qū)動(dòng)器166簡(jiǎn)化輸出其知道的所有屬性,而不必確定數(shù)據(jù)架構(gòu)關(guān)注的是哪些屬性。
返回到列表11,將更詳細(xì)描述適配器語(yǔ)言片段的性質(zhì)?!皉oomtemp”和“thingworx”驅(qū)動(dòng)器的第一實(shí)例示出,在內(nèi)部,“thingworx”驅(qū)動(dòng)器具有屬性“thermostatshape_roomtemp,”所述屬性為實(shí)值。數(shù)據(jù)架構(gòu)屬性“roomtemp”也為實(shí)值。不需要縮放以在兩個(gè)值之間映射。當(dāng)屬性“roomtemp”跨越驅(qū)動(dòng)器層164移動(dòng)時(shí),僅需要名稱改變。
在實(shí)施方案中,適配器語(yǔ)言的獨(dú)特功能是前面為令牌“@@”的任何屬性名稱是指目標(biāo)側(cè)的屬性。也就是說(shuō),對(duì)于讀取操作,前面為“@@”的名稱是指數(shù)據(jù)架構(gòu)屬性,且對(duì)于寫入操作,前面為“@@”的名稱是指驅(qū)動(dòng)器屬性。相反地,前面為僅單個(gè)“@”的任何屬性名稱是指源側(cè)的屬性。也就是說(shuō),對(duì)于讀取操作,前面為單個(gè)“@”的名稱是指驅(qū)動(dòng)器屬性,且對(duì)于寫入操作,前面為單個(gè)“@”的名稱是指數(shù)據(jù)架構(gòu)屬性。不同的令牌允許引用不同的數(shù)據(jù)模型這一事實(shí)使適配器語(yǔ)言理想地用于將數(shù)據(jù)從一種格式或模型映射到另一種,同時(shí)維持干凈且簡(jiǎn)單的句法。應(yīng)注意,用基礎(chǔ)腳本語(yǔ)言寫入的腳本將一般不需要此特征,因?yàn)椴恍枰缭綌?shù)據(jù)架構(gòu)內(nèi)的不同數(shù)據(jù)模型進(jìn)行映射。因此,適配器語(yǔ)言中的此特征可能不能類似地可用于基礎(chǔ)腳本語(yǔ)言(或可在句法上得到支持,而是被忽略)。
替代地,在賦值的左手側(cè)上出現(xiàn)的任何屬性名稱是指目標(biāo)側(cè)的屬性。也就是說(shuō),對(duì)于讀取操作,左手側(cè)屬性名稱是指數(shù)據(jù)架構(gòu)屬性,且對(duì)于寫入操作,左手側(cè)屬性名稱是指驅(qū)動(dòng)器屬性。相反地,在賦值的右手側(cè)上出現(xiàn)的任何屬性名稱是指源側(cè)的屬性。也就是說(shuō),對(duì)于讀取操作,右手側(cè)屬性名稱是指驅(qū)動(dòng)器屬性,且對(duì)于寫入操作,右手側(cè)屬性名稱是指數(shù)據(jù)架構(gòu)屬性。賦值語(yǔ)句的不同側(cè)是指不同的數(shù)據(jù)模型這一事實(shí)使適配器語(yǔ)言理想地用于將數(shù)據(jù)從一種格式或模型映射到另一種,同時(shí)維持干凈且簡(jiǎn)單的句法。
參考列表11中的“roomtemp”屬性的“thingworx”驅(qū)動(dòng)器的讀取片段,基礎(chǔ)語(yǔ)言屬性引用格式(即,“@dev_name[dev_id].propname”)可通過(guò)省略裝置名稱(“dev_name”)和裝置id(“dev_id”)兩者來(lái)縮短適配器片段以產(chǎn)生“@.propname”的簡(jiǎn)化格式(例如,列表11中的“@.roomtemp”)。這是因?yàn)?,在適配器上下文中,裝置名稱和裝置id都不相關(guān),因?yàn)槠瓮瑯拥剡m用于驅(qū)動(dòng)器為“thingworx”和數(shù)據(jù)架構(gòu)屬性為“roomtemp”的所有情況。通過(guò)省略裝置名稱和裝置id(所述裝置名稱和裝置id在執(zhí)行片段時(shí)可從調(diào)用上下文獲得),獲得通用地適用于屬性和驅(qū)動(dòng)器的每一組合的片段。因此,進(jìn)行屬性映射所需的所有事物為到或從數(shù)據(jù)架構(gòu)屬性或驅(qū)動(dòng)器屬性的簡(jiǎn)單賦值,所述賦值在第一實(shí)例中所說(shuō)明。
“doorlockstatus”的第二實(shí)例示出更加復(fù)雜的情況:
在此實(shí)例中,“thingworx”驅(qū)動(dòng)器在內(nèi)部將“doorlockshape_lockmode”保持為具有如下兩個(gè)值的實(shí)數(shù):對(duì)于鎖定為值“255,”且對(duì)于未鎖定為值“0?!痹跀?shù)據(jù)架構(gòu)側(cè)上,屬性“doorlockstatus”保持為具有“l(fā)ocked”或“unlocked”的兩個(gè)值的字符串。因此,當(dāng)屬性“doorlockshape_lockmode”跨越驅(qū)動(dòng)器層164移動(dòng)時(shí),名稱和數(shù)據(jù)類型兩者都需要改變。
對(duì)于列表11中的“doorlockshape_lockmode”屬性,“thingworx”驅(qū)動(dòng)器的讀取片段使用三元運(yùn)算符(即,(expression)?trueval:falseval)來(lái)完成必要的映射。讀取片段還說(shuō)明內(nèi)置函數(shù)的使用。具體地說(shuō),讀取片段使用int()函數(shù)以便將“doorlockshape_lockmode”屬性的實(shí)值轉(zhuǎn)換成整數(shù),使得相等運(yùn)算符(即,“==”)可用于表達(dá)條件。寫入片段使用與讀取片段類似的技術(shù)。
“justtesting”驅(qū)動(dòng)器的第三實(shí)例說(shuō)明復(fù)雜得多的映射:
在此情況下,“brightness”屬性在數(shù)據(jù)架構(gòu)中保持為在0至100的范圍內(nèi)的整數(shù)。在“justtesting”驅(qū)動(dòng)器中,“l(fā)ightlevel”屬性保持為選自“dark”、“dim”、“normal”、“bright”以及“dazzling”的字符串。將整數(shù)值映射到這些字符串值中的一個(gè)提出挑戰(zhàn)。然而,此挑戰(zhàn)可使用適配器語(yǔ)言的內(nèi)置函數(shù)來(lái)克服。
例如,在讀取片段中,內(nèi)置setindex()函數(shù)用于獲得驅(qū)動(dòng)器屬性的字符串值的索引,所述字符串值可為“dark、”“dim”、“normal”、“bright”或“dazzling?!痹谒f(shuō)明的實(shí)例中,setindex()在“l(fā)ightlevel”屬性值為“dark”時(shí)將返回1的索引,在“l(fā)ightlevel”屬性值為“dim”時(shí)將返回2的索引,在“l(fā)ightlevel”屬性值為“normal”時(shí)將返回3的索引,在“l(fā)ightlevel”屬性值為“bright”時(shí)將返回4的索引,以及在“l(fā)ightlevel”屬性值為“dazzling”時(shí)將返回5的索引。接著,內(nèi)置indexset()函數(shù)將通過(guò)setindex()返回的索引應(yīng)用于值的集合,其中索引1對(duì)應(yīng)于“0,”2對(duì)應(yīng)于“25”,3對(duì)應(yīng)于“50”,4對(duì)應(yīng)于“75,”且5對(duì)應(yīng)于“100,”以返回0、25、50、75或100的整數(shù)值。通過(guò)將setindex()調(diào)用嵌套在indexset()調(diào)用內(nèi),單行片段可用于將“justtesting”驅(qū)動(dòng)器的“l(fā)ightlevel”屬性的“dark”、“dim”、“normal”、“bright”以及“dazzling”的字符串值分別映射到數(shù)據(jù)架構(gòu)的“brightness”屬性的0、25、50、75以及100的整數(shù)值。
寫入片段更加復(fù)雜,因?yàn)閿?shù)據(jù)架構(gòu)中的“brightness”屬性可設(shè)定為不等于0、25、50、75或100的整數(shù)值。因此,內(nèi)置rangeindex()函數(shù)用于將數(shù)據(jù)架構(gòu)中的“brightness”屬性的整數(shù)值(所述整數(shù)值可在0與100之間)映射到1、2、3、4或5的索引。rangeindex()函數(shù)繼續(xù)執(zhí)行以便匹配小于或等于指定值的任何數(shù)。因此,0的整數(shù)值產(chǎn)生索引1,在1與24之間的整數(shù)值產(chǎn)生索引2,在25與74之間的整數(shù)值產(chǎn)生索引3,在75與99之間的整數(shù)值產(chǎn)生索引4,且100的整數(shù)值產(chǎn)生索引5。隨后內(nèi)置indexset()函數(shù)用于將通過(guò)rangeindex()返回的索引1、2、3、4或5分別映射到字符串值“dark”、“dim”、“normal”、“bright”或“dazzling”中的一個(gè)。同樣地,通過(guò)將rangeindex()調(diào)用嵌套在indexset()調(diào)用內(nèi),單行片段可用于將在0與100之間的任何整數(shù)值映射到“dark”、“dim”、“normal”、“bright”以及“dazzling”的字符串值中的一個(gè)。
出于說(shuō)明多行片段的使用的目的,來(lái)自用于“thingworx”驅(qū)動(dòng)器的“sirenstrobesetting”屬性的實(shí)例模式在下方說(shuō)明:
在此實(shí)例中,讀取和寫入片段都利用多行語(yǔ)句,具有中間變量“a”和條件語(yǔ)句。如通過(guò)此實(shí)例所說(shuō)明,適配器語(yǔ)言能夠用片段表達(dá)幾乎任何變換。另外,內(nèi)置函數(shù)可按需要擴(kuò)展以使常用片段操作盡可能地簡(jiǎn)單和簡(jiǎn)潔。
所描述的方法的實(shí)施方案的一個(gè)優(yōu)點(diǎn)是驅(qū)動(dòng)器層164中的映射完全通過(guò)模式數(shù)據(jù)驅(qū)動(dòng)。更新或添加到這些映射不需要對(duì)任何代碼進(jìn)行重新編譯。此快速改變的能力促進(jìn)對(duì)連接裝置的較大且不斷變化的集合的多個(gè)驅(qū)動(dòng)器和傳輸協(xié)議的管理,同時(shí)降低維護(hù)和集成成本以及時(shí)間需要。
6.1.8.調(diào)用驅(qū)動(dòng)器層
在實(shí)施方案中,兩個(gè)函數(shù)涉及驅(qū)動(dòng)器層164的調(diào)用:
列表12中所說(shuō)明的兩個(gè)函數(shù)在成對(duì)的函數(shù)dm_getdeviceproperty()和dm_setdeviceproperty()內(nèi)被調(diào)用,所述dm_getdeviceproperty()從插件式驅(qū)動(dòng)器166讀取屬性值,所述dm_setdeviceproperty()將屬性值寫入到插件式驅(qū)動(dòng)器166。這些成對(duì)的函數(shù)被vm230和/或控制器130用于在實(shí)際上從腳本到裝置驅(qū)動(dòng)器166的直接調(diào)用中讀取和寫入屬性。對(duì)這些函數(shù)的調(diào)用使得呈通過(guò)數(shù)據(jù)架構(gòu)指定的格式的數(shù)據(jù)被路由到裝置管理器160,且最后在裝置管理器抽象162內(nèi)被解析成對(duì)dm_setdeviceproperty()或dm_getdeviceproperty()的局部調(diào)用。
適配器語(yǔ)言解析器的完整操作可通過(guò)與本文中描述的基礎(chǔ)語(yǔ)言解析器的操作類比而得到。然而,應(yīng)理解,適配器語(yǔ)言解析器將比基礎(chǔ)語(yǔ)言解析器簡(jiǎn)單得多,因?yàn)檫m配器語(yǔ)言具有比基礎(chǔ)語(yǔ)言適配器更簡(jiǎn)單的句法和語(yǔ)義。
6.2.解析json數(shù)據(jù)編碼標(biāo)準(zhǔn)
類似于腳本管理器210,裝置管理器160與控制器130介接,產(chǎn)生呈數(shù)據(jù)架構(gòu)的數(shù)據(jù)格式的包以發(fā)送到控制器130,并接收從控制器130發(fā)送的呈數(shù)據(jù)架構(gòu)的數(shù)據(jù)格式的包。如本文中在其它地方所提及,在實(shí)施方案中,數(shù)據(jù)架構(gòu)的此數(shù)據(jù)格式使用json。關(guān)于基礎(chǔ)腳本語(yǔ)言詳述的相同基本json解析器技術(shù)可被裝置管理器160用于這些目的,且因此,將不單獨(dú)地關(guān)于裝置管理器160進(jìn)行詳細(xì)描述。應(yīng)理解,json的替代數(shù)據(jù)格式可通過(guò)用替代數(shù)據(jù)格式的解析器來(lái)替換json解析器來(lái)支持。
6.3.裝置驅(qū)動(dòng)器注冊(cè)表和api
在實(shí)施方案中,在所注冊(cè)的驅(qū)動(dòng)器166與裝置管理器160之間的公共接口包括四個(gè)api調(diào)用:
dm_devmgrinit()函數(shù)在系統(tǒng)啟動(dòng)期間通過(guò)每一驅(qū)動(dòng)器166調(diào)用以注冊(cè)必要的回調(diào),所述回調(diào)允許裝置管理器160介接到并調(diào)用特定驅(qū)動(dòng)器166。如所說(shuō)明,驅(qū)動(dòng)器166必須提供三個(gè)回調(diào)函數(shù)以完成連接。第一個(gè)llcallbackfn被稱為低級(jí)驅(qū)動(dòng)器回調(diào)函數(shù),并在裝置管理器160與驅(qū)動(dòng)器166之間形成主要接口。另外兩個(gè)回調(diào)函數(shù)是裝置迭代器函數(shù)lldeviceiteratorfn和屬性迭代器函數(shù)llpropertyiteratorfn。全局上下文值globalcontext可通過(guò)裝置管理器160指定并傳遞到所調(diào)用的任何回調(diào)函數(shù),由此允許回調(diào)函數(shù)訪問(wèn)全局變量及類似者。裝置迭代器函數(shù)和屬性迭代器函數(shù)被裝置管理器160用于分別在所有裝置和其屬性上迭代,指定的驅(qū)動(dòng)器166知道所述裝置和屬性,由此實(shí)現(xiàn)所有連接裝置(即,虛擬或硬件裝置)的當(dāng)前狀態(tài)的完整圖像。
dm_devmgrterm()函數(shù)在系統(tǒng)終止處通過(guò)每一驅(qū)動(dòng)器166調(diào)用,以注銷驅(qū)動(dòng)器166并執(zhí)行與驅(qū)動(dòng)器166相關(guān)聯(lián)的存儲(chǔ)清除或釋放。
dm_devmgrinit()函數(shù)有可能針對(duì)同一驅(qū)動(dòng)器166被調(diào)用多次。如果這樣,那么對(duì)dm_devmgrinit()函數(shù)的調(diào)用可使內(nèi)部驅(qū)動(dòng)器使用計(jì)數(shù)器遞增,所述計(jì)數(shù)器必須在驅(qū)動(dòng)器166被注銷且其相關(guān)聯(lián)的存儲(chǔ)裝置終止之前通過(guò)匹配次數(shù)調(diào)用dm_devmgrterm()函數(shù)遞減到零。換句話說(shuō),在驅(qū)動(dòng)器166可被注銷且其相關(guān)聯(lián)的存儲(chǔ)裝置可被終止之前,對(duì)dm_devmgrinit()函數(shù)的每一調(diào)用必須一一對(duì)應(yīng)于對(duì)dm_devmgrterm()函數(shù)的調(diào)用。
每當(dāng)驅(qū)動(dòng)器166更改裝置屬性的值或狀態(tài)或經(jīng)歷裝置屬性的值或狀態(tài)的變化時(shí),dm_devmgrnfy()函數(shù)被驅(qū)動(dòng)器166調(diào)用。dm_devmgrnfy()函數(shù)是以下機(jī)制:通過(guò)所述機(jī)制將在裝置級(jí)處發(fā)生的變化告知系統(tǒng)的其余部分(例如,腳本執(zhí)行環(huán)境150)。
dm_devmgrpoll()函數(shù)被每一驅(qū)動(dòng)器166頻繁地調(diào)用。dm_devmgrpoll()函數(shù)是以下機(jī)制:通過(guò)所述機(jī)制,來(lái)自系統(tǒng)的其余部分(例如,腳本執(zhí)行環(huán)境150)的新命令和裝置屬性值通過(guò)對(duì)所注冊(cè)的回調(diào)函數(shù)的調(diào)用傳送到驅(qū)動(dòng)器166。dm_devmgrpoll()函數(shù)的使用約束執(zhí)行此類異步調(diào)用(例如,由通過(guò)控制器130、平臺(tái)110和/或在腳本執(zhí)行環(huán)境150內(nèi)執(zhí)行的腳本所進(jìn)行的裝置屬性改變引起)所處的時(shí)間。這使驅(qū)動(dòng)器166的編程模型變得簡(jiǎn)單得多,因?yàn)樗鼍幊棠P筒槐卦谌魏纹渌鼤r(shí)間處與來(lái)自裝置管理器160的異步命令或調(diào)用競(jìng)爭(zhēng),如根據(jù)需要,例如在完全搶占式布置中。
6.4.裝置管理器和驅(qū)動(dòng)器線程模型
存在裝置管理器160、腳本執(zhí)行環(huán)境150以及驅(qū)動(dòng)器166的多個(gè)可能的布置,包含其中這些部件中的每一個(gè)處于單獨(dú)的過(guò)程中的布置,和/或其中所有這些部件可在不同的計(jì)算節(jié)點(diǎn)上的布置。每一此布置具有不同的優(yōu)點(diǎn)和缺點(diǎn)。
最常用的線程模型包括每個(gè)使用不同的傳輸協(xié)議(例如,bluetoothtm、z-wavetm、zigbeetm等)以通信方式連接到兩個(gè)或更多個(gè)不同驅(qū)動(dòng)器的腳本執(zhí)行環(huán)境150和裝置管理器160的統(tǒng)一過(guò)程。所有這些部件都存在于在網(wǎng)關(guān)120的控制器130中運(yùn)行的單個(gè)過(guò)程內(nèi)的多個(gè)搶占式線程內(nèi),其中腳本執(zhí)行環(huán)境150和裝置管理器160統(tǒng)一在單個(gè)線程中,且驅(qū)動(dòng)器在一個(gè)或多個(gè)不同線程中。如果存在僅單個(gè)驅(qū)動(dòng)器,那么用于所述單個(gè)驅(qū)動(dòng)器的線程還可在單個(gè)線程中與腳本執(zhí)行環(huán)境150和裝置管理器160統(tǒng)一,由此消除兩個(gè)隊(duì)列并改進(jìn)吞吐量。
圖7說(shuō)明根據(jù)實(shí)施方案的具有兩個(gè)實(shí)例驅(qū)動(dòng)器dr.x和dr.y的實(shí)例統(tǒng)一線程模型。在此實(shí)例中,dr.x線程720經(jīng)由傳輸層726以通信方式連接到四個(gè)裝置728a至728d。類似地,dr.y線程730經(jīng)由傳輸層736以通信方式連接到四個(gè)裝置738e至738h。應(yīng)理解,在每一情況下,通信連接可為硬連線的(例如,串行鏈路、輸電線、以太網(wǎng)線纜等),或無(wú)線的(例如,無(wú)線電、wi-fitm、bluetoothtm、蜂窩網(wǎng)等)。事實(shí)上,每一傳輸協(xié)議往往指定所需線程布置,但出于此實(shí)例的目的,將假設(shè)每一驅(qū)動(dòng)器線程dr.x720和dr.y730拆分成兩個(gè)工作者線程:(1)分別為讀取線程722和732,所述讀取線程分別從傳輸層726和736進(jìn)行讀??;以及(2)分別為寫入線程724和734,所述寫入線程分別寫入到傳輸層726和736。這些讀取和寫入線程有效地將每一驅(qū)動(dòng)器線程dr.x720和dr.y730分別連接到裝置728和738的集合。讀取線程722和732分別將到驅(qū)動(dòng)器線程dr.x720和dr.y730的消息排隊(duì),且寫入線程724和734分別將來(lái)自驅(qū)動(dòng)器線程dr.x720和dr.y730的消息排隊(duì)。
在實(shí)施方案中,驅(qū)動(dòng)器線程720執(zhí)行無(wú)限主循環(huán),所述循環(huán)處理來(lái)自現(xiàn)實(shí)世界裝置(即,來(lái)自讀取線程722)或經(jīng)過(guò)“所設(shè)定”的隊(duì)列的輸入,所述隊(duì)列通過(guò)統(tǒng)一的裝置管理器和腳本管理器線程715(例如,在所述線程調(diào)用dm_setdeviceproperty()函數(shù)時(shí))填充。所設(shè)定的隊(duì)列在通過(guò)驅(qū)動(dòng)器線程720對(duì)dm_devmgrpoll()函數(shù)的定期輪詢調(diào)用期間排出。驅(qū)動(dòng)器線程720中的主循環(huán)還處理經(jīng)由傳輸層726到現(xiàn)實(shí)世界裝置(即,到寫入線程724)或到統(tǒng)一的裝置管理器和腳本管理器線程715的“get”隊(duì)列的值的輸出。驅(qū)動(dòng)器線程720通過(guò)調(diào)用dm_nfydevmgr()函數(shù)來(lái)填充所排隊(duì)列,且統(tǒng)一裝置管理器和腳本管理器線程715定期地使所排隊(duì)列排出(例如,通過(guò)調(diào)用dm_getdeviceproperty()函數(shù))。
每一驅(qū)動(dòng)器720和730在其自身隔離的線程(所述線程一般與統(tǒng)一裝置管理器和腳本管理器線程715不同)內(nèi)執(zhí)行這一事實(shí)簡(jiǎn)化驅(qū)動(dòng)器的寫入,并允許未經(jīng)設(shè)計(jì)用于數(shù)據(jù)架構(gòu)的預(yù)先存在的驅(qū)動(dòng)器容易地用數(shù)據(jù)架構(gòu)包裝。這些預(yù)先存在的驅(qū)動(dòng)器可存在于完全單獨(dú)的過(guò)程中,其中所有必要的通信使用平坦的“et_stringlist”模型來(lái)實(shí)施以傳輸復(fù)雜的數(shù)據(jù),并避免串行化和去串行化的開(kāi)銷。因?yàn)閐m_getdeviceproperty()和dm_setdeviceproperty()函數(shù)利用所包括的裝置的驅(qū)動(dòng)器的知識(shí),所以所述函數(shù)可充當(dāng)在統(tǒng)一裝置管理器和腳本管理器線程715與所述線程所連接的各種驅(qū)動(dòng)器(例如,如通過(guò)驅(qū)動(dòng)器注冊(cè)表發(fā)現(xiàn))之間的主要路由機(jī)制。
在其它配置中,不同的經(jīng)注冊(cè)驅(qū)動(dòng)器可造成不同的路由行為。例如,在基礎(chǔ)腳本語(yǔ)言的獨(dú)立解譯器的實(shí)施方案中,唯一注冊(cè)的驅(qū)動(dòng)器是將經(jīng)編碼數(shù)據(jù)(例如,經(jīng)json編碼的數(shù)據(jù))發(fā)送到控制器130并從所述控制器接收經(jīng)編碼數(shù)據(jù)的驅(qū)動(dòng)器。這意味著,就調(diào)用dm_getdeviceproperty()和dm_setdeviceproperty()函數(shù)而言,有可能在平臺(tái)110上而非網(wǎng)關(guān)120上運(yùn)行的獨(dú)立解譯器的操作與統(tǒng)一裝置管理器和腳本管理器線程715的操作相同。行為和路由上的差異可通過(guò)基本驅(qū)動(dòng)器注冊(cè)表來(lái)實(shí)現(xiàn)。有利地,這允許在廣泛范圍的配置中應(yīng)用相同的代碼基礎(chǔ),而不需要專門化行為。換句話說(shuō),支持多個(gè)驅(qū)動(dòng)器和傳輸層的初始架構(gòu)決策被利用并擴(kuò)展以支持各種架構(gòu)部件的多個(gè)配置。
6.5.驅(qū)動(dòng)器回調(diào)
如關(guān)于驅(qū)動(dòng)器apidm_devmgrinit()函數(shù)所論述,在實(shí)施方案中,驅(qū)動(dòng)器166在其向裝置管理器160注冊(cè)時(shí)提供三個(gè)根本回調(diào)。這些回調(diào)的c函數(shù)原型如下:
最廣泛使用的回調(diào)函數(shù)一般將為dm_devmgrcallbackfn()函數(shù)。為說(shuō)明此回調(diào)函數(shù)內(nèi)的邏輯,現(xiàn)將參考下方的列表14描述實(shí)例骨架驅(qū)動(dòng)器回調(diào)函數(shù),所述骨架驅(qū)動(dòng)器回調(diào)函數(shù)設(shè)計(jì)為實(shí)際驅(qū)動(dòng)器回調(diào)函數(shù)的起始點(diǎn):
列表14中的邏輯已出于說(shuō)明而目的而簡(jiǎn)化。雖然需要多個(gè)另外的行為來(lái)實(shí)施真實(shí)的驅(qū)動(dòng)器,但這些行為是微妙的且對(duì)此描述不重要。
“kdevmgrremovedevice”命令的邏輯移除裝置,且“kdevmgrdeleteproperty”命令的邏輯刪除裝置屬性。這些命令就基本傳輸協(xié)議而言實(shí)際上意指的內(nèi)容是待針對(duì)每一特定驅(qū)動(dòng)器166確定的事情。當(dāng)控制器130或平臺(tái)110試圖從網(wǎng)關(guān)120移除已知裝置(例如,連同可針對(duì)裝置驅(qū)動(dòng)器維持在內(nèi)部的數(shù)據(jù)庫(kù)一起)時(shí),將發(fā)出“kdevmgrremovedevice”命令。例如,裝置可從一個(gè)網(wǎng)關(guān)120移除并添加到另一網(wǎng)關(guān)。在裝置將從其移除的網(wǎng)關(guān)120處,“kdevmgrremovedevice”命令將在裝置將從其移除的網(wǎng)關(guān)120處發(fā)出,而“kdevmgrputdevice”命令將在裝置將添加到其上的網(wǎng)關(guān)處發(fā)出。“kdevmgrdeleteproperty”命令極少被使用,且將可能僅在校正屬性的意外添加的過(guò)程中出現(xiàn)。
對(duì)于“kdevmgrgetproperty”命令,驅(qū)動(dòng)器166必須從指定裝置獲得所請(qǐng)求的屬性值,并用內(nèi)部驅(qū)動(dòng)器格式將其寫入到所輸出的緩存“avalue。”此屬性值將通過(guò)驅(qū)動(dòng)器層164自動(dòng)轉(zhuǎn)換成數(shù)據(jù)架構(gòu)的數(shù)據(jù)格式。因?yàn)椤発devmgrgetproperty”命令通過(guò)屬性的驅(qū)動(dòng)器名稱尋找屬性,所以驅(qū)動(dòng)器166不需要關(guān)注數(shù)據(jù)架構(gòu)的數(shù)據(jù)格式,或甚至數(shù)據(jù)架構(gòu)中的屬性名稱可能為何。“kdevmgrgetproperty”命令可源自在裝置管理器160內(nèi)對(duì)dm_getdeviceproperty()函數(shù)的調(diào)用。
對(duì)于“kdevmgrsetproperty”命令,驅(qū)動(dòng)器166在其識(shí)別出指定的裝置屬性時(shí),將指定的裝置屬性寫入到裝置,并將屬性狀態(tài)告知裝置管理器160并確認(rèn)所述屬性狀態(tài)。用“kdevmgrsetproperty”命令傳入的屬性的狀態(tài)的值將為“未決的,”因?yàn)?,在?shí)施方案中,驅(qū)動(dòng)器166是被允許將屬性狀態(tài)改變成“確認(rèn)”的唯一權(quán)威機(jī)構(gòu)?!発devmgrsetproperty”命令可源自在裝置管理器160內(nèi)對(duì)dm_setdeviceproperty()函數(shù)的調(diào)用。
當(dāng)控制器130和/或平臺(tái)110從裝置管理器160請(qǐng)求對(duì)裝置的當(dāng)前狀態(tài)的確認(rèn)時(shí),使用“kdevmgrputdevice”命令?!発devmgrputdevice”命令并不隱含對(duì)改變?nèi)魏窝b置屬性的請(qǐng)求,而是僅表示用于驅(qū)動(dòng)器166校正裝置的當(dāng)前狀態(tài)的控制器的和/或平臺(tái)的圖像的機(jī)會(huì)。因此,“kdevmgrputdevice”命令的邏輯類似于“kdevmgrsetproperty”命令,除了進(jìn)入的屬性值實(shí)際上并未寫入到裝置。
列表14中所說(shuō)明的五個(gè)命令允許控制器130和/或平臺(tái)110通過(guò)裝置管理器160和適合的驅(qū)動(dòng)器166,執(zhí)行控制和活動(dòng)監(jiān)視,包含通過(guò)在腳本執(zhí)行環(huán)境150中運(yùn)行的腳本禁止的裝置相關(guān)的活動(dòng)。
在實(shí)施方案中,兩個(gè)迭代器回調(diào)函數(shù)dm_devmgrdeviteratorfn()和dm_devmgrpropiteratorfn(),可被裝置管理器160用于在網(wǎng)關(guān)120的啟動(dòng)期間將所有連接的裝置的全部狀態(tài)的初始快照發(fā)送到控制器130和/或平臺(tái)110。每一驅(qū)動(dòng)器166可實(shí)施其自身的過(guò)程以用于發(fā)現(xiàn)所述驅(qū)動(dòng)器應(yīng)進(jìn)行以經(jīng)由傳輸協(xié)議在其裝置上迭代的操作,且隨后在那些裝置的任何和所有屬性上迭代。驅(qū)動(dòng)器166可忽略控制器130或平臺(tái)110是否實(shí)際上關(guān)注任何特定屬性。
現(xiàn)將描述在裝置管理器160內(nèi)使用所注冊(cè)的迭代器的實(shí)例偽代碼:
尤其地,驅(qū)動(dòng)器166自身可利用通過(guò)裝置管理器160提供的其它公共api,以便簡(jiǎn)化驅(qū)動(dòng)器166的實(shí)施和操作。確切地說(shuō),以下函數(shù)和抽象中的一個(gè)或多個(gè)可通過(guò)所注冊(cè)的驅(qū)動(dòng)器166使用:
●ut_logentry()函數(shù)可用于添加webgui的登錄條目;
●裝置管理器“字典”抽象可用于通過(guò)驅(qū)動(dòng)器166進(jìn)行的所有符號(hào)存儲(chǔ),而非常規(guī)的數(shù)據(jù)庫(kù);
●可利用裝置注冊(cè)表抽象;
●成對(duì)的函數(shù)ut_setpropertystate()和ut_getpropertystate()提供跨越所有注冊(cè)的驅(qū)動(dòng)器166對(duì)所有裝置和其屬性的當(dāng)前狀態(tài)的裝置管理器的記錄的完全訪問(wèn);
●每一驅(qū)動(dòng)器166可使用基本解析器抽象來(lái)實(shí)施其解析功能性以用于解譯傳輸協(xié)議,所述驅(qū)動(dòng)器經(jīng)由所述傳輸協(xié)議操作;
●裝置管理器160可維持裝置群組的內(nèi)部注冊(cè)表并提供api函數(shù),例如dm_ingroup(),每一驅(qū)動(dòng)器166可訪問(wèn)所述函數(shù)以用于處理裝置群組;
●驅(qū)動(dòng)器層164的api可用于驅(qū)動(dòng)器166以用于更加高級(jí)的邏輯目的;和/或
●只要可能,驅(qū)動(dòng)器166就可遵循相同的譯碼標(biāo)準(zhǔn),并將相同的所發(fā)布分配器用作裝置管理器160和腳本管理器210,由此使驅(qū)動(dòng)器166可訪問(wèn)所有內(nèi)置調(diào)試功能性(例如,錯(cuò)誤報(bào)告、泄漏檢查等)。
6.6.處理數(shù)據(jù)架構(gòu)命令
如本文中在其它地方所論述,在實(shí)施方案中,數(shù)據(jù)架構(gòu)的數(shù)據(jù)格式為json。在此實(shí)施方案中,處理即將到來(lái)的命令的任務(wù)本質(zhì)上是執(zhí)行包含那些命令的json的解析中的一個(gè)。此過(guò)程可在根本上與json數(shù)據(jù)編碼標(biāo)準(zhǔn)的解析和用于轉(zhuǎn)換成基礎(chǔ)語(yǔ)言腳本的gui腳本的解析相同,如在本文中的其它地方關(guān)于基礎(chǔ)腳本語(yǔ)言所描述。因此,此處不提供詳細(xì)說(shuō)明。替代地,以下列表提供涉及解析“kjson_newmemberval”命令的邏輯的注解:
●如果json路徑以“:op”結(jié)束,那么這是命令類型;
●如果json路徑不以“:status”結(jié)束,那么這是屬性值設(shè)定“kvalueprocessed;”
●如果json路徑以“type:{:value[”結(jié)束,那么執(zhí)行專門化的邏輯、合并逗號(hào)分隔的值;
●如果json路徑以“group:{:value:[:{:$ref”結(jié)束,那么所述路徑平坦化成裝置群組引用,且合并逗號(hào)分隔的值;
●如果json路徑以“group:{:value:[:{:name”結(jié)束,那么所述路徑平坦化成群組名稱,且合并逗號(hào)分隔的值;
●如果json路徑以“:ref”或“.id”結(jié)束,那么這是裝置id;
●如果json路徑以“.name:{:value”結(jié)束且不包含“group:{value:,”那么裝置被注冊(cè);以及
●如果json路徑以“:status”結(jié)束,那么這是屬性狀態(tài),所述屬性狀態(tài)被賦給“kstatusprocessed?!?/p>
在實(shí)施方案中,在處理每一“kjson_newmemberval”命令之后,調(diào)用dm_processcompleteval()函數(shù)。dm_processcompleteval()函數(shù)查看“kstatusprocessed”和“kvalueprocessed”標(biāo)志以確定處理屬性需要的所有數(shù)據(jù)是否都可用。如果是,那么在涉及“群組”和“類型”屬性的某些邏輯例外的情況下,dm_processcompleteval()函數(shù)調(diào)用dm_setdeviceproperty()函數(shù),這最終導(dǎo)致適合的驅(qū)動(dòng)器166被調(diào)用。
6.7.構(gòu)造響應(yīng)
如本文中在其它地方所論述,在實(shí)施方案中,數(shù)據(jù)架構(gòu)的數(shù)據(jù)格式為json。在此實(shí)施方案中,產(chǎn)生即將離去的命令的任務(wù)本質(zhì)上是將裝置管理器的內(nèi)部注冊(cè)表(例如,由對(duì)dm_devmgrnfy()函數(shù)的調(diào)用引起的狀態(tài)更新)中的一個(gè)或多個(gè)的條目轉(zhuǎn)換成json格式中的一個(gè)。
在實(shí)施方案中,不管目的為何,所有內(nèi)部注冊(cè)表都基于在‘749專利案中描述的平坦存儲(chǔ)器模型來(lái)使用“et_stringlist”結(jié)構(gòu)。此邏輯的細(xì)節(jié)在本文中的其它地方關(guān)于vm程序格式描述。在此實(shí)施方案中,構(gòu)造任何json響應(yīng)實(shí)質(zhì)上歸結(jié)為將字符串列表中的相關(guān)條目分組在一起,且隨后將字符串列表轉(zhuǎn)換成json格式。在實(shí)施方案中,此模式在整個(gè)腳本執(zhí)行環(huán)境150和裝置管理器160上重復(fù)。在相反方向上,即將到來(lái)的json消息一般轉(zhuǎn)換成“et_stringlist”格式以用于內(nèi)部使用。因此,這些字符串列表在兩個(gè)方向上經(jīng)過(guò)圖7所說(shuō)明的各種隊(duì)列。將json轉(zhuǎn)換成內(nèi)部字符串列表的過(guò)程在本文中的其它地方描述,因?yàn)?,在本文中的其它地方描述的json解析器內(nèi),存在對(duì)例如dm_registerdevice()、ut_setsymbol()、ut_setpropertystate()、su_setscript()、ma_setsymbol()以及ma_runmarlin()等函數(shù)的調(diào)用。所有這些函數(shù)最終在字符串列表中創(chuàng)建條目,所述條目隨后被其它邏輯使用。在實(shí)施方案中,字符串列表還對(duì)字典抽象很重要。因此,在實(shí)施方案中,字符串列表形成基礎(chǔ)腳本語(yǔ)言和基礎(chǔ)語(yǔ)言解析器內(nèi)的所有符號(hào)值的基礎(chǔ)。
現(xiàn)將關(guān)于dm_flushstatusupdates()函數(shù)描述產(chǎn)生呈數(shù)據(jù)架構(gòu)的數(shù)據(jù)格式(例如,json)的響應(yīng)的一個(gè)實(shí)例,所述函數(shù)產(chǎn)生呈數(shù)據(jù)架構(gòu)的數(shù)據(jù)格式的輸出,所述輸出描述所有裝置和已通過(guò)對(duì)dm_devmgrnfy()函數(shù)的驅(qū)動(dòng)器調(diào)用來(lái)改變的屬性:
在json為數(shù)據(jù)格式的實(shí)施方案中,以上列表15中的邏輯的最終結(jié)果是類似于以下的消息包:
在此情況下,以上json消息通過(guò)列表15的邏輯產(chǎn)生,因?yàn)椤癰rightness”屬性的值通過(guò)驅(qū)動(dòng)器設(shè)定為25,且同一裝置沒(méi)有其它屬性被更改(否則,那些屬性將形成同一消息的部分)?!癷d”、“name”以及“group”屬性通過(guò)列表15的邏輯添加到消息以用于清晰性,即使那些屬性沒(méi)有改變。
應(yīng)理解,所有其它情況以與上文描述的dm_flushstatusupdates()函數(shù)類似的方式操作。如列表15中所示的相同技術(shù)可用于將任何內(nèi)部字符串列表轉(zhuǎn)換成廣泛范圍的其它數(shù)據(jù)格式(即,除json外)以用于廣泛范圍的其它目的。
6.8.裝置群組
在實(shí)施方案中,數(shù)據(jù)架構(gòu)實(shí)現(xiàn)任意命名的裝置群組的創(chuàng)建,所述裝置群組包括任意數(shù)目的裝置作為成員。這些裝置群組可用于將裝置組織成方便的集合以供用戶使用。
然而,裝置管理器160可擴(kuò)展這些裝置群組的功能性和效用。這些裝置群組對(duì)數(shù)據(jù)管理器160表現(xiàn)為虛擬裝置,保持在平臺(tái)110上,沒(méi)有對(duì)應(yīng)的物理顯示。一個(gè)擴(kuò)展是這些裝置群組可通過(guò)數(shù)據(jù)架構(gòu)和通過(guò)腳本用于設(shè)定任何成員裝置的屬性的值,所述成員裝置具有所述屬性。
在實(shí)施方案中,裝置群組的設(shè)定處于dm_setdeviceproperty()函數(shù)的實(shí)施內(nèi),所述函數(shù)在下方的列表16中說(shuō)明:
在列表16中說(shuō)明的邏輯的凈作用是,當(dāng)給定屬性(例如,“brightness”)的給定值賦給裝置群組時(shí),所述給定值賦給表示所述裝置群組的虛擬裝置的屬性。邏輯隨后提取裝置的字符串列表,所述裝置是來(lái)自裝置管理器160的內(nèi)部群組注冊(cè)表的裝置群組的成員;并循環(huán)經(jīng)過(guò)所有成員裝置,調(diào)用dm_getdeviceproperty()函數(shù)以確定裝置是否具有給定屬性。對(duì)于具有給定屬性的每一成員裝置,邏輯通過(guò)調(diào)用dm_setdeviceproperty()函數(shù)將給定值賦給給定屬性。另一方面,對(duì)于不具有給定屬性的每一成員裝置,不執(zhí)行賦值。
作為實(shí)例,假設(shè)房屋中的所有裝置都是名稱為“室內(nèi)裝置”的裝置群組的部分。為將房屋中的所有可調(diào)光裝置變成50%亮度,腳本需要的所有事物為單個(gè)語(yǔ)句:
@indoor_devices.brightness=50;
此單個(gè)腳本語(yǔ)句將使得裝置管理器160循環(huán),如列表16中所說(shuō)明,將50的值賦給在具有“brightness”屬性的“室內(nèi)裝置”群組中的每一裝置的“brightness”屬性。“室內(nèi)裝置”群組中的沒(méi)有“brightness”屬性的那些裝置將保持不變。此給裝置分組并賦予屬性值的能力簡(jiǎn)化編寫腳本,從而減少通信業(yè)務(wù)的量,并實(shí)現(xiàn)通用腳本的創(chuàng)建,所述通用腳本可通過(guò)簡(jiǎn)單地將在給定設(shè)施處的物理裝置分配給一個(gè)或多個(gè)裝置群組來(lái)在許多不同情況下應(yīng)用。
尤其地,因?yàn)檠b置群組通過(guò)虛擬裝置表示,所以如果裝置群組先前不具有“brightness”屬性,那么當(dāng)?shù)谝淮螌⒕哂小癰rightness”屬性的裝置添加到所述裝置群組時(shí),所述裝置群組將獲取“brightness”屬性。這是因?yàn)橐惶砑泳哂小癰rightness”屬性的裝置,dm_setdeviceproperty()函數(shù)就將使得“改變”消息以裝置群組的“確認(rèn)”狀態(tài)發(fā)送到控制器130和/或平臺(tái)110。繼而,可用于腳本gui中的裝置群組的屬性的列表隨后將自動(dòng)地包含“brightness”屬性。另外,執(zhí)行中的腳本將能夠使用“@indoor_devices.brightness”來(lái)讀取或?qū)懭搿癰rightness”屬性,所述“@indoor_devices.brightness”最終解析成對(duì)dm_getdeviceproperty()函數(shù)的調(diào)用(或通過(guò)使用內(nèi)部高速緩存短路)。
6.9.裝置管理器初始化
現(xiàn)將描述初始化裝置管理器160并注冊(cè)驅(qū)動(dòng)器166的過(guò)程。在實(shí)施方案中,在裝置管理器160的運(yùn)行時(shí)間操作之前進(jìn)行的初始化活動(dòng)包含:
(1)一旦靜態(tài)地初始化,裝置管理器160就首先建立到平臺(tái)110的連接,且認(rèn)證自身和網(wǎng)關(guān)120,所述裝置管理器駐留在所述網(wǎng)關(guān)中;
(2)在成功認(rèn)證(例如,通過(guò)來(lái)自平臺(tái)110的響應(yīng)指示)之后,裝置管理器160首先發(fā)送“配置”消息,且隨后訂閱平臺(tái)110上的模式,所述平臺(tái)如本文中的其它地方所論述,保持所有屬性信息和驅(qū)動(dòng)器層164所需要的驅(qū)動(dòng)器映射。裝置管理器160還訂閱本地網(wǎng)關(guān)120的所有裝置。訂閱意味著,平臺(tái)110將發(fā)送所有相關(guān)項(xiàng)的完整“放置,”且隨后,如果任何項(xiàng)或?qū)傩愿淖?,那么平臺(tái)110將發(fā)送消息以更新網(wǎng)關(guān)120的所有訂閱過(guò)程,包含裝置管理器160、腳本執(zhí)行環(huán)境150和/或本地控制器130;
(3)一旦已接收到模式,裝置管理器160就調(diào)用dm_getalldevices()函數(shù),并將結(jié)果的裝置快照發(fā)送到平臺(tái)110和/或控制器130,由此確保所述平臺(tái)和/或控制器的裝置狀態(tài)的圖像匹配通過(guò)注冊(cè)的驅(qū)動(dòng)器166返回的圖像;以及
(4)在統(tǒng)一裝置管理器和腳本管理器線程715的情況下,對(duì)所有腳本的訂閱還從平臺(tái)110發(fā)送到腳本執(zhí)行環(huán)境150以被腳本執(zhí)行環(huán)境150使用。
當(dāng)新驅(qū)動(dòng)器被創(chuàng)建(例如,針對(duì)新協(xié)議、新裝置等)時(shí),新驅(qū)動(dòng)器可添加到模式。因此,在網(wǎng)關(guān)120上的訂閱模式(例如,作為配置文件存儲(chǔ)在平臺(tái)110上)的裝置管理器160的初始化期間,裝置管理器160解析模式,包含待激活的所有驅(qū)動(dòng)器的列表和那些驅(qū)動(dòng)器可需要的任何另外的初始化參數(shù)(例如,ip地址、端口號(hào)等)。隨后例如使用dm_devmgrinit()函數(shù)來(lái)注冊(cè)經(jīng)解析的驅(qū)動(dòng)器,使得到裝置管理器160的初始化完成時(shí),裝置管理器160精確地連接到經(jīng)定義用于其操作環(huán)境的驅(qū)動(dòng)器的集合。
6.10.通用驅(qū)動(dòng)器抽象
在實(shí)施方案中,裝置管理器160包括通用驅(qū)動(dòng)器(ud)抽象層。圖9說(shuō)明根據(jù)實(shí)施方案的此通用驅(qū)動(dòng)器抽象層。此通用驅(qū)動(dòng)器抽象層910可通過(guò)以標(biāo)準(zhǔn)化方式處理任何驅(qū)動(dòng)器所需的邏輯的大部分而不管傳輸介質(zhì),大幅度地簡(jiǎn)化并統(tǒng)一在通用驅(qū)動(dòng)器抽象基礎(chǔ)上構(gòu)建的所有驅(qū)動(dòng)器166的實(shí)施,使得創(chuàng)建任何驅(qū)動(dòng)器所需的唯一代碼僅是從硬件裝置讀取和/或?qū)懭胨枰?,如且在被通用?qū)動(dòng)器抽象告知(例如,基于在驅(qū)動(dòng)器注冊(cè)時(shí)設(shè)定的配置參數(shù))時(shí)。此抽象允許以真的與驅(qū)動(dòng)器無(wú)關(guān)且與傳輸無(wú)關(guān)的方式,快速且可靠地實(shí)施針對(duì)現(xiàn)有和新傳輸協(xié)議的接口。因此,通用驅(qū)動(dòng)器抽象層910可表示裝置管理器160的強(qiáng)大的特征。
在實(shí)施方案中,所有驅(qū)動(dòng)器166是直接地基于通用抽象層910,而非裝置管理器抽象層162。通用驅(qū)動(dòng)器抽象層910向裝置管理器抽象層162注冊(cè)每一驅(qū)動(dòng)器166,由此允許通用驅(qū)動(dòng)器抽象代碼本身插入在裝置管理器抽象層162與所述裝置管理器抽象層的每一不同的所注冊(cè)低級(jí)驅(qū)動(dòng)器166的回調(diào)和傳輸特定代碼之間。在通用驅(qū)動(dòng)器抽象層910在裝置管理器160內(nèi)的位置中,所述通用驅(qū)動(dòng)器抽象層可提供其自身的行為和注冊(cè)需要,以便實(shí)現(xiàn)所有可能的驅(qū)動(dòng)器活動(dòng)(例如,輪詢、事件驅(qū)動(dòng)的活動(dòng)、硬件讀取和/或?qū)懭氩僮?、恢?fù)、調(diào)試控制臺(tái)界面、pdev至ldev映射、通過(guò)映射片段基于屬性變化進(jìn)行的調(diào)度等)。在許多情況下,結(jié)果是所需的驅(qū)動(dòng)器特定的代碼僅為數(shù)百行,即,僅足夠在請(qǐng)求時(shí)與基本傳輸機(jī)制通信。圖9說(shuō)明僅少量可能的驅(qū)動(dòng)器166,包含zwavetm驅(qū)動(dòng)器166b、phidgettm驅(qū)動(dòng)器166c以及modbustm驅(qū)動(dòng)器166d,這些驅(qū)動(dòng)器分別支持zwavetm、phidgettm以及modbustm。這些驅(qū)動(dòng)器166中的一些,例如zwave驅(qū)動(dòng)器166b,可比其它驅(qū)動(dòng)器更加復(fù)雜,因?yàn)槔鐉wavetm驅(qū)動(dòng)器166b可需要將維護(hù)和發(fā)現(xiàn)功能性并入在其本身的協(xié)議內(nèi)。
在實(shí)施方案中,驅(qū)動(dòng)器166包含實(shí)施虛擬裝置的虛擬驅(qū)動(dòng)器166a。盡管虛擬驅(qū)動(dòng)器166a可向通用驅(qū)動(dòng)器抽象層910注冊(cè),但所述虛擬驅(qū)動(dòng)器不需要物理至邏輯映射層920的復(fù)雜性,且因此,不需要利用物理至邏輯映射層920的注冊(cè)表。所有其它驅(qū)動(dòng)器166(例如,驅(qū)動(dòng)器166b至166e)一般將利用這些注冊(cè)表,因?yàn)檫@些驅(qū)動(dòng)器將通常需要與物理裝置和傳輸協(xié)議交互。
在實(shí)施方案中,通用驅(qū)動(dòng)器抽象層910向裝置管理器抽象層162注冊(cè)其自身的回調(diào)函數(shù),同時(shí)在內(nèi)部管理通過(guò)相應(yīng)的驅(qū)動(dòng)器166注冊(cè)的任何回調(diào)函數(shù)。通用驅(qū)動(dòng)器抽象層910向裝置管理器抽象層162注冊(cè)的回調(diào)函數(shù)可包括以下邏輯:
●如果ll代碼已向通用驅(qū)動(dòng)器抽象層910注冊(cè)裝置類型特定的回調(diào)函數(shù),那么在登錄時(shí)調(diào)用裝置類型特定的回調(diào)函數(shù),且隨后在退出時(shí)再次調(diào)用裝置類型特定的回調(diào)函數(shù);
●對(duì)于“kdevmgrputdevice”和“kdevmgrsetproperty”命令,調(diào)用驅(qū)動(dòng)器特定的低級(jí)回調(diào),且如果未被禁止,則通過(guò)調(diào)用dm_devmgrnfy()函數(shù)來(lái)處理通知;
●對(duì)于“kdevmgrgetproprty”命令,調(diào)用低級(jí)回調(diào);以及
●對(duì)于“kdevmgrdeleteproperty”和“kdevmgrremovedevice”命令,調(diào)用低級(jí)回調(diào)并自動(dòng)地處理通知。
在實(shí)施方案中,通用驅(qū)動(dòng)器抽象層910還提供內(nèi)置裝置和屬性迭代器(例如,以被裝置管理器抽象層162使用),其通過(guò)使用標(biāo)準(zhǔn)注冊(cè)表來(lái)操作,由此允許大部分驅(qū)動(dòng)器166避免必需自身實(shí)施此功能性。然而,驅(qū)動(dòng)器166可選擇通過(guò)向通用驅(qū)動(dòng)器抽象層910注冊(cè)替代的迭代器來(lái)覆蓋這些默認(rèn)迭代器。
在實(shí)施方案中,通用驅(qū)動(dòng)器抽象層910提供標(biāo)準(zhǔn)化通用驅(qū)動(dòng)器線程,所述線程實(shí)施初始化每一驅(qū)動(dòng)器166(和任何物理裝置)并在針對(duì)來(lái)自物理裝置的屬性變化進(jìn)行輪詢的循環(huán)中運(yùn)行每一驅(qū)動(dòng)器166所必需的邏輯。此邏輯還可處理通用驅(qū)動(dòng)器線程的終止和清除。通用驅(qū)動(dòng)器線程可為“協(xié)作”線程,因?yàn)樗鐾ㄓ抿?qū)動(dòng)器線程通過(guò)所述架構(gòu)的主循環(huán)邏輯調(diào)度,且在驅(qū)動(dòng)器166的執(zhí)行期間,其它線程,例如vm230和/或其它驅(qū)動(dòng)器166,被阻斷。此協(xié)作通用驅(qū)動(dòng)器線程的優(yōu)點(diǎn)是,所述通用驅(qū)動(dòng)器線程可使用api,所述api訪問(wèn)全局變量和注冊(cè)表而不必?fù)?dān)心造成其它上下文中的混淆。這與搶占式“工作者”線程形成對(duì)比,所述線程與所有其它活動(dòng)異步地且并行地執(zhí)行與傳輸層的通信。通常,工作者線程必須通過(guò)以下操作來(lái)獲得其輸入并寫入其輸出:變得暫時(shí)性協(xié)作,或?qū)f(xié)作通用驅(qū)動(dòng)器線程的這些活動(dòng)排隊(duì)以進(jìn)行處理。
根據(jù)實(shí)施方案,協(xié)作通用驅(qū)動(dòng)器線程的基礎(chǔ)邏輯可如下實(shí)施:
在實(shí)施方案中,這是通用驅(qū)動(dòng)器抽象層910的全部邏輯,除了少數(shù)效用函數(shù)。大部分復(fù)雜性與通過(guò)物理至邏輯層920創(chuàng)建并維護(hù)的注冊(cè)表和映射環(huán)境相關(guān)聯(lián),所述物理至邏輯層通過(guò)所注冊(cè)的驅(qū)動(dòng)器166的代碼明確地調(diào)用。
在實(shí)施方案中,通用驅(qū)動(dòng)器抽象層910具有以下屬性中的一個(gè)或多個(gè):
●提供虛擬驅(qū)動(dòng)器,所述虛擬驅(qū)動(dòng)器包含使“智能”行為與不同的虛擬裝置類型相關(guān)聯(lián)的能力;
●提供一個(gè)或多個(gè)api以簡(jiǎn)化新驅(qū)動(dòng)器的創(chuàng)建;
●提供通用驅(qū)動(dòng)器抽象以簡(jiǎn)化驅(qū)動(dòng)器166的邏輯;
●提供物理/邏輯抽象以在裝置屬性在任一方向上變化時(shí),借助映射片段映射到物理裝置(pdev)和一個(gè)或多個(gè)相關(guān)聯(lián)的邏輯裝置(ldevs)的注冊(cè)表表示和從所述注冊(cè)表映射。映射片段可用基本的基礎(chǔ)腳本語(yǔ)言的第二變型寫入(所描述的適配器語(yǔ)言是基礎(chǔ)腳本語(yǔ)言的第一變型);和/或
●對(duì)每一驅(qū)動(dòng)器到調(diào)試和維護(hù)控制臺(tái)的接口提供抽象支持。
6.11.虛擬驅(qū)動(dòng)器
在實(shí)施方案中,虛擬驅(qū)動(dòng)器166a負(fù)責(zé)實(shí)施虛擬裝置,即,沒(méi)有對(duì)應(yīng)的硬件的裝置。因?yàn)樘摂M裝置的屬性不駐留在通過(guò)較大環(huán)境提供的標(biāo)準(zhǔn)屬性注冊(cè)表中,所以當(dāng)例如通過(guò)腳本寫入虛擬裝置屬性時(shí),一般不需要進(jìn)行任何操作,因?yàn)樾轮狄驯粚懭氲阶?cè)表。當(dāng)通過(guò)腳本讀取虛擬裝置屬性時(shí),它的值可從注冊(cè)表獲得。因此,一般來(lái)說(shuō),預(yù)期虛擬驅(qū)動(dòng)器166a沒(méi)有超過(guò)通過(guò)本文中在其它地方描述的通用驅(qū)動(dòng)器回調(diào)提供的行為的積極任務(wù)。
在實(shí)施方案中,虛擬驅(qū)動(dòng)器166a能夠注冊(cè)裝置實(shí)施器,所述裝置實(shí)施器允許創(chuàng)建具有復(fù)雜且活動(dòng)的屬性行為的虛擬裝置。此類虛擬裝置可用于將功能性添加到數(shù)據(jù)架構(gòu)。為說(shuō)明此概念,現(xiàn)將論述兩個(gè)實(shí)例:“定時(shí)器”裝置,和“數(shù)據(jù)流”裝置。
裝置實(shí)施器可在虛擬驅(qū)動(dòng)器166a的初始化期間注冊(cè),且本質(zhì)上注冊(cè)通過(guò)通用驅(qū)動(dòng)器抽象層910調(diào)用的另外裝置類型特定的回調(diào)函數(shù),如在列表17中所說(shuō)明。注冊(cè)這些回調(diào)的虛擬裝置類型可被稱為“智能”虛擬裝置(所述虛擬裝置可在本文中被稱為“s-vdev”),而不注冊(cè)這些回調(diào)函數(shù)的虛擬裝置是有效被動(dòng)存儲(chǔ)裝置或“啞”虛擬裝置(所述虛擬裝置可在本文中被稱為“vdev”)?!岸〞r(shí)器”裝置的典型的s-vdev注冊(cè)可看起來(lái)如下:
“devinittermfn”回調(diào)函數(shù)負(fù)責(zé)裝置類型特定的初始化和終止,如在“定時(shí)器”裝置的以下實(shí)例中所說(shuō)明:
“定時(shí)器”裝置的對(duì)應(yīng)的輪詢函數(shù)如下說(shuō)明:
如上文所示出,輪詢函數(shù)處理與定時(shí)器的到期相關(guān)聯(lián)的所有邏輯,同時(shí)還動(dòng)態(tài)地更改輪詢速率以使裝置實(shí)施開(kāi)銷最小化。
用于處理在定時(shí)器狀態(tài)被更改(例如,通過(guò)用戶在界面114的gui中或在腳本中更改)時(shí)發(fā)生的情況的邏輯,在所注冊(cè)的裝置類型的回調(diào)函數(shù)內(nèi)的“kdevmgrsetproperty”情況中找到,如下:
以上代碼產(chǎn)生活動(dòng)的虛擬定時(shí)器裝置,所述裝置的調(diào)用經(jīng)由通用驅(qū)動(dòng)器抽象層910完全控制。其它驅(qū)動(dòng)器166有可能利用此功能性來(lái)創(chuàng)建“混合”裝置。當(dāng)基于物理/邏輯抽象層910時(shí),這些驅(qū)動(dòng)器可實(shí)施在物理/邏輯抽象層910的片段(例如,用類似于適配器語(yǔ)言并類似地基于基礎(chǔ)腳本語(yǔ)言的通用驅(qū)動(dòng)器語(yǔ)言寫入)內(nèi)的任何邏輯。
智能虛擬裝置的另一實(shí)例是“數(shù)據(jù)流”裝置。“數(shù)據(jù)流”裝置是復(fù)雜得多的虛擬裝置,所述虛擬裝置的多至例如十個(gè)“信道”屬性值可通過(guò)其它裝置屬性值驅(qū)動(dòng)(例如,經(jīng)由注冊(cè)表,且因此不管驅(qū)動(dòng)器),且所述虛擬裝置的那些信道屬性值和所述信道屬性值的任何改變可準(zhǔn)確地記錄到平臺(tái)110(例如,且在界面114的gui中觀察到)。因此,任何裝置屬性的詳細(xì)按時(shí)間排序歷史可在平臺(tái)110上創(chuàng)建。本質(zhì)上,“數(shù)據(jù)流”裝置充當(dāng)實(shí)現(xiàn)對(duì)裝置屬性的時(shí)間歷史的檢查的內(nèi)置示波器或邏輯分析器。“數(shù)據(jù)流”裝置可使用在根本上與“定時(shí)器”裝置類似的所注冊(cè)回調(diào)函數(shù)來(lái)實(shí)施。
6.12.物理/邏輯層
在實(shí)施方案中,物理/邏輯層920駐留在通用驅(qū)動(dòng)器抽象層910下方,并通過(guò)使用與所涉及的pdev和ldev相關(guān)聯(lián)的腳本,將物理裝置表示(pdev)映射到邏輯裝置表示(ldev)。這些映射可用基礎(chǔ)腳本語(yǔ)言寫入,或用類似于用于在驅(qū)動(dòng)器層164中創(chuàng)建片段的適配器語(yǔ)言的基礎(chǔ)腳本語(yǔ)言的子集寫入。在基于通用驅(qū)動(dòng)器抽象層910的驅(qū)動(dòng)器166的情況下,pdev和ldev屬性可保持在以與標(biāo)準(zhǔn)架構(gòu)注冊(cè)表相同或類似的方式實(shí)施的注冊(cè)表的完全單獨(dú)的集合中,但僅對(duì)向通用驅(qū)動(dòng)器抽象層910注冊(cè)的驅(qū)動(dòng)器可見(jiàn)。
在實(shí)施方案中,物理/邏輯層920解決兩個(gè)問(wèn)題:(1)將硬件數(shù)據(jù)結(jié)構(gòu)和命令協(xié)議映射到pdev屬性并從pdev屬性映射;以及(2)每當(dāng)裝置屬性在任一方向上改變時(shí),通過(guò)在適當(dāng)時(shí)調(diào)用映射片段來(lái)將pdev和ldev屬性映射到彼此和從彼此映射。ldev可與通過(guò)公布ldev而為系統(tǒng)的其余部分所知道(即,經(jīng)由驅(qū)動(dòng)器層164)的裝置相關(guān)聯(lián)。物理裝置可具有復(fù)雜的結(jié)構(gòu),所述結(jié)構(gòu)經(jīng)設(shè)計(jì)以精確地映射到特定硬件布置,并使將硬件值傳遞到傳輸協(xié)議和從傳輸協(xié)議傳遞硬件值的過(guò)程自動(dòng)化,使得低級(jí)驅(qū)動(dòng)器代碼本身不需要知道這如何進(jìn)行。低級(jí)驅(qū)動(dòng)器代碼簡(jiǎn)單地讀取和寫入值,如、在以及當(dāng)它被請(qǐng)求用通過(guò)物理/邏輯層920提供的傳輸所需要的所有參數(shù)來(lái)這樣做。因此,低級(jí)驅(qū)動(dòng)器代碼相對(duì)較簡(jiǎn)單,且問(wèn)題移動(dòng)到pdev、ldev以及用于將任何給定pdev連接到一個(gè)或多個(gè)子ldev的映射片段的規(guī)范中,所述子ldev繼而經(jīng)由驅(qū)動(dòng)器層164映射到數(shù)據(jù)架構(gòu)。
正如適配器語(yǔ)言一樣,用于在物理/邏輯層920中寫入映射片段的物理/邏輯語(yǔ)言可為基礎(chǔ)腳本語(yǔ)言的變型。然而,所述映射片段運(yùn)行的上下文通過(guò)所涉及的pdev和ldev和在pdev或ldev中的屬性預(yù)定義,所述屬性使得映射片段在第一位置運(yùn)行。如適配器語(yǔ)言一樣,每當(dāng)映射片段運(yùn)行時(shí),物理/邏輯語(yǔ)言可具有從一個(gè)裝置到另一裝置的隱含方向。當(dāng)在從pdev到ldev的方向上運(yùn)行時(shí),此方向可被稱為“ktological,”且當(dāng)在從ldev至pdev的方向上運(yùn)行時(shí),此方向可被稱為“ktophysical?!鳖愃朴谶m配器語(yǔ)言,此方向性可通過(guò)使用“@”令牌或“@@”令牌來(lái)指示,所述“@”令牌指示屬性與映射的源側(cè)上的裝置相關(guān),所述“@@”令牌指示屬性與映射的目標(biāo)側(cè)上的裝置相關(guān)。在映射的任一側(cè)上的屬性可按需要簡(jiǎn)單地通過(guò)使用適合的令牌在任何片段上下文中指定、讀取和寫入。
為說(shuō)明物理/邏輯層920內(nèi)的邏輯如何工作,將描述現(xiàn)實(shí)世界的實(shí)例。所述實(shí)例將使用通用輸入/輸出(gpio)modbustm裝置來(lái)示出此裝置可如何經(jīng)由物理/邏輯層920一直來(lái)回映射數(shù)據(jù)架構(gòu)裝置屬性和界面114的gui。所選擇的gpio裝置是datanabai8_r13(具有8個(gè)模擬輸入和13個(gè)繼電器輸出的裝置)。所述實(shí)例將嘗試在此硬件裝置上映射通用輸入/輸出(i/o)引腳中的一些,以便創(chuàng)建混合裝置,所述混合裝置表現(xiàn)得與專用恒溫器硬件裝置相同。為了進(jìn)行此操作,gpio裝置上的ain必須連接到熱敏電阻以便測(cè)量溫度,且兩個(gè)繼電器輸出需要連接到空調(diào)和加熱器單元的控件。用適合的映射片段,可創(chuàng)建與實(shí)際恒溫器沒(méi)有差別的混合裝置。
首先,gpio裝置的modbustm規(guī)范可轉(zhuǎn)換成通過(guò)物理/邏輯層920使用的格式。在所描述的實(shí)例中,此格式是xml。然而,應(yīng)理解,其它格式是可能的。modbustm定義根據(jù)8位和16位寄存器和一位邏輯“線圈”來(lái)定義裝置。這些硬件寄存器具有特定的目的且可被包裝。每一寄存器在裝置內(nèi)具有唯一地址。這是與在本文中的其它地方所論述的數(shù)據(jù)架構(gòu)屬性或內(nèi)部注冊(cè)表不同的表示數(shù)據(jù)的方式。在從裝置規(guī)范創(chuàng)建的xml中對(duì)ai8_r13物理裝置類型的定義可為如下:
裝置屬性順序地列出在<properties>字段內(nèi)。在此實(shí)例中,每一裝置屬性具有基于裝置規(guī)范的<name>字段,匹配硬件的類型的<type>字段,以驅(qū)動(dòng)器需要或理解的格式(例如,在此情況下為整數(shù))指定屬性地址的<address>字段,以及指定此裝置屬性是否需要被讀取和寫入或是否可被忽略的<used>字段。尤其地,裝置屬性類型包括大小設(shè)定的整數(shù)(例如,int8、int16、int32等),且還可包括至多二維的數(shù)組(例如,int16[8][5])。這簡(jiǎn)單地反映硬件,所述硬件必須得到匹配以便承擔(dān)打包和解包工作,否則所述工作將必須通過(guò)低級(jí)驅(qū)動(dòng)器代碼執(zhí)行。這意味著,因?yàn)楸仨氃趫?zhí)行物理至邏輯和/或邏輯至物理映射時(shí)訪問(wèn)這些裝置屬性的映射片段是基于基礎(chǔ)腳本語(yǔ)言,所以基礎(chǔ)腳本語(yǔ)言應(yīng)能夠理解大小設(shè)定的整數(shù),以及在裝置屬性內(nèi)索引的數(shù)組(例如,“@@.input[3][4]”)。雖然先前尚未關(guān)于基礎(chǔ)腳本語(yǔ)言描述此特征,但所述特征可為基礎(chǔ)腳本語(yǔ)言和其變型中固有的,即使所述特征通??蓛H在硬件考量所需要時(shí)在映射片段內(nèi)使用。一般地,到這些裝置屬性從驅(qū)動(dòng)器層164的另一側(cè)輸出時(shí),已在物理/邏輯層920或驅(qū)動(dòng)器層164中解析非標(biāo)準(zhǔn)數(shù)據(jù)類型大小的所有證據(jù)。
gpio裝置映射到其上并從其映射的邏輯恒溫器裝置類型(lthermostat)的定義可為如下:
尤其地,邏輯恒溫器裝置類型的定義缺少非標(biāo)準(zhǔn)數(shù)據(jù)類型大小,且更接近在數(shù)據(jù)架構(gòu)內(nèi)的恒溫器裝置類型的規(guī)范,但在許多方面不同。
如所說(shuō)明,lthermostat從祖先邏輯裝置類型“l(fā)device”繼承一些屬性,即,“id”、“name”以及“type”屬性,所述屬性通過(guò)由驅(qū)動(dòng)器層164實(shí)施的映射來(lái)橋接到對(duì)應(yīng)的數(shù)據(jù)架構(gòu)裝置類型“thermostat”的間距,所述“thermostat”本身可如下定義:
如lthermostat一樣,公共裝置類型的恒溫器從祖先裝置類型“pubdevice”繼承基礎(chǔ)屬性。如在本文中的其它地方所描述,驅(qū)動(dòng)器層164將ldev中的屬性雙向地映射到公共裝置類型中的對(duì)應(yīng)的屬性。因?yàn)閘dev定義在向通用驅(qū)動(dòng)器抽象層910注冊(cè)的所有驅(qū)動(dòng)器上共用,所以ldev屬性往往為在所有不同驅(qū)動(dòng)器上所需的基礎(chǔ)屬性的集合,以便經(jīng)由驅(qū)動(dòng)器層164進(jìn)行連接。因此,從pdev到ldev到公共裝置的過(guò)程是逐漸簡(jiǎn)化和抽象成新手用戶應(yīng)容易理解的形式中的一個(gè)過(guò)程。
向通用驅(qū)動(dòng)器抽象層910注冊(cè)的所有驅(qū)動(dòng)器166可共用ldev類型。因此,對(duì)于在“通用”條件下的所有驅(qū)動(dòng)器,在驅(qū)動(dòng)器層164中可僅存在一個(gè)條目。這意味著,所有驅(qū)動(dòng)器166將相同地從ldev層向上操作,而沒(méi)有對(duì)低級(jí)驅(qū)動(dòng)器代碼來(lái)進(jìn)一步考慮除pdev定義外的任何事情的任何需要,所述pdev定義本身可與驅(qū)動(dòng)器的代碼以及尋址和命令模式緊密相關(guān)。
作為參考,在lthermostat裝置類型中出現(xiàn)的屬性的一些實(shí)例驅(qū)動(dòng)器層164定義如下:
一旦已指定所有裝置類型定義,就創(chuàng)建pdev和ldev的實(shí)際實(shí)例。這些可經(jīng)由xml如下定義:
如所說(shuō)明,pdev定義以適合于傳輸?shù)母袷街付ㄑb置地址,并指定裝置類型。此信息用于創(chuàng)建裝置,并經(jīng)由modbustm驅(qū)動(dòng)器166d開(kāi)始與裝置通信。裝置的屬性在mb_ai8_r13裝置類型中定義,且<address>、<access>以及<type>字段指令驅(qū)動(dòng)器166d如何和何時(shí)讀取和寫入那些裝置屬性。已從物理裝置的硬件讀取屬性值,物理/邏輯層920可接收呈在pdev中指定的格式(例如,int16[8])的所提取值,按需要對(duì)所述值解包,并將所述值寫入到內(nèi)部驅(qū)動(dòng)器pdev注冊(cè)表值。然而,因?yàn)閜dev未經(jīng)由驅(qū)動(dòng)器層164連接,所以這些屬性值都對(duì)系統(tǒng)的其余部分不可見(jiàn)(即,在物理/邏輯層920的另一側(cè)上)。
為使這些屬性值可見(jiàn),可在適合時(shí)將所述屬性值移動(dòng)到在“mbblahblahxxx01ch1”中定義的ldev中。ldev裝置可從給定ldev規(guī)范直接地創(chuàng)建。所述ldev裝置的所有屬性類型都是已知的,且可通過(guò)系統(tǒng)的其余部分經(jīng)由驅(qū)動(dòng)器層164寫入到ldev中。然而,在另一方向上,另外的邏輯可用于使這些屬性成為可寫入到對(duì)應(yīng)的pdev的形式。
這些邏輯位都在pdev和ldev的<mappings>字段中指定。<mappings>字段可包含任何數(shù)目的個(gè)別<mapping>條目,所述<mapping>條目每個(gè)指定待運(yùn)行的驅(qū)動(dòng)器映射片段,用于映射的目標(biāo)裝置(源裝置通過(guò)上下文暗指),將在驅(qū)動(dòng)器映射片段運(yùn)行時(shí)交給所述驅(qū)動(dòng)器映射片段的任何參數(shù)(如果需要),以及源屬性的列表,所述源屬性中的任何屬性在其在隱含的寫入方向上發(fā)生改變時(shí),將觸發(fā)待運(yùn)行的指定驅(qū)動(dòng)器映射片段。對(duì)于ldev規(guī)范,隱含的寫入方向是“ktophysical,”且目標(biāo)裝置通過(guò)定義為父pdev。對(duì)于某一pdev,可存在多個(gè)子ldev裝置。因此,雖然所述方向始終是“ktological,”但目標(biāo)裝置可隨每一映射改變。這允許通過(guò)專用映射片段集合來(lái)處理映射邏輯的完整集合,所述映射片段中的每一個(gè)聚焦于特定的改變的屬性。這可尤其適用于一般化裝置處理,例如,在zwavetm的情況下,其中屬性被發(fā)現(xiàn)且可基于動(dòng)態(tài)發(fā)現(xiàn)的命令類別來(lái)獨(dú)立地處理,所述裝置聲稱能夠支持所述命令類別。
所引用的映射片段“tothermostat_ai8_r13”的定義可如下在列表18中:
因?yàn)榛旌虾銣仄鲝幕旧稀皢 眊pio信號(hào)產(chǎn)生,所以此片段可表示最壞情況,只要關(guān)注的片段復(fù)雜性。大部分映射片段可僅為幾行長(zhǎng)。如所說(shuō)明,在列表18中用xml表示的片段的代碼包括兩個(gè)可選地參數(shù)化的腳本定義。這兩個(gè)腳本定義中的每一個(gè)用全包含的基礎(chǔ)腳本語(yǔ)言的子集寫入(例如,沒(méi)有基礎(chǔ)腳本語(yǔ)言的實(shí)時(shí)特征)。
在實(shí)施方案中,物理/邏輯層920和驅(qū)動(dòng)器層164中的片段必須一直運(yùn)行到結(jié)束,而不會(huì)變得在無(wú)限循環(huán)中懸掛或執(zhí)行其它長(zhǎng)度的操作,因?yàn)檫@些片段延遲對(duì)與同一驅(qū)動(dòng)器相關(guān)聯(lián)的其它裝置的處理。如果在片段的調(diào)用之間需要持續(xù)的狀態(tài),那么所述持續(xù)的狀態(tài)可通過(guò)將狀態(tài)值存儲(chǔ)到所涉及的裝置的可見(jiàn)或隱藏的屬性(例如,隱藏屬性通過(guò)列表18的所說(shuō)明片段中的前導(dǎo)下劃線字符“_”指示)中來(lái)實(shí)施。例如,列表18中的恒溫器邏輯相當(dāng)廣泛地進(jìn)行此操作。尤其地,列表18中的片段還使用基礎(chǔ)腳本語(yǔ)言的擴(kuò)展數(shù)組句法(例如,“@@.relay[coolrelay]=off”),以及其從裝置中的映射規(guī)范傳遞將用于腳本中的參數(shù)的能力。
使裝置與裝置類型相關(guān)聯(lián)并填寫必要的映射可略復(fù)雜。因此,在實(shí)施方案中,通過(guò)物理/邏輯層920提供的抽象提供模板(例如,在xml中指定),所述模板可基于物理裝置類型來(lái)選擇。這些模板可使創(chuàng)建pdev、ldev以及用于新近添加的裝置的映射片段的過(guò)程自動(dòng)化。例如,如果用戶經(jīng)由zwave驅(qū)動(dòng)器將新硬件恒溫器裝置連接到網(wǎng)關(guān)120,那么下方的模板可自動(dòng)地提供(例如,在用戶界面中顯示):
如所說(shuō)明,模板將pdev和ldev以及相關(guān)聯(lián)的映射(其可在本文中統(tǒng)稱為“處理樹(shù)”)的定義打包在一起。特定的裝置使用到處理樹(shù)中的裝置索引來(lái)引用。當(dāng)使用模板實(shí)例化裝置時(shí),索引值“0”在其通過(guò)在運(yùn)行時(shí)間處賦值的實(shí)際的pdev引用使用時(shí)被替換。索引值“1”和向上表示已創(chuàng)建的ldev裝置,且在實(shí)例化期間被類似地替換。
現(xiàn)將根據(jù)實(shí)施方案通過(guò)實(shí)例描述驅(qū)動(dòng)器之間的差異以及處理那些差異的方式。zwavetm硬件恒溫器的pdev類型的定義在下方說(shuō)明:
給定zwave的command_class/command架構(gòu)和以下事實(shí):在zwavetm的情況下,裝置公布其支持的類別和版本,則此所說(shuō)明的pdev類型定義可通過(guò)在連接所述裝置(例如,到網(wǎng)關(guān)120)時(shí)查詢裝置來(lái)自動(dòng)地產(chǎn)生。這可通過(guò)解析zwavetmxml規(guī)范以提取任何給定命令類別版本的所有可讀取和可寫入屬性來(lái)完成。這些提取的屬性隨后可被轉(zhuǎn)換成屬性名稱和相關(guān)聯(lián)的數(shù)據(jù)類型,以便在連接過(guò)程期間以完全自動(dòng)化的方式產(chǎn)生以上裝置類型。在zwavetm的情況下,屬性地址是十六進(jìn)制序列,所述十六進(jìn)制序列對(duì)應(yīng)于命令類別、版本、命令以及需要的其它屬性/值用以從基于zwave的硬件“get”屬性的路徑,如在zwavetm規(guī)范中詳述。zwavetm驅(qū)動(dòng)器166b能夠解譯這些路徑,以便自動(dòng)地構(gòu)造每一屬性的get和set命令中的全部。這意味著,zwavetm驅(qū)動(dòng)器166b可在不修改的情況下處理任何新裝置和裝置的較舊版本。
尤其地,此自動(dòng)產(chǎn)生的pdev類型使用子結(jié)構(gòu)屬性或從zwavetm規(guī)范產(chǎn)生的子結(jié)構(gòu)屬性的數(shù)組。這些子結(jié)構(gòu)屬性在以上說(shuō)明中以“.”字符開(kāi)始。在實(shí)施方案中,基礎(chǔ)腳本語(yǔ)言不僅能夠處理基本數(shù)組,而且能夠處理那些數(shù)組內(nèi)的子結(jié)構(gòu)屬性。然而,基礎(chǔ)腳本語(yǔ)言的此特征可極少地用于需要此特征的硬件傳輸?shù)挠成淦瓮狻?/p>
尤其地,<access>字段不僅指定屬性是否是可讀取的和/或可寫入的,而且可包含輪詢優(yōu)先級(jí)(即,必須多么頻繁地輪詢屬性),所述輪詢優(yōu)先級(jí)可試探性地從zwavetm規(guī)范提取,其中優(yōu)先級(jí)“0”指示“在重啟后讀取一次,”優(yōu)先級(jí)“1”指示最大輪詢速率(例如,輪詢之間的125ms間隔),優(yōu)先級(jí)“2”指示最大輪詢速率的一半,優(yōu)先級(jí)“3”指示最大輪詢速率的四分之一,等等,例如,至可設(shè)定為分鐘、小時(shí)、天或更長(zhǎng)的輪詢速率。隨后,這些速率可在必要時(shí)在按裝置的基礎(chǔ)上動(dòng)態(tài)地更改。
除所說(shuō)明的zwavetm驅(qū)動(dòng)器166b外的驅(qū)動(dòng)器可不同地解譯<address>字段。例如,phidgettm驅(qū)動(dòng)器166c可解譯<address>字段以作為phidgettm庫(kù)函數(shù)的名稱,必須調(diào)用所述函數(shù)以便獲得對(duì)應(yīng)的屬性。應(yīng)理解,對(duì)<address>字段的更加獨(dú)特的解譯類似地通過(guò)物理/邏輯層920支持。
6.13.物理/邏輯api
在實(shí)施方案中,驅(qū)動(dòng)器166的實(shí)施通過(guò)將初始化程序函數(shù)傳遞到物理/邏輯層920的api的rg_registerdriver()函數(shù)來(lái)向通用驅(qū)動(dòng)器抽象層910注冊(cè)。從zwave驅(qū)動(dòng)器166b獲取的典型的初始化程序函數(shù)的實(shí)例在下方說(shuō)明:
此函數(shù)在zwave驅(qū)動(dòng)器166b被指定為活動(dòng)的時(shí)被調(diào)用。否則,注冊(cè)是潛在的。對(duì)此初始化程序函數(shù)的調(diào)用的結(jié)果是在本文中的其它地方論述的通用驅(qū)動(dòng)器線程的創(chuàng)建,連同通用驅(qū)動(dòng)器線程需要的各種參數(shù)和另外的標(biāo)準(zhǔn)回調(diào)函數(shù)的設(shè)定。這些驅(qū)動(dòng)器回調(diào)中的大部分僅解析至對(duì)通過(guò)物理/邏輯層920提供的抽象邏輯的標(biāo)準(zhǔn)調(diào)用。因此,可省略注冊(cè),使得使用默認(rèn)值,但此處包含注冊(cè)以使在調(diào)試器中讀取堆棧爬行的能力變得容易。例如,以上的zw_zwavelowlevelcallback()函數(shù)由單行組成:
ret=pl_standardlowlevelcallback(drivername,aparser,adevref,rawdevname,adevproperty,acommand,atype,avalue,globalcontext,options,status,flags);
類似地,zw_zwavepollfn()函數(shù)也由用適合的參數(shù)對(duì)pl_standardpollinglogic()函數(shù)的單行調(diào)用組成。zw_initzwavefn()和zw_termszwavefn()的可選注冊(cè)在新近創(chuàng)建的通用驅(qū)動(dòng)器線程內(nèi)處理專門化的初始化和終止活動(dòng)。所有其它注冊(cè)的函數(shù)在以上代碼中充分地描述。
在實(shí)施方案中,物理/邏輯層920提供對(duì)以下另外的功能性中的一個(gè)或多個(gè)的訪問(wèn):
●用以處理傳輸通信的標(biāo)準(zhǔn)搶占式工作者線程的創(chuàng)建;
●用于經(jīng)由專門的注冊(cè)表對(duì)構(gòu)成驅(qū)動(dòng)器的pdev和ldev的屬性的簡(jiǎn)化訪問(wèn)的api;
●基于如在xml裝置規(guī)范中定義的裝置樹(shù)的迭代器,所述裝置規(guī)范與在驅(qū)動(dòng)器屬性注冊(cè)表中的那些裝置規(guī)范相反;
●用以在對(duì)應(yīng)的屬性注冊(cè)表值更改時(shí)運(yùn)行需要被運(yùn)行的映射片段的邏輯。在實(shí)施方案中,映射片段直接地在解譯性的基礎(chǔ)語(yǔ)言解析器內(nèi)運(yùn)行,而非在虛擬機(jī)內(nèi)運(yùn)行。然而,如果執(zhí)行原因指定使用虛擬機(jī)來(lái)運(yùn)行經(jīng)編譯的映射片段,那么替代于基礎(chǔ)語(yǔ)言解析器或除基礎(chǔ)語(yǔ)言解析器外,還可使用虛擬機(jī)。
●用以經(jīng)由驅(qū)動(dòng)器層164將任何屬性傳遞到數(shù)據(jù)架構(gòu)和從數(shù)據(jù)架構(gòu)傳遞任何屬性的邏輯;
●用以處理驅(qū)動(dòng)器166的控制臺(tái)界面的邏輯;
●api函數(shù)pl_converttological()和pl_converttophysical(),所述函數(shù)處理通過(guò)物理/邏輯層920的抽象的所有數(shù)據(jù)流;
●用以處理驅(qū)動(dòng)器層164的需要的內(nèi)置基礎(chǔ)語(yǔ)言函數(shù);
●api函數(shù),所述函數(shù)用以經(jīng)由搶占式工作者線程將來(lái)自物理裝置的屬性改變打包、入隊(duì)以及出隊(duì)到通用驅(qū)動(dòng)器線程內(nèi)的注冊(cè)表中;
●api函數(shù),所述函數(shù)用以將來(lái)自通用驅(qū)動(dòng)器線程內(nèi)的注冊(cè)表的屬性改變打包、入隊(duì)以及出隊(duì)到搶占式工作者線程中;
●供在搶占式驅(qū)動(dòng)器代碼內(nèi)使用的抽象互斥api函數(shù);和/或
●驅(qū)動(dòng)器166常常需要的其它效用函數(shù)。
根據(jù)實(shí)施方案,在下方說(shuō)明物理/邏輯層920的api的pl_standardworkerthread()函數(shù):
在實(shí)施方案中,地址作為參數(shù)被傳遞到以上函數(shù)的另外的函數(shù)實(shí)際上形成標(biāo)準(zhǔn)方式,所有驅(qū)動(dòng)器166以所述方式向物理/邏輯層920注冊(cè)所述驅(qū)動(dòng)器的自定義代碼。這些邏輯函數(shù)(grabdevstate、recvnewvals、sendnewvals)利用通過(guò)物理/邏輯層920提供的另外的api函數(shù),結(jié)合驅(qū)動(dòng)器特定的傳輸代碼來(lái)處理實(shí)施輪詢和事件驅(qū)動(dòng)的行為兩者所需的一切事物。這些邏輯函數(shù)可趨向于在驅(qū)動(dòng)器166上看起來(lái)類似,僅在經(jīng)由基本驅(qū)動(dòng)器傳輸層與物理裝置通信所需的內(nèi)容的細(xì)節(jié)上不同。除這些邏輯函數(shù)外,在遍歷物理/邏輯層920時(shí)所涉及的所有其它邏輯,通過(guò)調(diào)用適合的映射片段,可通過(guò)物理/邏輯層920的抽象透明地處理。
6.14.開(kāi)發(fā)控制臺(tái)
在實(shí)施方案中,可提供到裝置管理器160(和/或其它部件,例如腳本執(zhí)行環(huán)境150)的直接連接以供開(kāi)發(fā)人員、增值經(jīng)銷商和/或用以詳細(xì)地調(diào)試和/或配置每一網(wǎng)關(guān)120的技術(shù)支持使用。此直接連接可通過(guò)控制臺(tái)界面實(shí)施,所述控制臺(tái)界面使得用戶能夠輸入直接指令(例如,基于文本的命令)且使得能夠向用戶顯示那些命令的結(jié)果(例如,基于文本的輸出)。
在實(shí)施方案中,控制臺(tái)界面可通過(guò)用戶命令在傳送到整個(gè)裝置管理器160(和腳本執(zhí)行環(huán)境150)與傳送到特定驅(qū)動(dòng)器166之間切換,所述特定驅(qū)動(dòng)器實(shí)施一系列驅(qū)動(dòng)器特定的命令和訪問(wèn)在驅(qū)動(dòng)器層164下方的架構(gòu)的功能。此雙重訪問(wèn)允許在真實(shí)的硬件發(fā)生故障或其它問(wèn)題的情況下較容易調(diào)試。
在實(shí)施方案中,將“help”鍵入到控制臺(tái)中將產(chǎn)生可用控制臺(tái)命令的以下列表:
前幾個(gè)命令涉及控制編輯、添加、重命名以及刪除腳本。高級(jí)開(kāi)發(fā)人員可完全無(wú)需腳本gui并直接用基礎(chǔ)腳本語(yǔ)言開(kāi)發(fā)腳本,由此能夠訪問(wèn)不可通過(guò)腳本gui表達(dá)的特征。
命令的下一集合提供檢查并修改配置和調(diào)試選項(xiàng)和設(shè)置的能力。存在這些調(diào)試和配置功能的擴(kuò)展集合,所述調(diào)試和配置功能適用于腳本執(zhí)行環(huán)境150、裝置管理器160以及驅(qū)動(dòng)器166。
命令的下一集合允許公共裝置屬性(與驅(qū)動(dòng)器特定的私有屬性相反)、驅(qū)動(dòng)器層164的片段、全局參數(shù)等的顯示和更改。
“memory”命令顯示所有存儲(chǔ)器分配和使用的最新列表。
“dump”命令顯示所有永久性數(shù)據(jù)(即,其值在重啟或斷電過(guò)程上永久的數(shù)據(jù),例如存儲(chǔ)在非易失性存儲(chǔ)器中)的狀態(tài)。一般來(lái)說(shuō),所有重要的值和狀態(tài)保持為永久性數(shù)據(jù)。因此,發(fā)出此命令可提供所有重要狀態(tài)的快照。
“flush”命令可用于從非活動(dòng)驅(qū)動(dòng)器的所有注冊(cè)表清除狀態(tài)。
“version”命令打印當(dāng)前軟件版本的細(xì)節(jié)。
“quit”命令終止控制臺(tái)應(yīng)用。
“+”命令重復(fù)所輸入的先前命令。
“driver”命令允許用戶切換以與在來(lái)自“driver”命令的輸出中列出的活動(dòng)驅(qū)動(dòng)器中的任何驅(qū)動(dòng)器通信。例如,下方的序列將控制臺(tái)的注意點(diǎn)切換到虛擬驅(qū)動(dòng)器166a,且隨后顯示可用于直接與虛擬驅(qū)動(dòng)器166a通信的命令套系。如所說(shuō)明,控制臺(tái)提示改變以反映驅(qū)動(dòng)器名稱,所述驅(qū)動(dòng)器名稱是控制臺(tái)的當(dāng)前關(guān)注點(diǎn):
因?yàn)樘摂M驅(qū)動(dòng)器166a未層堆在物理傳輸?shù)捻敳坎⒉皇褂梦锢?邏輯層920,所以所述虛擬驅(qū)動(dòng)器的命令集是通過(guò)物理/邏輯層920的抽象針對(duì)其它驅(qū)動(dòng)器自動(dòng)地提供的那些命令的句法兼容子集。例如,如果已選擇phidget驅(qū)動(dòng)器166c(“phidget_usb”)而非虛擬驅(qū)動(dòng)器166a,那么以下可用命令將被示出:
主要地通過(guò)物理/邏輯層920的抽象提供的此驅(qū)動(dòng)器命令集主要地在所有驅(qū)動(dòng)器166上相同,除了虛擬驅(qū)動(dòng)器166a。驅(qū)動(dòng)器166可向控制臺(tái)(和幫助菜單)在其相應(yīng)的初始化程序函數(shù)內(nèi)注冊(cè)另外的驅(qū)動(dòng)器特定的命令。
“device”命令顯示通過(guò)“dref”識(shí)別的pdev或ldev的所有已知屬性。“device”命令還可用于啟用或停用給定裝置。停用的裝置繼續(xù)存在,但不從任何物理裝置的硬件讀取或?qū)懭胫登也挥|發(fā)任何映射片段。暫時(shí)性停用裝置可用于隔離故障的原因。
“set”命令從控制臺(tái)直接地設(shè)定ldev或pdev屬性。如果所述改變觸發(fā)映射片段,那么物理/邏輯層920將運(yùn)行所觸發(fā)的映射片段,且可引起映射的另一側(cè)上的改變。再次地,此直接地在驅(qū)動(dòng)器中設(shè)定裝置屬性的能力可用于開(kāi)發(fā)和調(diào)試情況。
“show”命令顯示任何驅(qū)動(dòng)器“部件”的規(guī)范(例如,在xml中)。驅(qū)動(dòng)器部件可為例如ldev、pdev、裝置類型、映射片段或模板。所有這些不同部件類型的內(nèi)容的實(shí)例已在本文中的其它地方提供。
“add”命令允許用戶定義新部件且隨后將其內(nèi)容輸入到控制臺(tái)中(例如,通過(guò)將部件定義鍵入或復(fù)制-粘貼到控制臺(tái)中)。輸入被寫入到永久性存儲(chǔ)裝置且可用于隨后使用?!癮dd”命令可針對(duì)不同的部件類型實(shí)施某些內(nèi)部命名約定。低級(jí)“add”命令將僅在手動(dòng)構(gòu)造處理樹(shù)時(shí)使用。新部件定義在輸入時(shí)被解析,以便確保所述新部件定義在句法上正確。未能正確地解析的任何部件定義將不被寫入到永久性存儲(chǔ)裝置。
“networkadd”命令可用于添加新裝置?!皀etworkadd”命令并入有另外的行為,包含自動(dòng)地檢測(cè)每一裝置類型并使用與檢測(cè)到的裝置類型相關(guān)聯(lián)的模板來(lái)創(chuàng)建整個(gè)處理樹(shù)的能力。
“remove”命令處理給定驅(qū)動(dòng)器部件,和對(duì)在任何注冊(cè)表和永久性存儲(chǔ)裝置中的所移除驅(qū)動(dòng)器部件的所有引用。裝置的處理可暗指取決于所涉及的驅(qū)動(dòng)器的另外的清除,且因此,所述裝置的處理通過(guò)使用“networkremove”命令來(lái)更好地處理以避免與硬件狀態(tài)不一致。
“replace”命令允許用戶用新定義替換部件定義(例如,通過(guò)將新部件定義鍵入或復(fù)制-粘貼到控制臺(tái)中),且因此,允許用戶編輯現(xiàn)有部件定義。同樣,控制臺(tái)僅在新部件定義正確地解析時(shí),用新部件定義替換舊部件定義。
“rename”命令允許用戶在任何處理樹(shù)或注冊(cè)表內(nèi)對(duì)部件永久地命名以及對(duì)部件的所有引用。
“pdevs”命令列出與選定驅(qū)動(dòng)器相關(guān)聯(lián)的所有pdev的基礎(chǔ)細(xì)節(jié)。
“l(fā)devs”命令列出與選定驅(qū)動(dòng)器相關(guān)聯(lián)的所有l(wèi)dev的基礎(chǔ)細(xì)節(jié)。
“snippets”命令列出與選定驅(qū)動(dòng)器相關(guān)聯(lián)的所有驅(qū)動(dòng)器映射片段的基礎(chǔ)細(xì)節(jié)。通配符(例如,“*”)可用于檢查所有片段而不管選定驅(qū)動(dòng)器。
“l(fā)devtypes”命令列出所有已知的邏輯裝置類型。因?yàn)閘dev類型在所有驅(qū)動(dòng)器上共用,所以此列表與選定驅(qū)動(dòng)器無(wú)關(guān)。
“pdevtypes”命令列出在所有驅(qū)動(dòng)器上的所有已知的物理裝置類型。
“templates”命令列出在所有驅(qū)動(dòng)器上的所有已知驅(qū)動(dòng)器模板。
“network”命令提供對(duì)選定驅(qū)動(dòng)器的傳輸“network”的基礎(chǔ)管理。此管理主要地包括用于硬件裝置的添加和移除的標(biāo)準(zhǔn)化過(guò)程,且通過(guò)物理/邏輯層920的抽象提供。不同的傳輸層具有關(guān)于感測(cè)裝置何時(shí)已連接或斷開(kāi)的不同功能。因此,為了在所有驅(qū)動(dòng)器上保持行為標(biāo)準(zhǔn)(例如,以使用戶的學(xué)習(xí)曲線變?nèi)菀?,全部的“networkadd”和“networkremove”過(guò)程應(yīng)通過(guò)自定義函數(shù)的注冊(cè)來(lái)配置,例如網(wǎng)絡(luò)響應(yīng)器函數(shù),通過(guò)在zwave驅(qū)動(dòng)器166b的實(shí)例初始化程序函數(shù)中的zw_consnwrkresponderfn()函數(shù)表示。網(wǎng)絡(luò)響應(yīng)器函數(shù)可在控制臺(tái)線程內(nèi)調(diào)用,并允許邏輯控制網(wǎng)絡(luò)管理的過(guò)程,以便避免在添加或移除操作失敗時(shí)混淆的可能性。zw_consnwrkresponderfn()的實(shí)例代碼可為如下:
如在以上實(shí)例中所說(shuō)明,網(wǎng)絡(luò)響應(yīng)器函數(shù)適當(dāng)?shù)貙?duì)邏輯動(dòng)作中的每一個(gè)作出響應(yīng),要求所述網(wǎng)絡(luò)響應(yīng)器函數(shù)通過(guò)物理/邏輯層920的抽象邏輯來(lái)執(zhí)行所述邏輯動(dòng)作。尤其地,api的du_forwardconsolecmd()函數(shù)用于將命令從協(xié)作控制臺(tái)線程(例如,所述協(xié)作控制臺(tái)線程不能直接地訪問(wèn)物理裝置的硬件)傳遞到搶占式工作者線程(例如,所述搶占式工作線程可直接地訪問(wèn)物理裝置的硬件)和從所述搶占式工作者線程傳遞命令。除zwave驅(qū)動(dòng)器166b外,驅(qū)動(dòng)器的網(wǎng)絡(luò)響應(yīng)器函數(shù)可以類似方式實(shí)施。
7.通信層
在實(shí)施方案中,通信層140處理與網(wǎng)關(guān)120中的控制器130的tcp通信,或在其它配置中,處理直接地與平臺(tái)110(例如,遠(yuǎn)程云服務(wù))的tcp通信。消息可在腳本執(zhí)行環(huán)境150內(nèi)在單獨(dú)的搶占式“工作者”線程中接收和發(fā)送。所有消息可完全地由用數(shù)據(jù)架構(gòu)的數(shù)據(jù)格式編碼的文本包組成。所有類型的數(shù)據(jù)架構(gòu)命令簡(jiǎn)單地為用數(shù)據(jù)架構(gòu)的數(shù)據(jù)格式(例如,json)編碼的包,包含實(shí)施命令和/或其它重要數(shù)據(jù)的特定元素。
在實(shí)施方案中,在腳本執(zhí)行環(huán)境150中,“接收”工作者接收到腳本執(zhí)行環(huán)境150的消息(例如,來(lái)自平臺(tái)110和/或控制器130),并在接收隊(duì)列中將所述消息排隊(duì),同時(shí)主過(guò)程線程從接收隊(duì)列拉出排隊(duì)的消息并處理所述消息。類似地,在腳本執(zhí)行環(huán)境150中,主過(guò)程線程用數(shù)據(jù)架構(gòu)的數(shù)據(jù)格式對(duì)來(lái)自腳本執(zhí)行環(huán)境150的消息(例如,到平臺(tái)110和/或控制器130)編碼,并在發(fā)送隊(duì)列中將經(jīng)編碼的消息排隊(duì),同時(shí)“發(fā)送”工作者從發(fā)送隊(duì)列拉出排隊(duì)的消息并經(jīng)由tcp將所述消息發(fā)送到既定目的地。
在實(shí)施方案中,與適合的目的地(例如,平臺(tái)110和/或控制器130)建立通信所必需的信息被傳遞到通信層140的初始化例程。此信息可包括例如ip地址、端口、用戶名和/或密碼或密鑰。一旦與目的地的特定實(shí)例的通信已建立,到所述目的地的所有隨后的通信可是與所述特定實(shí)例。數(shù)據(jù)架構(gòu)是這樣,使得如果數(shù)據(jù)值通過(guò)網(wǎng)關(guān)120上的腳本執(zhí)行環(huán)境150中的執(zhí)行腳本改變,那么此改變正常地被發(fā)送到控制器130以作為“change”命令,且隨后自動(dòng)地轉(zhuǎn)發(fā)到平臺(tái)110?!癱hange”命令可從平臺(tái)110另外轉(zhuǎn)發(fā)(例如)到腳本gui、到其它網(wǎng)關(guān)120、到訂閱已被改變的數(shù)據(jù)的其它過(guò)程等。一個(gè)此過(guò)程是裝置管理器160在相同的網(wǎng)關(guān)120上運(yùn)行。
圖8a說(shuō)明根據(jù)實(shí)施方案的基礎(chǔ)架構(gòu)的獨(dú)立變型,其中腳本執(zhí)行環(huán)境(包括腳本管理器210和vm230)和裝置管理器160執(zhí)行為不同的過(guò)程,有可能在不同機(jī)器上。例如,腳本執(zhí)行環(huán)境150可在云中(例如,在平臺(tái)110上,而非在網(wǎng)關(guān)120上)執(zhí)行,而裝置管理器160可在某一過(guò)程中在網(wǎng)關(guān)120上執(zhí)行。在此情況下,一個(gè)腳本執(zhí)行環(huán)境150可用于控制多個(gè)網(wǎng)關(guān)120上的多個(gè)裝置管理器160。此外,腳本執(zhí)行環(huán)境150與裝置管理器160之間的消息將經(jīng)由網(wǎng)絡(luò)(例如因特網(wǎng))在平臺(tái)110與網(wǎng)關(guān)120之間傳遞。替代地,腳本執(zhí)行環(huán)境150和裝置管理器160可在不同的過(guò)程中在同一網(wǎng)關(guān)120上執(zhí)行。在此情況下,腳本執(zhí)行環(huán)境150與裝置管理器160之間的消息不直接在這兩者之間傳遞,而是通過(guò)通信層140和/或控制器130轉(zhuǎn)發(fā)。從腳本執(zhí)行環(huán)境150到通信層140到控制器130或平臺(tái)110的通信路徑p1,以及從控制器130或平臺(tái)110到通信層140到數(shù)據(jù)架構(gòu)插件式驅(qū)動(dòng)器810到裝置管理器160的通信路徑p2,是在基礎(chǔ)架構(gòu)的獨(dú)立變型中用于腳本執(zhí)行環(huán)境150與裝置管理器160之間的通信的通信路徑的特性。
如上文所提及,腳本執(zhí)行環(huán)境150和裝置管理器160的獨(dú)立的變型可在網(wǎng)關(guān)120外運(yùn)行(例如,在云中)。腳本執(zhí)行環(huán)境150還可運(yùn)行用于其它機(jī)器架構(gòu)(例如,pc、服務(wù)器等)而無(wú)需修改。腳本執(zhí)行環(huán)境150的獨(dú)立的基于云的變型可用于架構(gòu)節(jié)點(diǎn),所述節(jié)點(diǎn)對(duì)大量網(wǎng)關(guān)120具有權(quán)力并運(yùn)行跨越連接到許多不同網(wǎng)關(guān)120的裝置的腳本,所述不同網(wǎng)關(guān)可能具有較寬地理分布。多個(gè)腳本執(zhí)行環(huán)境150可直接地在平臺(tái)110內(nèi)或經(jīng)由平臺(tái)110通信。例如,第一網(wǎng)關(guān)120上的第一腳本執(zhí)行環(huán)境150可通過(guò)經(jīng)由第一網(wǎng)關(guān)上的通信層140將消息傳遞到平臺(tái)110而與第二網(wǎng)關(guān)120上的第二腳本執(zhí)行環(huán)境150通信,所述平臺(tái)110通過(guò)第二網(wǎng)關(guān)上的通信層140將消息轉(zhuǎn)發(fā)到第二腳本執(zhí)行環(huán)境150。然而,繞過(guò)控制器130的此類通信一般僅適用于測(cè)試或適用于在腳本執(zhí)行環(huán)境150控制的網(wǎng)關(guān)120外運(yùn)行的腳本執(zhí)行環(huán)境150。對(duì)于在網(wǎng)關(guān)120內(nèi)執(zhí)行的腳本執(zhí)行環(huán)境150,通信將是正常地與所述網(wǎng)關(guān)120的控制器130。
然而,在實(shí)施方案中,網(wǎng)關(guān)120的正常配置將作為單一統(tǒng)一過(guò)程(但可能具有多個(gè)線程)執(zhí)行腳本執(zhí)行環(huán)境150和裝置管理器160。根據(jù)實(shí)施方案,此配置在圖8b中說(shuō)明。尤其地,統(tǒng)一的腳本執(zhí)行環(huán)境150和裝置管理器160對(duì)應(yīng)于圖7中的統(tǒng)一的裝置管理器和腳本管理器線程715。在此配置中,通過(guò)裝置管理器160管理的裝置的屬性的任何改變通過(guò)內(nèi)部api從vm230直接傳遞到裝置管理器160。有利地,此方法可減少腳本動(dòng)作與實(shí)際的外部硬件的對(duì)應(yīng)的改變之間的時(shí)延,且反之亦然。因?yàn)檠b置管理器160將還告知本地控制器130任何裝置屬性何時(shí)發(fā)生改變(例如,經(jīng)由從裝置管理器160到通信層140到控制器130的路徑),所以系統(tǒng)的其余部分將與在所述事實(shí)后的改變保持同步,如與在獨(dú)立的變型的實(shí)施方案中請(qǐng)求改變相反。因此,裝置屬性值將用真實(shí)的硬件狀態(tài)而始終為最新的(有可能具有由通信信道導(dǎo)致的略微的時(shí)延)。
8.圖形用戶界面(gui)
在實(shí)施方案中,平臺(tái)110提供界面114,所述界面包括web應(yīng)用,所述應(yīng)用向用戶提供針對(duì)在工業(yè)控制和家庭自動(dòng)化領(lǐng)域以及任何其它領(lǐng)域中的自動(dòng)化裝置來(lái)讀取、控制以及創(chuàng)建腳本的能力。此web應(yīng)用可合并數(shù)據(jù)架構(gòu)、所公開(kāi)的腳本語(yǔ)言、圖形用戶界面以及裝置管理器。
在實(shí)施方案中,web應(yīng)用通過(guò)暴露的應(yīng)用設(shè)計(jì)接口(api)提供對(duì)數(shù)據(jù)架構(gòu)的web訪問(wèn)。api可被廣泛范圍的客戶端應(yīng)用使用,所述客戶端應(yīng)用包含例如,其它web應(yīng)用(例如,設(shè)計(jì)用于特定的應(yīng)用)、移動(dòng)裝置、第三方機(jī)器到機(jī)器框架等。
在實(shí)施方案中,web應(yīng)用提供gui,所述gui使得用戶能夠創(chuàng)建、編輯腳本并將腳本部署到一個(gè)或多個(gè)網(wǎng)關(guān)120。web應(yīng)用可使得熟練的用戶能夠以粒度細(xì)節(jié)控制網(wǎng)關(guān)120,同時(shí)仍為新手用戶提供直觀的用戶界面。
在實(shí)施方案中,web應(yīng)用在單個(gè)應(yīng)用內(nèi)支持多個(gè)裝置控制標(biāo)準(zhǔn),同步跨越多個(gè)客戶端的屬性,即使在缺乏因特網(wǎng)連接性的情況下也提供功能系統(tǒng),針對(duì)多個(gè)領(lǐng)域(例如,家庭、商業(yè)以及工業(yè)領(lǐng)域)創(chuàng)建可行產(chǎn)品,并允許用戶控制大量的網(wǎng)關(guān)120和/或自動(dòng)化裝置。
9.實(shí)例用例
現(xiàn)將描述一些實(shí)例用例。應(yīng)理解,這些用例僅提供用于說(shuō)明控制腳本的少量非限制性實(shí)際應(yīng)用。
9.1.餐車制冷溫度監(jiān)視
在此實(shí)例用例中,用戶運(yùn)行餐車鏈。支持每一餐車的食品冷卻器和冷凍機(jī)對(duì)每一個(gè)別的餐車和作為整體的鏈的成功至關(guān)重要,所述食品冷卻器和冷凍機(jī)對(duì)聯(lián)邦和州食品保障條例的遵守亦是如此。食品的恰當(dāng)?shù)闹评浠蚶鋬鲇绊懫淇诟?、外觀、營(yíng)養(yǎng)含量以及安全性。因此,州和聯(lián)邦食品和藥品管理局(fda)要求,密切監(jiān)視所有商用制冷單元的溫度。如果制冷單元的溫度在長(zhǎng)于特定時(shí)間的時(shí)間上高于或低于建議的范圍,那么存儲(chǔ)在受影響的制冷單元中的食品可能不能使用。
不幸的是,幾乎所有商用制冷單元都將恒溫器放置成靠近所述單元的門。為確保單元的門的正常短時(shí)打開(kāi)和關(guān)閉不導(dǎo)致不正確的溫度讀數(shù),輔助溫度監(jiān)視器應(yīng)安裝在遠(yuǎn)離單元的門處。如果在單元的門打開(kāi)時(shí)出現(xiàn)溫度上升,那么在門已關(guān)閉5至10分鐘后,單元中的溫度應(yīng)返回到正常操作范圍內(nèi)。如果溫度未返回到正常操作范圍內(nèi),那么每一州fda已建立協(xié)議以用于確定所述單元中的食品是否可使用或出售。
為證實(shí)對(duì)這些條例的遵守,每一州fda公布并審查在正常操作范圍外的溫度范圍的定期報(bào)告。在此實(shí)例中,用戶已針對(duì)以下情況建立其自己的策略:她在單元的溫度在某一時(shí)間段上在正常操作范圍外時(shí)想要雇員怎么做,以及那些雇員應(yīng)對(duì)儲(chǔ)存在此單元中的食品做什么。
商用大型制冷機(jī)單元的操作的平均溫度范圍一般在36℉與45℉之間。如果食品儲(chǔ)存在低于36℉的溫度下,那么存在冷凍不應(yīng)被冷凍的食品(例如,牛奶和其它乳制品)的風(fēng)險(xiǎn),且如果食品儲(chǔ)存在高于45℉的溫度下,那么存在食品將變質(zhì)的風(fēng)險(xiǎn)。美國(guó)fda要求制冷產(chǎn)品必須保持在41℉下或更低。但食品在未被冷凍時(shí)越冷,食品將持續(xù)的時(shí)間越長(zhǎng),從而使38℉為商用制冷的理想溫度。
商用大型冷凍機(jī)單元的操作的平均溫度范圍一般在5℉與-10℉之間。如果食品儲(chǔ)存在低于-10℉的溫度下,那么存在冷凍機(jī)凍傷的風(fēng)險(xiǎn),且如果食品儲(chǔ)存在高于5℉的溫度下,那么食品可能不能恰當(dāng)?shù)乩鋬龊?或可能不能保持不變質(zhì)。
為監(jiān)視并報(bào)告制冷溫度,確保食品新鮮度,且遵守州和聯(lián)邦fda要求和審查,用戶在此實(shí)例中希望:
●將溫度傳感器安裝成遠(yuǎn)離每一餐車的大型制冷機(jī)和大型冷凍機(jī)的門,以確保最準(zhǔn)確的讀數(shù)并使門的打開(kāi)和關(guān)閉的影響最小化;
●建立對(duì)適當(dāng)?shù)闹评錂C(jī)和冷凍機(jī)溫度的監(jiān)視、報(bào)告以及報(bào)警;以及
●建立集成的制冷機(jī)和冷凍機(jī)門監(jiān)視以幫助確定對(duì)超出范圍的溫度的報(bào)警或警告是否可能已由單元的門被打開(kāi)太長(zhǎng)時(shí)間或由單元的可能故障造成。
用戶可使用所公開(kāi)的基礎(chǔ)架構(gòu)通過(guò)以下操作來(lái)實(shí)施這些希望:在每一餐車中,安裝(a)具有蜂窩數(shù)據(jù)連接的網(wǎng)關(guān)(例如,網(wǎng)關(guān)120),(b)在大型制冷機(jī)單元中遠(yuǎn)離單元的門并連接到網(wǎng)關(guān)的溫度傳感器,(c)在大型冷凍機(jī)單元中遠(yuǎn)離單元的門并連接到網(wǎng)關(guān)的溫度傳感器,(d)連接到網(wǎng)關(guān)的大型制冷機(jī)門傳感器,(e)連接到網(wǎng)關(guān)的大型冷凍機(jī)門傳感器,以及(f)連接到網(wǎng)關(guān)的可聽(tīng)聲裝置。
接著,用戶可經(jīng)由平臺(tái)110的界面114的gui通過(guò)以下操作來(lái)配置所述安裝:(a)給每一安裝的網(wǎng)關(guān)命名(例如,經(jīng)由界面114的管理gui),其中每一網(wǎng)關(guān)表示一個(gè)餐車;(b)針對(duì)大型制冷機(jī)單元?jiǎng)?chuàng)建登錄腳本和報(bào)警腳本(例如,經(jīng)由界面114的腳本gui);以及(c)針對(duì)大型冷凍機(jī)單元?jiǎng)?chuàng)建登錄腳本和報(bào)警腳本(例如,經(jīng)由界面114的腳本gui)。
制冷機(jī)單元和冷凍機(jī)單元中的每一個(gè)的登錄腳本將定期的溫度測(cè)量結(jié)果從相應(yīng)的單元中的溫度傳感器發(fā)送到平臺(tái)110(經(jīng)由蜂窩數(shù)據(jù)連接)。登錄時(shí)段可根據(jù)用戶所需要和腳本gui中所指定而以多種方式設(shè)定(例如,每小時(shí)地、每天地、每天在特定時(shí)間處、每六個(gè)小時(shí)等)。另外,通過(guò)每一登錄腳本定期地發(fā)送的溫度測(cè)量結(jié)果可以一種或多種數(shù)據(jù)格式(例如,microsoftexceltm等電子表格格式、逗號(hào)分隔的值(csv)、便攜式文件格式(pdf)等)存儲(chǔ)在平臺(tái)110處并通過(guò)用戶下載。
制冷機(jī)單元和冷凍機(jī)單元中的每一個(gè)的報(bào)警腳本在來(lái)自相應(yīng)的單元中的溫度傳感器的溫度測(cè)量結(jié)果在第二時(shí)間段上在正常操作范圍外時(shí),在第一時(shí)間段上經(jīng)由所安裝的可聽(tīng)聲裝置觸發(fā)可聽(tīng)警報(bào),并將日志條目發(fā)送到平臺(tái)110(經(jīng)由蜂窩數(shù)據(jù)連接),所述日志條目包括溫度測(cè)量結(jié)果超出正常操作范圍的日期和時(shí)間,在從檢測(cè)到溫度測(cè)量結(jié)果在正常操作范圍外的時(shí)刻直到溫度測(cè)量結(jié)果返回到正常操作范圍的每一設(shè)定時(shí)間間隔中來(lái)自相應(yīng)的溫度傳感器的溫度測(cè)量結(jié)果,和/或溫度測(cè)量結(jié)果返回到正常操作范圍的日期和時(shí)間。用于制冷機(jī)單元的腳本可將正常操作范圍定義為在35℉與41℉之間,而用于冷凍機(jī)單元的腳本可將正常操作范圍定義為在-10℉與5℉之間。第一時(shí)間段可定義為三十秒,第二時(shí)間段可定義為五分鐘,且所設(shè)定的時(shí)間間隔可定義為一分鐘。當(dāng)然,用戶可將這些變量的值設(shè)定為她所期望的任何值(例如,經(jīng)由界面114的腳本gui)。另外,兩個(gè)報(bào)警腳本可在溫度測(cè)量結(jié)果在第一時(shí)間段到期之前返回到正常操作范圍時(shí)斷開(kāi)可聽(tīng)警報(bào)。此外,報(bào)警日志條目可以一種或多種數(shù)據(jù)格式存儲(chǔ)在平臺(tái)110處并通過(guò)用戶下載。
作為可聽(tīng)報(bào)警的替代方案或除可聽(tīng)報(bào)警外,制冷機(jī)單元和冷凍機(jī)單元中的每一個(gè)的報(bào)警腳本還可在滿足報(bào)警條件時(shí)發(fā)送警告消息。例如,每當(dāng)來(lái)自相應(yīng)單元中的溫度傳感器的溫度測(cè)量結(jié)果在某一時(shí)間段(可通過(guò)用戶配置)上在正常操作范圍外時(shí),報(bào)警腳本可通過(guò)平臺(tái)110或直接地經(jīng)由蜂窩數(shù)據(jù)連接發(fā)射警告消息,以及如上文所描述將日志條目發(fā)送到平臺(tái)110。例如,警告消息可為文本消息(例如,短消息服務(wù)(sms)消息)或電子郵件消息,所述消息包括發(fā)送警告消息的網(wǎng)關(guān)的名稱(所述網(wǎng)關(guān)可以其安裝在其中的餐車命名,例如“truck1”),報(bào)警的日期和時(shí)間,和/或與報(bào)警相關(guān)的一個(gè)或多個(gè)溫度測(cè)量結(jié)果。類似地,當(dāng)溫度測(cè)量結(jié)果返回到正常操作范圍時(shí),每一報(bào)警腳本還可發(fā)送報(bào)警解除消息,以指示報(bào)警條件已被清除。在每一情況下,當(dāng)經(jīng)由腳本gui創(chuàng)建報(bào)警腳本時(shí),用戶可指定警告消息的一個(gè)或多個(gè)接收方(例如,通過(guò)從聯(lián)系人數(shù)據(jù)庫(kù)選擇聯(lián)系記錄,輸入手機(jī)號(hào)碼和/或電子郵件地址等)。
在針對(duì)制冷機(jī)和冷凍機(jī)單元兩者創(chuàng)建登錄和報(bào)警腳本后,用戶可與平臺(tái)110的界面114的gui交互以將四個(gè)腳本下載到每一餐車中安裝的每一網(wǎng)關(guān)。
在此實(shí)例中,警告消息將可能的條例違反告知用戶,使得用戶可證實(shí)并利用適當(dāng)?shù)牟僮鞑襟E用文件證明遵守條例。另外,日志條目連同用戶用適當(dāng)?shù)牟僮鞑襟E對(duì)遵守條例的文件可用于遵守州fda審查。
9.2.餐車制冷門監(jiān)視
此用例實(shí)例將利用與上文相同的用戶。由于通過(guò)餐車準(zhǔn)備并供應(yīng)食品所需的近距離和快節(jié)奏,烹飪?nèi)藛T通常使餐車的大型制冷機(jī)或冷凍機(jī)單元的門打開(kāi)。如上文所論述,這可造成食品安全的問(wèn)題并引起健康破壞。因此,用戶已建立食品處理、準(zhǔn)備、烹飪以及供應(yīng)標(biāo)準(zhǔn)并訓(xùn)練所有她的雇員。為監(jiān)視她的雇員的表現(xiàn),用戶隨機(jī)地訪問(wèn)她的餐車以品嘗食品并觀察她的雇員。然而,雇員在用戶不在時(shí)可能懶于遵守所建立的標(biāo)準(zhǔn)。因此,用戶希望不顯眼地監(jiān)視每一餐車上的制冷機(jī)和冷凍機(jī)單元的門。
用戶可使用所公開(kāi)的基礎(chǔ)架構(gòu)通過(guò)以下操作實(shí)施這些希望:在每一餐車中,安裝(a)具有蜂窩數(shù)據(jù)連接的網(wǎng)關(guān)(例如,網(wǎng)關(guān)120),(b)連接到網(wǎng)關(guān)的大型制冷機(jī)門傳感器,(c)連接到網(wǎng)關(guān)的大型冷凍機(jī)門傳感器,以及(d)連接到網(wǎng)關(guān)的可聽(tīng)聲裝置。
接著,用戶可經(jīng)由平臺(tái)110的界面114的gui通過(guò)以下操作來(lái)配置所述安裝:(a)給每一安裝的網(wǎng)關(guān)命名(例如,經(jīng)由界面114的管理gui),其中每一網(wǎng)關(guān)表示一個(gè)餐車;(b)針對(duì)大型制冷機(jī)單元?jiǎng)?chuàng)建登錄腳本和報(bào)警腳本(例如,經(jīng)由界面114的腳本gui);以及(c)針對(duì)大型冷凍機(jī)單元?jiǎng)?chuàng)建登錄腳本和報(bào)警腳本(例如,經(jīng)由界面114的腳本gui)。
制冷機(jī)單元和冷凍機(jī)單元中的每一個(gè)的登錄腳本將日志條目發(fā)送到平臺(tái)110(經(jīng)由蜂窩數(shù)據(jù)連接),所述日志條目每個(gè)包括通過(guò)相應(yīng)的門傳感器檢測(cè)到的在相應(yīng)單元的門的打開(kāi)與關(guān)閉狀態(tài)之間的每一次轉(zhuǎn)變的日期、時(shí)間以及轉(zhuǎn)變(例如,打開(kāi)或關(guān)閉)。日志條目可在其創(chuàng)建時(shí)(例如,在門打開(kāi)或關(guān)閉時(shí))被發(fā)送。這些日志條目可以一種或多種數(shù)據(jù)格式存儲(chǔ)在平臺(tái)110處并通過(guò)用戶下載。
制冷機(jī)單元和冷凍機(jī)單元中的每一個(gè)報(bào)警腳本在門傳感器檢測(cè)到相應(yīng)單元的門在第二時(shí)間段上打開(kāi)時(shí),經(jīng)由所安裝的可聽(tīng)聲裝置在第一時(shí)間段上觸發(fā)可聽(tīng)警報(bào),并將日志條目發(fā)送到平臺(tái)110(經(jīng)由蜂窩數(shù)據(jù)連接),所述日志條目包括門打開(kāi)的日期、時(shí)間和/或持續(xù)時(shí)間。第一時(shí)間段可定義為三十秒,且第二時(shí)間段可定義為兩分鐘。當(dāng)然,用戶可將這些變量的值設(shè)定為她所期望的任何值(例如,經(jīng)由界面114的腳本gui)。另外,兩個(gè)報(bào)警腳本可在門在第一時(shí)間段到期之前返回到關(guān)閉狀態(tài)時(shí)斷開(kāi)可聽(tīng)警報(bào)。此外,報(bào)警日志條目可以一種或多種數(shù)據(jù)格式存儲(chǔ)在平臺(tái)110處并通過(guò)用戶下載。
在針對(duì)制冷機(jī)和冷凍機(jī)單元兩者創(chuàng)建登錄和報(bào)警腳本后,用戶可與平臺(tái)110的界面114的gui交互以將四個(gè)腳本下載到每一餐車中安裝的每一網(wǎng)關(guān)。
10.實(shí)例處理裝置
圖10是說(shuō)明實(shí)例有線或無(wú)線系統(tǒng)1000的框圖,所述有線或無(wú)線系統(tǒng)可結(jié)合本文中描述的各種實(shí)施方案一起使用。例如,系統(tǒng)1000可用作上文描述的機(jī)制、過(guò)程、方法或功能(例如,用以存儲(chǔ)和/或執(zhí)行所公開(kāi)的邏輯和/或一個(gè)或多個(gè)軟件模塊中的任一個(gè))中的一個(gè)或多個(gè)或結(jié)合其使用,且可表示平臺(tái)110、網(wǎng)關(guān)120(例如,網(wǎng)關(guān)120的控制器130)和/或本文中描述的裝置中的任一個(gè)的部件。系統(tǒng)1000可為服務(wù)器或任何常規(guī)的個(gè)人計(jì)算機(jī),或能夠進(jìn)行有線或無(wú)線數(shù)據(jù)通信的任何其它處理器啟用的裝置。還可使用其它計(jì)算機(jī)系統(tǒng)和/或架構(gòu),如所屬領(lǐng)域的技術(shù)人員將清楚。
系統(tǒng)1000優(yōu)選地包含一個(gè)或多個(gè)處理器,例如處理器1010。可提供另外的處理器,例如用以管理輸入/輸出的輔助處理器,用以執(zhí)行浮點(diǎn)算術(shù)運(yùn)算的輔助處理器,具有適合于信號(hào)處理算法的快速執(zhí)行的架構(gòu)的專用微處理器(例如,數(shù)字信號(hào)處理器),從屬于主處理系統(tǒng)的從屬處理器(例如,后端處理器),用于雙或多處理器系統(tǒng)的另外的微處理器或控制器,或協(xié)處理器。此類輔助處理器可為離散的處理器,或可與處理器1010集成。可與系統(tǒng)1000一起使用的處理器的實(shí)例包含但不限于
處理器1010優(yōu)選地連接到通信總線1005。通信總線1005可包含用于促進(jìn)在存儲(chǔ)裝置與系統(tǒng)1000的其它外圍部件之間的信息傳遞的數(shù)據(jù)信道。通信總線1005還可提供用于與處理器1010通信的信號(hào)集,包含數(shù)據(jù)總線、地址總線以及控制總線(未示出)。通信總線1005可包括任何標(biāo)準(zhǔn)或非標(biāo)準(zhǔn)總線架構(gòu),例如,遵守工業(yè)標(biāo)準(zhǔn)架構(gòu)(isa)的總線架構(gòu),擴(kuò)展工業(yè)標(biāo)準(zhǔn)架構(gòu)(eisa),微信道架構(gòu)(mca),外圍部件互連(pci)本地總線,或通過(guò)電氣電子工程師協(xié)會(huì)(ieee)公布的標(biāo)準(zhǔn),包含ieee488通用接口總線(gpib)、ieee696/s-100及類似者。
系統(tǒng)1000優(yōu)選地包含主存儲(chǔ)器1015,且還可包含輔助存儲(chǔ)器1020。主存儲(chǔ)器1015提供用于在處理器1010上執(zhí)行的程序的指令和數(shù)據(jù)的存儲(chǔ),例如上文描述的函數(shù)和/或模塊中的一個(gè)或多個(gè)。應(yīng)理解,存儲(chǔ)在存儲(chǔ)器中并通過(guò)處理器1010執(zhí)行的程序可根據(jù)任何合適的語(yǔ)言來(lái)寫入和/或編譯,所述語(yǔ)言包含但不限于c/c++、java、javascript、perl、visualbasic、.net及類似者。主存儲(chǔ)器1015通常為基于半導(dǎo)體的存儲(chǔ)器,例如動(dòng)態(tài)隨機(jī)存取存儲(chǔ)器(dram)和/或靜態(tài)隨機(jī)存取存儲(chǔ)器(sram)。其它基于半導(dǎo)體的存儲(chǔ)器類型包含例如同步動(dòng)態(tài)隨機(jī)存取存儲(chǔ)器(sdram)、rambus動(dòng)態(tài)隨機(jī)存取存儲(chǔ)器(rdram)、鐵電體隨機(jī)存取存儲(chǔ)器(fram)及類似者,包含只讀存儲(chǔ)器(rom)。
輔助存儲(chǔ)器1020可以可選地包含內(nèi)部存儲(chǔ)器1025和/或可移除介質(zhì)1030??梢瞥橘|(zhì)1030以任何眾所周知的方式讀取和/或?qū)懭???梢瞥鎯?chǔ)介質(zhì)1030可為例如磁帶驅(qū)動(dòng)器、壓縮光盤(cd)驅(qū)動(dòng)器、數(shù)字通用光盤(dvd)驅(qū)動(dòng)器、其它光學(xué)驅(qū)動(dòng)器、閃存存儲(chǔ)器驅(qū)動(dòng)器等。
可移除存儲(chǔ)介質(zhì)1030是非暫時(shí)性計(jì)算機(jī)可讀介質(zhì),所述介質(zhì)在其上存儲(chǔ)有計(jì)算機(jī)可執(zhí)行代碼(即,軟件)和/或數(shù)據(jù)。存儲(chǔ)在可移除存儲(chǔ)介質(zhì)1030上的計(jì)算機(jī)軟件或數(shù)據(jù)被讀取到系統(tǒng)1000中以用于通過(guò)處理器1010執(zhí)行。
在替代實(shí)施方案中,輔助存儲(chǔ)器1020可包含用于允許將計(jì)算機(jī)程序或其它數(shù)據(jù)或指令加載到系統(tǒng)1000中的其它類似構(gòu)件。此類構(gòu)件可包含例如外部存儲(chǔ)介質(zhì)1045和通信接口1040,所述通信接口允許將軟件和數(shù)據(jù)從外部存儲(chǔ)介質(zhì)1045傳遞到系統(tǒng)1000。外部存儲(chǔ)介質(zhì)1045的實(shí)例可包含外部硬盤驅(qū)動(dòng)器、外部光學(xué)驅(qū)動(dòng)器、外部磁光驅(qū)動(dòng)器等。輔助存儲(chǔ)器1020的其它實(shí)例可包含基于半導(dǎo)體的存儲(chǔ)器,例如可編程只讀存儲(chǔ)器(prom)、可擦除可編程只讀存儲(chǔ)器(eprom)、電可擦除只讀存儲(chǔ)器(eeprom)或閃存存儲(chǔ)器(類似于eeprom的面向塊的存儲(chǔ)器)。
如以上所提及,系統(tǒng)1000可包含通信接口1040。通信接口1040允許在系統(tǒng)1000與外部裝置(例如,打印機(jī))、網(wǎng)絡(luò)或其它信息源之間傳遞軟件和數(shù)據(jù)。例如,計(jì)算機(jī)軟件或可執(zhí)行代碼可經(jīng)由通信接口1040從網(wǎng)絡(luò)服務(wù)器傳遞到系統(tǒng)1000。通信接口1040的實(shí)例包含內(nèi)置網(wǎng)絡(luò)適配器、網(wǎng)絡(luò)接口卡(nic)、個(gè)人計(jì)算機(jī)存儲(chǔ)卡國(guó)際協(xié)會(huì)(pcmcia)網(wǎng)絡(luò)卡、卡總線網(wǎng)絡(luò)適配器、無(wú)線網(wǎng)絡(luò)適配器、通用串行總線(usb)網(wǎng)絡(luò)適配器、調(diào)制解調(diào)器、網(wǎng)絡(luò)接口卡(nic)、無(wú)線數(shù)據(jù)卡、通信端口、紅外接口、ieee1394火線或能夠介接系統(tǒng)550與網(wǎng)絡(luò)或另一計(jì)算裝置的任何其它裝置。通信接口1040優(yōu)選地實(shí)施行業(yè)公布的協(xié)議標(biāo)準(zhǔn),例如以太網(wǎng)ieee802標(biāo)準(zhǔn)、光纖信道、數(shù)字用戶線路(dsl)、異步數(shù)字用戶線路(adsl)、幀中繼、異步傳輸模式(atm)、綜合服務(wù)數(shù)字網(wǎng)(isdn)、個(gè)人通信服務(wù)(pcs)、傳輸控制協(xié)議/因特網(wǎng)協(xié)議(tcp/ip)、串行線路因特網(wǎng)協(xié)議/點(diǎn)到點(diǎn)協(xié)議(slip/ppp)等等,但還可實(shí)施自定義或非標(biāo)準(zhǔn)接口協(xié)議。
經(jīng)由通信接口1040傳遞的軟件和數(shù)據(jù)一般呈電通信信號(hào)1055的形式。這些信號(hào)1055可經(jīng)由通信信道1050提供給通信接口1040。在實(shí)施方案中,通信信道1050可為有線或無(wú)線網(wǎng)絡(luò),或任何多種其它通信鏈路。通信信道1050攜載信號(hào)1055且可使用多種有線或無(wú)線通信構(gòu)件來(lái)實(shí)施,包含電線或線纜、光纖、常規(guī)的電話線、手機(jī)鏈路、無(wú)線數(shù)據(jù)通信鏈路、射頻(“rf”)鏈路或紅外鏈路等等。
計(jì)算機(jī)可執(zhí)行的代碼(即,計(jì)算機(jī)程序或軟件)存儲(chǔ)在主存儲(chǔ)器1015和/或輔助存儲(chǔ)器1020中。計(jì)算機(jī)程序還可經(jīng)由通信接口1040接收,并存儲(chǔ)在主存儲(chǔ)器1015和/或輔助存儲(chǔ)器1020中。此類計(jì)算機(jī)程序在執(zhí)行時(shí)使得系統(tǒng)1000執(zhí)行如本文中的其它地方所描述的所公開(kāi)的實(shí)施方案的各種功能。
在此描述中,術(shù)語(yǔ)“計(jì)算機(jī)可讀介質(zhì)”用于指代用于將計(jì)算機(jī)可執(zhí)行代碼(例如,軟件和計(jì)算機(jī)程序)提供到系統(tǒng)1000的任何非暫時(shí)性計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)。此介質(zhì)的實(shí)例包含主存儲(chǔ)器1015、輔助存儲(chǔ)器1020(包含內(nèi)部存儲(chǔ)器1025、可移除介質(zhì)1030以及外部存儲(chǔ)介質(zhì)1045)以及以通信方式與通信接口1040耦合的任何外圍裝置(包含網(wǎng)絡(luò)信息服務(wù)器或其它網(wǎng)絡(luò)裝置)。這些非暫時(shí)性計(jì)算機(jī)可讀介質(zhì)是用于將可執(zhí)行代碼、編程指令以及軟件提供到系統(tǒng)1000的構(gòu)件。
在使用軟件實(shí)施的實(shí)施方案中,軟件可存儲(chǔ)在計(jì)算機(jī)可讀介質(zhì)上,并借助可移除介質(zhì)1030、i/o接口1035或通信接口1040而加載到系統(tǒng)1000中。在此實(shí)施方案中,軟件以電通信信號(hào)1055的形式加載到系統(tǒng)1000中。軟件在通過(guò)處理器1010執(zhí)行時(shí),優(yōu)選地使得處理器1010執(zhí)行本文中在其它地方描述的特征和功能。
在實(shí)施方案中,i/o接口1035在系統(tǒng)1000的一個(gè)或多個(gè)部件與一個(gè)或多個(gè)輸入和/或輸出裝置之間提供接口。實(shí)例輸入裝置包含但不限于鍵盤、觸摸屏或其它觸敏裝置、生物感測(cè)裝置、計(jì)算機(jī)鼠標(biāo)、軌跡球、基于筆的指向裝置及類似者。輸出裝置的實(shí)例包含但不限于陰極射線管(crt)、等離子體顯示器、發(fā)光二極管(led)顯示器、液晶顯示器(lcd)、打印機(jī)、真空熒光顯示器(vfd)、表面?zhèn)鲗?dǎo)電子發(fā)射顯示器(sed)、場(chǎng)發(fā)射顯示器(fed)及類似者。
系統(tǒng)1000還包含可選的無(wú)線通信部件,所述部件促進(jìn)經(jīng)由話音網(wǎng)絡(luò)和/或數(shù)據(jù)網(wǎng)絡(luò)的無(wú)線通信。無(wú)線通信部件包括天線系統(tǒng)1070、無(wú)線電系統(tǒng)1065以及基帶系統(tǒng)1060。在系統(tǒng)1000中,射頻(rf)信號(hào)在無(wú)線電系統(tǒng)1065的管理下經(jīng)由空氣通過(guò)天線系統(tǒng)1070發(fā)送和接收。
在一個(gè)實(shí)施方案中,天線系統(tǒng)1070可包括一個(gè)或多個(gè)天線和一個(gè)或多個(gè)多路復(fù)用器(未示出),所述多路復(fù)用器執(zhí)行交換功能以為天線系統(tǒng)1070提供發(fā)送和接收信號(hào)路徑。在接收路徑中,接收到的rf信號(hào)可從多路復(fù)用器耦合到低噪聲放大器(未示出),所述放大器放大接收到的rf信號(hào)并將放大后的信號(hào)發(fā)送到無(wú)線電系統(tǒng)1065。
在替代實(shí)施方案中,無(wú)線電系統(tǒng)1065可包括一個(gè)或多個(gè)無(wú)線電裝置,所述無(wú)線電裝置經(jīng)配置以經(jīng)由不同頻率通信。在實(shí)施方案中,無(wú)線電系統(tǒng)1065可將解調(diào)器(未示出)和調(diào)制器(未示出)合并在一個(gè)集成電路(ic)中,解調(diào)器和調(diào)制器還可為單獨(dú)的部件。在進(jìn)入路徑中,解調(diào)器除去rf載波信號(hào),留下基帶接收音頻信號(hào),所述基帶接收音頻信號(hào)從無(wú)線電系統(tǒng)1065發(fā)送到基帶系統(tǒng)1060。
如果接收到的信號(hào)包含音頻信息,隨后基帶系統(tǒng)1060對(duì)信號(hào)解碼并將其轉(zhuǎn)換成模擬信號(hào)。隨后信號(hào)被放大且發(fā)送到揚(yáng)聲器。基帶系統(tǒng)1060還從麥克風(fēng)接收模擬音頻信號(hào)。這些模擬音頻信號(hào)通過(guò)基帶系統(tǒng)1060轉(zhuǎn)換成數(shù)字信號(hào)并編碼?;鶐到y(tǒng)1060還對(duì)數(shù)字信號(hào)譯碼以用于傳輸,并產(chǎn)生基帶發(fā)送音頻信號(hào),所述音頻信號(hào)被路由到無(wú)線電系統(tǒng)1065的調(diào)制器部分。調(diào)制器混合基帶發(fā)送音頻信號(hào)與rf載波信號(hào),從而產(chǎn)生rf發(fā)送信號(hào),所述rf發(fā)送信號(hào)被路由到天線系統(tǒng)1070,且可經(jīng)過(guò)功率放大器(未示出)。功率放大器放大rf發(fā)送信號(hào)并將其路由到天線系統(tǒng)1070,其中信號(hào)被交換到天線端口以用于傳輸。
基帶系統(tǒng)1060還以通信方式與處理器1010耦合,所述處理器可為中央處理單元(cpu)。處理器1010訪問(wèn)數(shù)據(jù)存儲(chǔ)區(qū)1015和1020。處理器1010優(yōu)選地經(jīng)配置以執(zhí)行可存儲(chǔ)在主存儲(chǔ)器1015或輔助存儲(chǔ)器1020中的指令(即,計(jì)算機(jī)程序或軟件)。計(jì)算機(jī)程序還可從基帶處理器1060接收,并存儲(chǔ)在主存儲(chǔ)器1010或輔助存儲(chǔ)器1020中,或在接收后執(zhí)行。此類計(jì)算機(jī)程序在執(zhí)行時(shí)使得系統(tǒng)1000執(zhí)行所公開(kāi)的實(shí)施方案的各種功能。例如,數(shù)據(jù)存儲(chǔ)區(qū)1015或1020可包含各種軟件模塊。
各種實(shí)施方案還可主要地使用例如專用集成電路(asic)或現(xiàn)場(chǎng)可編程門陣列(fpga)等部件在硬件中實(shí)施。相關(guān)領(lǐng)域的技術(shù)人員還將明白能夠執(zhí)行本文中描述的功能的硬件狀態(tài)機(jī)的實(shí)施。各種實(shí)施方案還可使用硬件和軟件的組合實(shí)施。
此外,所屬領(lǐng)域的技術(shù)人員應(yīng)了解,結(jié)合以上描述的圖式和本文中公開(kāi)的實(shí)施方案來(lái)描述的各種說(shuō)明性邏輯塊、模塊、電路以及方法步驟通??蓪?shí)施為電子硬件、計(jì)算機(jī)軟件或兩者的組合。為清楚地說(shuō)明硬件和軟件的此可互換性,各種說(shuō)明性部件、塊、模塊、電路以及步驟已在上文大體上就其功能性而言來(lái)描述。此功能性是實(shí)施為硬件還是軟件取決于施加于整體系統(tǒng)的特定應(yīng)用和設(shè)計(jì)約束。技術(shù)人員可針對(duì)每一特定應(yīng)用以不同的方式實(shí)施所描述的功能性,但此類實(shí)施決策不應(yīng)被解釋為造成偏離本發(fā)明的范圍。另外,在模塊、塊、電路或步驟內(nèi)的功能的分組是為了便于描述。在不脫離本發(fā)明的情況下,特定功能或步驟可從一個(gè)模塊、塊或電路移動(dòng)到另一個(gè)。
此外,結(jié)合本文中所公開(kāi)的實(shí)施方案描述的各種說(shuō)明性邏輯塊、模塊、功能以及方法可用以下各項(xiàng)實(shí)施或執(zhí)行:通用處理器、數(shù)字信號(hào)處理器(dsp)、asic、fpga或其它可編程邏輯裝置、離散門或晶體管邏輯、離散硬件部件或其經(jīng)設(shè)計(jì)以執(zhí)行本文中描述的功能的任何組合。通用處理器可為微處理器,但在替代方案中,所述處理器可為任何處理器、控制器、微控制器或狀態(tài)機(jī)。處理器還可實(shí)施為計(jì)算裝置的組合,例如,dsp和微處理器的組合、多個(gè)微處理器、結(jié)合dsp內(nèi)核的一個(gè)或多個(gè)微處理器或任何其它此類配置。
另外,結(jié)合本文中公開(kāi)的實(shí)施方案描述的方法或算法的步驟可直接地用硬件、用于通過(guò)處理器執(zhí)行的軟件模塊或用這兩者的組合實(shí)施。軟件模塊可駐留在ram存儲(chǔ)器、閃存存儲(chǔ)器、rom存儲(chǔ)器、eprom存儲(chǔ)器、eeprom存儲(chǔ)器、寄存器、硬盤、可移除盤、cd-rom或包含網(wǎng)絡(luò)存儲(chǔ)介質(zhì)的任何其它形式的存儲(chǔ)介質(zhì)中。示例性存儲(chǔ)介質(zhì)可耦合到處理器,使得所述處理器可從存儲(chǔ)介質(zhì)讀取信息,并將信息寫入到存儲(chǔ)介質(zhì)。在替代方案中,存儲(chǔ)介質(zhì)可與處理器成一體。處理器和存儲(chǔ)介質(zhì)還可駐留在asic中。
本文中描述的軟件部件中的任何軟件部件可采用多種形式。例如,部件可為獨(dú)立的軟件包,或部件可為作為“工具”并入在大型軟件產(chǎn)品中的軟件包。所述軟件包可從網(wǎng)絡(luò)(例如,網(wǎng)站)下載以作為獨(dú)立的產(chǎn)品或作為用于安裝在現(xiàn)有軟件應(yīng)用中的插件包。所述軟件包還可用作客戶端-服務(wù)器軟件應(yīng)用、用作web啟用的軟件應(yīng)用和/或用作移動(dòng)應(yīng)用。
提供以上對(duì)所公開(kāi)的實(shí)施方案的描述以使得所屬領(lǐng)域的任何技術(shù)人員能制作或使用本發(fā)明。所屬領(lǐng)域的技術(shù)人員將容易地明白這些實(shí)施方案的各種修改,且在不脫離本發(fā)明的精神或范圍的情況下,本文中描述的一般原理可應(yīng)用于其它實(shí)施方案。因此,應(yīng)理解,本文中呈現(xiàn)的描述和圖式表示本發(fā)明的當(dāng)前優(yōu)選的實(shí)施方案,且因此表示被本發(fā)明廣泛地涵蓋的主題。還應(yīng)理解,本發(fā)明的范圍完全涵蓋可對(duì)所屬領(lǐng)域的技術(shù)人員變得明顯的其它實(shí)施方案,且因此本發(fā)明的范圍不受限制。