本申請涉及軟件和計算機網(wǎng)絡(luò),尤其涉及一種適于嵌入式系統(tǒng)的差量式補丁升級方法及裝置。
背景技術(shù):
在嵌入式系統(tǒng)中,對其閃存flash內(nèi)的文件進行升級時,需要對整個文件進行升級。由于受到嵌入式系統(tǒng)硬件或者網(wǎng)絡(luò)的影響,容易造成升級過程時間過長,即超時引起文件升級失敗,影響用戶使用體驗。
技術(shù)實現(xiàn)要素:
為克服相關(guān)技術(shù)中存在的問題,本申請實施例提供一種適于嵌入式系統(tǒng)的差量式補丁升級方法及裝置,用以解決相關(guān)技術(shù)中的技術(shù)問題。
根據(jù)本申請實施例的第一方面,提供一種適于嵌入式系統(tǒng)的差量式補丁升級方法,所述方法包括:
獲取需要升級軟件的原始文件與所述需要升級軟件對應(yīng)的目標(biāo)文件;
確定所述原始文件和所述目標(biāo)文件存在差異數(shù)據(jù)時生成所述原始文件的補丁文件;
根據(jù)所述補丁文件對所述需要升級軟件進行更新。
可選地,根據(jù)所述原始文件和所述目標(biāo)文件的差異數(shù)據(jù)生成所述原始文件的補丁文件的步驟,包括:
依次從所述原始文件和所述目標(biāo)文件中讀取預(yù)設(shè)大小的文件數(shù)據(jù),得到原始單元數(shù)據(jù)和目標(biāo)單元數(shù)據(jù);
比較所述原始單元數(shù)據(jù)和所述目標(biāo)單元數(shù)據(jù)是否存在差異數(shù)據(jù);
若存在差異數(shù)據(jù),則生成預(yù)設(shè)大小且數(shù)據(jù)內(nèi)容為所述目標(biāo)單元數(shù)據(jù)的補丁單元;所述原始文件的多個原始單元數(shù)據(jù)對應(yīng)的補丁單元形成補丁文件。
可選地,根據(jù)所述補丁文件對所述需要升級軟件進行更新的步驟,包括:
從所述補丁文件中獲取每個補丁單元;
從所述補丁單元中讀取對應(yīng)的偏移地址;
將所述偏移地址作為起始地址,將每個補丁單元寫入對應(yīng)的存儲空間,從而完成對所述需要升級軟件的更新。
可選地,所述方法還包括驗證所述需要升級軟件進行更新完成的步驟,包括:
獲取每個補丁單元中的數(shù)據(jù)寫入存儲空間后的結(jié)束地址;
根據(jù)所述結(jié)束地址和所述起始地址獲取實際更新數(shù)據(jù);
若所述實際更新數(shù)據(jù)與所述補丁單元中的數(shù)據(jù)大小相同且數(shù)據(jù)內(nèi)容一致,則確定更新完成,否則更新失敗。
可選地,根據(jù)所述補丁文件對所述需要升級軟件進行更新的步驟之前,包括:
確定所述原始文件為所述需要升級軟件的全部數(shù)據(jù)或者分區(qū)數(shù)據(jù);
若所述原始文件為所述需要升級軟件的全部數(shù)據(jù),則對所述全部數(shù)據(jù)進行更新;
若所述原始文件為所述需要升級軟件的分區(qū)數(shù)據(jù),則對所述分區(qū)數(shù)據(jù)進行更新。
根據(jù)本申請實施例的第二方面,提供一種適于嵌入式系統(tǒng)的差量式補丁升級裝置,所述裝置包括:
文件獲取模塊,用于獲取需要升級軟件的原始文件與所述需要升級軟件對應(yīng)的目標(biāo)文件;
補丁生成模塊,用于在確定所述原始文件和所述目標(biāo)文件存在差異數(shù)據(jù)時生成所述原始文件的補丁文件;
補丁更新模塊,用于根據(jù)所述補丁文件對所述需要升級軟件進行更新。
可選地,所述文件獲取模塊包括:
單元數(shù)據(jù)獲取單元,用于依次從所述原始文件和所述目標(biāo)文件中讀取預(yù)設(shè)大小的文件數(shù)據(jù),得到原始單元數(shù)據(jù)和目標(biāo)單元數(shù)據(jù);
單元數(shù)據(jù)比較單元,用于比較所述原始單元數(shù)據(jù)和所述目標(biāo)單元數(shù)據(jù)是否存在差異數(shù)據(jù);
補丁文件生成單元,用于在所述原始單元數(shù)據(jù)和所述目標(biāo)單元數(shù)據(jù)存在差異數(shù)據(jù)時,生成預(yù)設(shè)大小且數(shù)據(jù)內(nèi)容為所述目標(biāo)單元數(shù)據(jù)的補丁單元;所述原始文件的多個原始單元數(shù)據(jù)對應(yīng)的補丁單元形成補丁文件。
可選地,所述補丁更新模塊包括:
補丁單元獲取單元,用于從所述補丁文件中獲取每個補丁單元;
偏移地址讀取單元,用于從所述補丁單元中讀取對應(yīng)的偏移地址;
補丁單元寫入單元,用于把所述偏移地址作為起始地址,將每個補丁單元寫入對應(yīng)的存儲空間,從而完成對所述需要升級軟件的更新。
可選地,所述裝置還包括更新驗證模塊,所述更新驗證模塊包括:
結(jié)束地址獲取單元,用于獲取每個補丁單元中的數(shù)據(jù)寫入存儲空間后的結(jié)束地址;
更新數(shù)據(jù)獲取單元,用于根據(jù)所述結(jié)束地址和所述起始地址獲取實際更新數(shù)據(jù);
更新驗證單元,用于在所述實際更新數(shù)據(jù)與所述補丁單元中的數(shù)據(jù)大小相同且數(shù)據(jù)內(nèi)容一致時,則確定更新完成,否則更新失敗。
可選地,所述補丁更新模塊還包括:
更新條件獲取單元,用于獲取所述嵌入式系統(tǒng)的當(dāng)前運行環(huán)境是否滿足更新條件;
補丁更新單元,用于在滿足更新條件時,讀取所述補丁文件對所述需要升級軟件進行更新。
本申請的實施例提供的技術(shù)方案可以包括以下有益效果:
本申請實施例提供的上述方法,可以獲取需要升級軟件的原始文件與對應(yīng)的目標(biāo)文件,然后確定所述原始文件和所述目標(biāo)文件存在差異數(shù)據(jù)時生成所述原始文件的補丁文件,最后根據(jù)上述補丁文件對需要升級軟件進行更新??梢姡旧暾垖嵤├鶕?jù)差異數(shù)據(jù)生成補丁文件,由于該補丁文件僅包括差異數(shù)據(jù),且分為多個補丁單元,從而可以減小每次補丁更新時的數(shù)據(jù)量,解決相關(guān)技術(shù)中升級文件過大用時過長導(dǎo)致升級失敗的問題,從而提升用戶體驗。
應(yīng)當(dāng)理解的是,以上的一般描述和后文的細(xì)節(jié)描述僅是示例性和解釋性的,并不能限制本申請。
附圖說明
此處的附圖被并入說明書中并構(gòu)成本說明書的一部分,示出了符合本發(fā)明的實施例,并與說明書一起用于解釋本發(fā)明的原理。
圖1是本申請一實施例提供的適于嵌入式系統(tǒng)的差量式補丁升級方法的流程示意圖;
圖2是本申請另一實施例提供的適于嵌入式系統(tǒng)的差量式補丁升級方法的流程示意圖;
圖3是本申請再一實施例提供的適于嵌入式系統(tǒng)的差量式補丁升級方法的流程示意圖;
圖4是本申請又一實施例提供的適于嵌入式系統(tǒng)的差量式補丁升級方法的流程示意圖;
圖5是本申請又一實施例提供的適于嵌入式系統(tǒng)的差量式補丁升級方法的流程示意圖;
圖6是本申請又一實施例提供的適于嵌入式系統(tǒng)的差量式補丁升級方法的流程示意圖;
圖7是本申請又一實施例提供的適于嵌入式系統(tǒng)的差量式補丁升級方法的流程示意圖;
圖8是本申請一實施例提供的適于嵌入式系統(tǒng)的差量式補丁升級裝置的結(jié)構(gòu)示意圖;
圖9是本申請另一實施例提供的適于嵌入式系統(tǒng)的差量式補丁升級裝置的結(jié)構(gòu)示意圖;
圖10是本申請再一實施例提供的適于嵌入式系統(tǒng)的差量式補丁升級裝置的結(jié)構(gòu)示意圖;
圖11是本申請又一實施例提供的適于嵌入式系統(tǒng)的差量式補丁升級裝置的結(jié)構(gòu)示意圖;
圖12是本申請又一實施例提供的適于嵌入式系統(tǒng)的差量式補丁升級裝置的結(jié)構(gòu)示意圖;
圖13是本申請又一實施例提供的適于嵌入式系統(tǒng)的差量式補丁升級裝置的結(jié)構(gòu)示意圖。
具體實施方式
這里將詳細(xì)地對示例性實施例進行說明,其示例表示在附圖中。下面的描述涉及附圖時,除非另有表示,不同附圖中的相同數(shù)字表示相同或相似的要素。以下示例性實施例中所描述的實施方式并不代表與本發(fā)明相一致的所有實施方式。相反,它們僅是與如所附權(quán)利要求書中所詳述的、本發(fā)明的一些方面相一致的裝置和方法的例子。
圖1是根據(jù)一示例性實施例示出的適于嵌入式系統(tǒng)的差量式補丁升級方法的流程示意圖。如圖1所示,該差量式補丁升級方法,包括:
步驟101,獲取需要升級軟件的原始文件與所述需要升級軟件對應(yīng)的目標(biāo)文件。
需要說明的是,上述原始文件可以是嵌入式系統(tǒng)的系統(tǒng)文件,或者運行在該嵌入式系統(tǒng)的應(yīng)用軟件的應(yīng)用文件。上述目標(biāo)文件是為上述原始文件需要更新的數(shù)據(jù)。
在步驟101中,獲取需要升級軟件的原始文件,可以直接獲取原始文件在存儲位置的起始地址。在確定原始文件的起始地址后,可以讀取該原始文件中的全部數(shù)據(jù)。
在步驟101中,在確定需要升級軟件之后,可以直接下載需要升級軟件的目標(biāo)文件。當(dāng)然,也可以直接下載到嵌入式系統(tǒng)對應(yīng)存儲設(shè)備flash中,確定該目標(biāo)文件的存儲位置的起始地址。
需要說明的是,本申請實施例中確定需要升級軟件可以由用戶主動申請,也可以由嵌入式系統(tǒng)定時或者隨機檢測。當(dāng)檢測到需要升級軟件相對應(yīng)的目標(biāo)文件時,則獲取原始文件和目標(biāo)文件各自的起始地址。
步驟102,確定所述原始文件和所述目標(biāo)文件存在差異數(shù)據(jù)時生成所述原始文件的補丁文件。
在步驟102中,從各自的起始地址分別讀取原始文件和目標(biāo)文件。作為一實施例,可以將原始文件和目標(biāo)文件全部讀取。然后比較該原始文件和目標(biāo)文件,從而可以確定兩者之間的差異數(shù)據(jù);然后在原始文件與目標(biāo)文件存在差異數(shù)據(jù)時,生成該原始文件的補丁文件。例如,該補丁文件可以包括多個預(yù)設(shè)大小的補丁單元。
作為另一實施例,如圖2所示,根據(jù)差異數(shù)據(jù)生成原始文件的補丁文件的步驟包括:
步驟201,依次從原始文件和目標(biāo)文件中讀取預(yù)設(shè)大小的文件數(shù)據(jù),得到原始單元數(shù)據(jù)和目標(biāo)單元數(shù)據(jù);
步驟202,比較原始單元數(shù)據(jù)和目標(biāo)單元數(shù)據(jù)是否存在差異數(shù)據(jù);
步驟203,若存在差異數(shù)據(jù),則生成預(yù)設(shè)大小且數(shù)據(jù)內(nèi)容為所述目標(biāo)單元數(shù)據(jù)的生成補丁單元;上述原始文件的多個原始單元數(shù)據(jù)對應(yīng)的補丁單元形成補丁文件。
需要說明的是,本申請實施例中,預(yù)設(shè)大小可以根據(jù)嵌入式系統(tǒng)中存儲設(shè)備flash的最小擦寫單元的大小進行設(shè)置。例如,flash的最小擦寫單元的大小為4kb字節(jié),則該預(yù)設(shè)大小可以設(shè)置為4kb字節(jié)。當(dāng)然,本領(lǐng)域技術(shù)人員也可以根據(jù)實際場景進行設(shè)置,例如設(shè)置2kb字節(jié),8kb字節(jié),16kb字節(jié)等,本申請實施例不作限定。
本申請一實施例中,每次讀取預(yù)設(shè)大小的文件數(shù)據(jù),即每次從原始文件讀取到原始單元數(shù)據(jù),再從目標(biāo)文件讀取到目標(biāo)單元數(shù)據(jù)。然后,比較每次讀取的原始單元數(shù)據(jù)和目標(biāo)單元數(shù)據(jù),可以確定單元數(shù)據(jù)兩個之間的差異數(shù)據(jù),然后根據(jù)該目標(biāo)單元數(shù)據(jù)生成該原始單元數(shù)據(jù)的補丁單元。之后,繼續(xù)從原始文件和目標(biāo)文件讀取預(yù)設(shè)大小的文件數(shù)據(jù),然后繼續(xù)比較原始單元數(shù)據(jù)和目標(biāo)單元數(shù)據(jù),在單元數(shù)據(jù)兩者之間存在差異數(shù)據(jù)時,生成預(yù)設(shè)大小且數(shù)據(jù)內(nèi)定與對應(yīng)目標(biāo)單元數(shù)據(jù)相同的的對應(yīng)于該原始單元數(shù)據(jù)的補丁單元。直至原始文件與目標(biāo)文件全部比較完成,得到的多個補丁單元形成該目標(biāo)文件的補丁文件。
可見,本申請實施例中,比較原始文件與目標(biāo)文件時,以預(yù)設(shè)大小為單位進行對比;當(dāng)原始文件和目標(biāo)文件每個單位存在差異數(shù)據(jù)時,針對該單位生成補丁單元。與整個原始文件比較相比,將原始文件拆分為預(yù)設(shè)大小的原始單元數(shù)據(jù),可以減少每次生成補丁文件的大小。
步驟103,根據(jù)所述補丁文件對所述需要升級軟件進行更新。
在步驟103中,作為一實施例,如圖3所示,對需要升級軟件更新的步驟包括:
步驟301,從補丁文件中獲取每個補丁單元;
步驟302,從補丁單元中讀取對應(yīng)的偏移地址;
步驟303,將偏移地址作為起始地址,將每個補丁單元寫入對應(yīng)的存儲空間,從而完成對需要升級軟件的更新。
本申請實施例中,每次從補丁文件中讀取一個補丁單元,然后從該補丁單元中讀取對應(yīng)的偏移地址。需要說明的是,該偏移地址是對應(yīng)于原始單元數(shù)據(jù)的起始地址的偏移量。
本申請實施例中,上述偏移地址作為該補丁單元的起始地址,然后將該補丁單元對應(yīng)的數(shù)據(jù)依次寫入到起始地址。將補丁文件的多個補丁單元依次寫入到各自對應(yīng)的存儲位置。
實際應(yīng)用中,需要升級軟件并非全部需要更新,而是分區(qū)需要更新。為此,在步驟103之前,如圖4所示,本申請一實施例提供的差量式補丁升級方法還包括:
步驟401,確定原始文件為需要升級軟件的全部數(shù)據(jù)或者分區(qū)數(shù)據(jù);
步驟402,若原始文件為需要升級軟件的全部數(shù)據(jù),則對全部數(shù)據(jù)進行更新;
步驟403,若原始文件為需要升級軟件的分區(qū)數(shù)據(jù),則對分區(qū)數(shù)據(jù)進行更新。
本申請一實施例中,獲取原始文件的起始地址,若該起始位置為需要升級軟件的起始地址,則確定該原始文件為需要升級軟件的全部數(shù)據(jù);若該起始位置為需要升級軟件的其中一個分區(qū)的起始地址,則確定該原始文件需要升級軟件的分區(qū)數(shù)據(jù)。
本申請另一實施例中,可以獲取需要升級軟件對應(yīng)的全部數(shù)據(jù)的大小,然后與原始文件的大小相比較,若兩者相等,則確定原始文件為需要升級軟件的全部數(shù)據(jù);若兩者不等,則確定該原始文件需要升級軟件的分區(qū)數(shù)據(jù)。
為保證更新的準(zhǔn)確性,如圖5所示,本申請?zhí)峁┑牟盍渴窖a丁升級方法還包括:
步驟501,獲取每個補丁單元中的數(shù)據(jù)寫入存儲空間后的結(jié)束地址;
步驟502,根據(jù)結(jié)束地址和起始地址獲取實際更新數(shù)據(jù);
步驟503,若實際更新數(shù)據(jù)與補丁單元中的數(shù)據(jù)大小相同且數(shù)據(jù)內(nèi)容一致,則確定更新完成,否則更新失敗。
本申請一實施例中,獲取每個補丁單元中的數(shù)據(jù)寫入存儲空間后對應(yīng)的結(jié)束地址。根據(jù)該補丁單元的起始地址和結(jié)束地址獲取實際更新數(shù)據(jù)。將上述實際更新數(shù)據(jù)與該補丁單元中數(shù)據(jù)大小是否相等且數(shù)據(jù)內(nèi)容是否一致,在補丁單元中數(shù)據(jù)大小與實際更新數(shù)據(jù)大小相等且數(shù)據(jù)內(nèi)容一致時,確定更新完成且準(zhǔn)確。否則補丁單元更新失敗,重新更新。
在需要升級軟件更新的過程中,可能會遇到斷電等情況,導(dǎo)致更新過程失敗。為此,如圖6所示,本申請一實施例提供的差量式補丁升級方法還包括:
步驟601,獲取嵌入式系統(tǒng)的當(dāng)前運行環(huán)境是否滿足更新條件;
步驟602,當(dāng)滿足更新條件時,則讀取補丁文件對需要升級軟件進行更新。
本申請一實施例中,在更新過程失敗后,嵌入式系統(tǒng)獲取當(dāng)前運行環(huán)境,該當(dāng)前運行環(huán)境可以包括是否上電、內(nèi)存空間是否充足、目標(biāo)文件是否存在、補丁文件是否存在等,當(dāng)當(dāng)前運行環(huán)境滿足更新條件時,嵌入式系統(tǒng)讀取補丁文件繼續(xù)對需要升級軟件進行更新。更新過程可以參考上文,在此不再贅述。
下面,以預(yù)設(shè)大小為4kb字節(jié)為例說明本申請?zhí)峁┑牟盍渴窖a丁升級方法。
如圖8所示,分別從原始文件和目標(biāo)文件中讀取4kb字節(jié)的原始單元數(shù)據(jù)和目標(biāo)單元數(shù)據(jù),判斷原始單元數(shù)據(jù)和目標(biāo)單元數(shù)據(jù)是否存在差異數(shù)據(jù),若沒有差異數(shù)據(jù),則繼續(xù)獲取4kb字節(jié)的原始單元數(shù)據(jù)和目標(biāo)單元數(shù)據(jù);若存在差異數(shù)據(jù),則生成該原始單元數(shù)據(jù)的補丁單元,該補丁單元中的數(shù)據(jù)內(nèi)容與目標(biāo)單元數(shù)據(jù)相同。若原始文件和目標(biāo)文件沒有對比完成,則繼續(xù)對比,直至對比完成,上述原始單元數(shù)據(jù)對應(yīng)的補丁單元形成補丁文件。
在形成補丁文件之后,對需要升級軟件進行更新。從補丁文件中讀取補丁單元,并從該補丁單元中讀取其偏移地址,然后以該偏移地址作為對應(yīng)原始單元數(shù)據(jù)的起始地址,然后寫入到存儲空間中更新文件。確定該原始文件是否為分區(qū)數(shù)據(jù),則為分區(qū)數(shù)據(jù)則對該原始文件的分區(qū)進行更新,直至更新完成。若不是分區(qū)數(shù)據(jù),則繼續(xù)更新文件。
至此,本申請?zhí)峁┑牟盍渴窖a丁升級方法,通過對原始文件和目標(biāo)文件進行分單元比較,在兩個單元存在差異數(shù)據(jù)時,針對每個單元生成相應(yīng)的補丁單元。在更新過程中,以每個補丁單元作為升級數(shù)據(jù)??梢?,本申請實施例通過減小每次更新時的補丁文件的大小,可以解決需要升級軟件在升級超時時而引起的失敗的問題,從而可以提升升級速度,提升升級速率。
本申請一實施例還提供了一種適于嵌入式系統(tǒng)的差量式補丁升級裝置,如圖8所示,所述裝置包括:
文件獲取模塊801,用于獲取需要升級軟件的原始文件與所述需要升級軟件對應(yīng)的目標(biāo)文件;
補丁生成模塊802,用于在確定所述原始文件和所述目標(biāo)文件存在差異數(shù)據(jù)時生成所述原始文件的補丁文件;
補丁更新模塊803,用于根據(jù)所述補丁文件對所述需要升級軟件進行更新。
可選地,如圖9所示,文件獲取模塊801包括:
單元數(shù)據(jù)獲取單元901,用于依次從所述原始文件和所述目標(biāo)文件中讀取預(yù)設(shè)大小的文件數(shù)據(jù),得到原始單元數(shù)據(jù)和目標(biāo)單元數(shù)據(jù);
單元數(shù)據(jù)比較單元902,用于比較所述原始單元數(shù)據(jù)和所述目標(biāo)單元數(shù)據(jù)是否存在差異數(shù)據(jù);
補丁文件生成單元903,用于在所述原始單元數(shù)據(jù)和所述目標(biāo)單元數(shù)據(jù)存在差異數(shù)據(jù)時,生成預(yù)設(shè)大小且數(shù)據(jù)內(nèi)容為所述目標(biāo)單元數(shù)據(jù)的補丁單元;所述原始文件的多個原始單元數(shù)據(jù)對應(yīng)的補丁單元形成補丁文件。
可選地,如圖10所示,補丁更新模塊803包括:
補丁單元獲取單元,用于從所述補丁文件中獲取每個補丁單元;
偏移地址讀取單元,用于從所述補丁單元中讀取對應(yīng)的偏移地址;
補丁單元寫入單元,用于把所述偏移地址作為起始地址,將每個補丁單元寫入對應(yīng)的存儲空間,從而完成對所述需要升級軟件的更新。
可選地,上述裝置還包括更新驗證模塊1100。如圖11所示,更新驗證模塊1100包括:
結(jié)束地址獲取單元1101,用于獲取每個補丁單元中的數(shù)據(jù)寫入存儲空間后的結(jié)束地址;
更新數(shù)據(jù)獲取單元1102,用于根據(jù)所述結(jié)束地址和所述起始地址獲取實際更新數(shù)據(jù);
更新驗證單元1103,用于在所述實際更新數(shù)據(jù)與所述補丁單元中的數(shù)據(jù)大小相同且數(shù)據(jù)內(nèi)容一致時,則確定更新完成,否則更新失敗。
可選地,如圖12所示,上述補丁更新模塊803還包括:
數(shù)據(jù)量確定單元1201,用于確定所述原始文件為所述需要升級軟件的全部數(shù)據(jù)或者分區(qū)數(shù)據(jù);
補丁更新單元1202,用于在所述原始文件為所述需要升級軟件的全部數(shù)據(jù)時,對所述全部數(shù)據(jù)進行更新;以及在所述原始文件為所述需要升級軟件的分區(qū)數(shù)據(jù)時,則對所述分區(qū)數(shù)據(jù)進行更新。
可選地,如圖13所示,補丁更新模塊803還包括:
更新條件獲取單元1301,用于獲取所述嵌入式系統(tǒng)的當(dāng)前運行環(huán)境是否滿足更新條件;
補丁更新單元1302,用于在滿足更新條件時,讀取所述補丁文件對所述需要升級軟件進行更新。
關(guān)于上述實施例中的裝置,其中各個單元或者模塊執(zhí)行操作的具體方式已經(jīng)在有關(guān)該方法的實施例中進行了詳細(xì)描述,此處將不做詳細(xì)闡述說明。
本領(lǐng)域技術(shù)人員在考慮說明書及實踐這里公開的公開后,將容易想到本申請的其它實施方案。本申請旨在涵蓋本申請的任何變型、用途或者適應(yīng)性變化,這些變型、用途或者適應(yīng)性變化遵循本申請的一般性原理并包括本申請未公開的本技術(shù)領(lǐng)域中的公知常識或慣用技術(shù)手段。說明書和實施例僅被視為示例性的,本申請的真正范圍和精神由下面的權(quán)利要求指出。
應(yīng)當(dāng)理解的是,本申請并不局限于上面已經(jīng)描述并在附圖中示出的精確結(jié)構(gòu),并且可以在不脫離其范圍進行各種修改和改變。本申請的范圍僅由所附的權(quán)利要求來限制。