吳 磊,原 鵬,丁維龍
(北方工業(yè)大學 計算機學院,北京 100144)
智能家居作為一個新興產(chǎn)業(yè),在國內(nèi)正在進入快速發(fā)展階段。智能家居最基本的目標是為人們提供一個舒適、安全、方便和高效的生活環(huán)境[1]。智能家居網(wǎng)關是智能家居環(huán)境的核心設備之一,負責對智能家庭設備的直接管理,包括信息采集、信息輸入輸出與集中控制等功能[2]。智能家居網(wǎng)關中存儲了每個家庭個性化的設備數(shù)據(jù)和情景模式數(shù)據(jù)。對于家庭用戶來說,這種方式足夠給用戶提供所需的對設備的管理功能;但是,對于智能家居服務人員來說,分散存儲在各個智能家居網(wǎng)關中的數(shù)據(jù),給管理人員的維護與管理帶來了諸多不便。目前,常用的維護方式還是通過管理軟件與智能家居網(wǎng)關直連方式,由維護人員上門服務。這種維護方式嚴重影響了管理效率,與智能家居的方便性背道而馳,導致用戶的體驗較差。
因此,利用云技術研究了一套智能家居網(wǎng)關管理系統(tǒng),實現(xiàn)對用戶分散的智能家居數(shù)據(jù)的集中管理,從而提高管理效率[3]。云端系統(tǒng)對智能家居網(wǎng)關中的數(shù)據(jù)進行了集中存儲,當維護人員獲得用戶授權后,即可對單個用戶的家庭數(shù)據(jù)進行遠程管理。云端系統(tǒng)主要提供以下功能:對所有用戶智能家居網(wǎng)關數(shù)據(jù)的集中存儲、對所有用戶智能家居網(wǎng)關數(shù)據(jù)的定時備份、對單個用戶智能家居網(wǎng)關數(shù)據(jù)的管理、對單個用戶智能家居網(wǎng)關數(shù)據(jù)的選擇恢復[4]。
其中,核心技術是云端系統(tǒng)與智能家居網(wǎng)關之間的數(shù)據(jù)傳輸與同步技術。在數(shù)據(jù)傳輸技術中,研究了一套簡潔實用的數(shù)據(jù)同步協(xié)議,實現(xiàn)云端系統(tǒng)與智能家居網(wǎng)關之間異構數(shù)據(jù)庫的數(shù)據(jù)同步。
目前在數(shù)據(jù)同步領域常見的協(xié)議有Palm HotSync、CPISync和SyncML[5]。
HotSync協(xié)議是由Palm公司注冊的,安裝有Palm操作系統(tǒng)的Palm PDAs實現(xiàn)了HotSync協(xié)議。該協(xié)議的適用范圍有限。
CPISync協(xié)議是基于代數(shù)方法解決兩個遠端數(shù)據(jù)的同步問題,但是在數(shù)據(jù)記錄變化較大的情況下,計算復雜度相當高,從而造成數(shù)據(jù)傳輸上的瓶頸問題。
SyncML協(xié)議是由IBM、Lotus、Motorola、Nokia、Palm Inc、Psion、Starfish Software等公司成立的數(shù)據(jù)同步論壇組織—SyncML發(fā)起組制定的,是一種行業(yè)通用的數(shù)據(jù)同步協(xié)議。SyncML定義的數(shù)據(jù)類型有雙向同步、慢同步、客戶端發(fā)起單向同步、客戶端發(fā)起刷新同步、服務器端發(fā)起單向同步、服務器端發(fā)起刷新同步、服務器端請求同步,共7種同步類型。但是SyncML對存儲空間要求較高[6]。
由于常用的數(shù)據(jù)同步協(xié)議在智能家居環(huán)境中并不能很好地適用,所以,文中研究制定了一套簡潔的數(shù)據(jù)同步協(xié)議,用于解決智能家居網(wǎng)關與云服務器之間的數(shù)據(jù)同步問題。
在智能家居環(huán)境中,云端系統(tǒng)一般使用較大型的數(shù)據(jù)庫,用于滿足存儲大量家庭用戶數(shù)據(jù)的需求。而屬于嵌入式設備的智能家庭網(wǎng)關由于硬件環(huán)境的限制,只能使用小型數(shù)據(jù)庫,所以導致了兩者之間使用的數(shù)據(jù)庫的異構性[7]。并且由于智能家居網(wǎng)關帶寬與存儲空間的限制,使用增量的數(shù)據(jù)同步協(xié)議能夠很好地節(jié)省資源[8]。所以文中制定了一個用于異構數(shù)據(jù)庫之間的增量數(shù)據(jù)同步協(xié)議。
同步的數(shù)據(jù)通過云端系統(tǒng)與智能家居網(wǎng)關之間的報文消息進行傳輸,報文消息包括智能家居發(fā)送給云端的請求消息和云端回復的響應消息。傳輸?shù)臄?shù)據(jù)封裝在消息的數(shù)據(jù)域中。雙方對通信的報文格式有一個協(xié)定,這樣發(fā)送的報文才能在對方進行解析與處理,并且方便移植到其他系統(tǒng)中。然后,在通信報文的基礎上規(guī)定一套通信流程,實現(xiàn)云端系統(tǒng)與智能家居網(wǎng)關之間的數(shù)據(jù)同步。
通信消息分為從客戶端到服務器的請求消息和從服務器端到客戶端的響應消息兩種類型。兩種消息都由一個消息開始行,一個或多個頭域,一個可有可無的數(shù)據(jù)域和一個消息結束行組成。
2.1.1 消息開始行
(1)請求消息的開始行。請求消息的開始行由消息關鍵字和客戶端Mac地址組成。關鍵字用于表示該消息的功能,Mac地址用于記錄該消息的來源客戶端。其中,所有能正常與服務器進行通信的客戶端,都需要在服務器進行Mac登記。當服務器接收到未登記的客戶端發(fā)來的請求消息時,會拒絕與該客戶端交互消息。
請求消息的關鍵字有以下幾個:
Detect:探測消息,表示該消息是用于探測服務器是否有數(shù)據(jù)修改操作的;
SendData:發(fā)送數(shù)據(jù),該消息用于將客戶端的數(shù)據(jù)修改操作發(fā)送給服務器;
SynOk:同步成功,表示客戶端成功將服務器的數(shù)據(jù)修改操作同步到本地數(shù)據(jù)庫;
SynError:同步失敗,表示客戶端雖然接收到了服務器的數(shù)據(jù)修改操作,但是并未成功同步到本地數(shù)據(jù)庫;
UnKnown:接收到未知消息,表示客戶端無法識別接收到的服務器消息。
(2)響應消息的開始行。響應消息的消息開始行由消息關鍵字組成,關鍵字用于表示該消息的功能,響應消息的關鍵字有以下幾個:
SendData:發(fā)送數(shù)據(jù),該消息用于將服務器的數(shù)據(jù)修改操作發(fā)送給客戶端;
SynOk:同步成功,表示服務器成功將客戶端的數(shù)據(jù)修改操作同步到數(shù)據(jù)庫;
SynError:同步失敗,表示服務器雖然接收到了客戶端的數(shù)據(jù)修改操作,但是并未成功同步到數(shù)據(jù)庫;
EndConnection:結束連接報文,告知客戶端本次數(shù)據(jù)同步過程可以結束。
2.1.2 消息的頭域
請求消息和響應消息使用相同的頭域,頭域有:
Syn:表示是否成功將對方的數(shù)據(jù)修改操作同步到數(shù)據(jù)庫,如果成功為true,否則為false;ErrorCode:當接收到無法識別的消息時,會定位無法識別的位置,然后將錯誤消息封裝到該頭域中。錯誤類型有:
101:消息開始行格式錯誤;
102:消息關鍵字無法識別;
103:客戶端Mac未登記;
201:消息頭域的格式錯誤;
202:出現(xiàn)了無法識別的頭域;
301:消息數(shù)據(jù)域格式錯誤;
302:數(shù)據(jù)域中操作類型無法識別;
303:數(shù)據(jù)域中操作的表名無法識別;
401:數(shù)據(jù)寫入錯誤;
501:其他錯誤。
HasData:表示該消息是否有數(shù)據(jù)域,如果有為true,否則為false。同時HasData要求是放在頭域的最后一行,用于表示頭域結束和數(shù)據(jù)域開始。
2.1.3 消息的數(shù)據(jù)域
請求消息和響應消息的數(shù)據(jù)域使用相同的格式。數(shù)據(jù)域的每一行由操作類型、操作的表名、操作數(shù)據(jù)的主鍵和具體字段組成,它們之間用“#”號分隔。每一行數(shù)據(jù)代表了一條具體操作。數(shù)據(jù)格式如下:
操作類型#操作的表名#操作數(shù)據(jù)的主鍵#字段1 字段2 …… 字段n
其中操作類型有:insert、delete、update,分別代表對該條數(shù)據(jù)進行增加、刪除或者是更新操作。
操作的表名為數(shù)據(jù)庫中存放數(shù)據(jù)的表??蛻舳撕头掌鞔娣艛?shù)據(jù)的表名可以相同,也可以不同。如果不同,則由服務器在封裝和解析報文時進行表名轉換工作。
操作數(shù)據(jù)的主鍵是進行了數(shù)據(jù)修改操作的數(shù)據(jù)主鍵,根據(jù)操作記錄表中該數(shù)據(jù)的所在表名,當進行數(shù)據(jù)同步時,會從相應的數(shù)據(jù)表中查詢出具體數(shù)據(jù),然后一起封裝到消息的數(shù)據(jù)域中[9]。
2.1.4 消息結束行
兩種消息都由一個消息結束行作為消息的結束標記。消息結束行由單行的#END#組成??蛻舳撕头掌麟p方通信時,不斷從Socket中讀取對方發(fā)送的數(shù)據(jù),當遇到消息結束行時,表示接收到一個完整的消息,這時就可以對該消息進行解析與處理。為了健壯性,會忽略消息結束行之前的所有空行。
數(shù)據(jù)同步流程主要分為三個階段:準備階段、周期等待階段和數(shù)據(jù)傳輸階段。
2.2.1 準備階段
準備階段主要負責在云服務器登記注冊智能家居網(wǎng)關信息,主要登記Mac地址。然后由智能家居網(wǎng)關將采集到的家庭設備信息發(fā)送給云服務器,實現(xiàn)兩者之間數(shù)據(jù)的初始同步[10]。
2.2.2 周期等待
智能家居網(wǎng)關每隔一段時間向云服務器發(fā)送一次探測消息,探測云服務器是否有數(shù)據(jù)修改操作。一次數(shù)據(jù)同步結束到下一次發(fā)送探測消息之前的時間間隔稱為等待周期,這個過程稱為周期等待。
由于每次通信連接的建立都需要由智能家居網(wǎng)關主動發(fā)起,所以當云服務器有數(shù)據(jù)修改操作時,數(shù)據(jù)庫的觸發(fā)器會自動將修改操作插入到操作記錄表中[11],等待智能家居網(wǎng)關探測消息的來臨,然后發(fā)送給智能家居網(wǎng)關。
同時,為了防止客戶端頻繁與服務器通信,當智能家居網(wǎng)關有數(shù)據(jù)修改操作時,先將修改操作暫存在操作記錄表中,在周期等待結束發(fā)送探測消息之前,先將自己的數(shù)據(jù)修改操作發(fā)送給服務器,等服務器將客戶端的數(shù)據(jù)修改操作同步結束后再發(fā)送探測消息。
等待周期的長短可以根據(jù)數(shù)據(jù)同步及時性的要求在智能家居網(wǎng)關中設定,一般為幾毫秒到幾秒不等。
2.2.3 數(shù)據(jù)傳輸
當?shù)却芷诮Y束后,智能家居網(wǎng)關與云服務器建立連接,進行數(shù)據(jù)傳輸。數(shù)據(jù)傳輸過程負責將智能家居網(wǎng)關采集到的智能家庭設備的變化信息,及時上報給云服務器,同時,云服務器將數(shù)據(jù)管理操作下發(fā)給智能家居網(wǎng)關。
傳輸流程:數(shù)據(jù)傳輸開始時智能家居網(wǎng)關先與云服務器建立TCP連接;連接建立后,智能家居網(wǎng)關查詢操作記錄表,將采集到的變化的數(shù)據(jù)信息上報給云服務器;然后發(fā)送探測消息,獲取云服務器的數(shù)據(jù)修改操作。雙方數(shù)據(jù)交互結束后,斷開連接進入等待周期。
在智能家居系統(tǒng)中,為了方便對智能家居數(shù)據(jù)的集中高效管理,云端系統(tǒng)負責集中存儲家庭數(shù)據(jù)。當云端或智能家居網(wǎng)關中的數(shù)據(jù)更改操作時,兩端數(shù)據(jù)需要及時進行數(shù)據(jù)同步操作[12]。同步初始化時,先在服務器登記客戶端信息。主要登記客戶端的Mac地址。登記成功后,客戶端將全部的初始數(shù)據(jù)封裝到以關鍵字SendData開始的消息中,發(fā)送給服務器。服務器將數(shù)據(jù)寫入數(shù)據(jù)表,完成服務器與客戶端數(shù)據(jù)的初始同步。
等待周期結束后,客戶端先查詢操作記錄表,如果客戶端有未同步到服務器的數(shù)據(jù)修改操作,則將具體操作封裝到以關鍵字SendData開頭的請求消息中發(fā)送給服務器。服務器接收到客戶端的SendData消息,解析消息的數(shù)據(jù)域。然后對服務器數(shù)據(jù)進行相應的數(shù)據(jù)修改操作[13]。如果操作成功,則回復SynOk消息;如果操作失敗,則回復SynError消息,并且將錯誤代碼封裝在頭域的ErrorCode中??蛻舳私邮盏巾憫⒑螅馕鱿⒌年P鍵字。如果是SynOk,則清除操作記錄表中的相應記錄。如果是SynError,則解析頭域中的錯誤消息,寫入日志文件,對操作記錄表不做操作。然后客戶端再發(fā)送以關鍵字Detect開頭的探測消息,探測服務器是否有數(shù)據(jù)修改操作。
服務器接收到客戶端發(fā)送的Detect探測消息后,查詢操作記錄表。如果有未同步到客戶端的數(shù)據(jù)修改操作,則將操作封裝到以關鍵字SendData開始的響應消息中回復給客戶端??蛻舳私邮盏絊endData消息后,解析消息的數(shù)據(jù)域,然后對客戶端數(shù)據(jù)進行相應的數(shù)據(jù)修改操作[14]。如果操作成功,則向服務器端發(fā)送SynOk消息;如果操作失敗,則向服務器發(fā)送SynError消息,并且將錯誤代碼封裝在消息的ErrorCode頭域中。服務器端接收到客戶端的消息后,解析消息的關鍵字。如果是SynOk,則清除操作記錄表中的相應記錄;如果是SynError,則解析頭域中的錯誤代碼,寫入日志文件,對操作記錄表不做修改。然后向客戶端回復以EndConnection關鍵字開頭的響應消息??蛻舳私邮盏皆擁憫⒑髷嚅_與服務器的連接。本次數(shù)據(jù)同步過程結束,進入等待周期。
具體的數(shù)據(jù)同步流程如圖1所示。
圖1 客戶端與服務器的數(shù)據(jù)同步流程
在本次實驗環(huán)境中,家庭智能網(wǎng)關使用ARM-Tiny6410開發(fā)板,安裝Fedora9-FriendlyARM操作系統(tǒng),使用SQLite數(shù)據(jù)庫;云端服務器使用MySQL數(shù)據(jù)庫。家庭網(wǎng)關和云服務器的數(shù)據(jù)包括設備信息、情景模式信息和情景設備關系信息。
以下分3種情況對協(xié)議的功能和性能進行測試,主要記錄數(shù)據(jù)同步過程中的同步時延。
(1)客戶端進行數(shù)據(jù)修改操作。依次在客戶端修改多條數(shù)據(jù),測試協(xié)議的功能與性能。實驗結果顯示,客戶端能夠及時地將數(shù)據(jù)修改操作同步到云服務器。數(shù)據(jù)同步過程中的時延如表1所示。
表1 客戶端進行數(shù)據(jù)修改操作
(2)服務器進行數(shù)據(jù)修改操作。依次在服務器修改多條數(shù)據(jù),測試協(xié)議的功能與性能。實驗結果顯示,云服務器能夠及時地將數(shù)據(jù)修改操作同步到客戶端。數(shù)據(jù)同步過程中的時延如表2所示。
表2 服務器進行數(shù)據(jù)修改操作
(3)客戶端和服務器同時進行數(shù)據(jù)修改操作。依次同時在客戶端和服務器修改多條數(shù)據(jù),測試協(xié)議的功能與性能。實驗結果顯示,云服務器和客戶端都能及時地將數(shù)據(jù)修改操作同步到對方,并且當客戶端和服務器的數(shù)據(jù)修改操作沖突時,確實是以客戶端的修改操作為準的。數(shù)據(jù)同步過程中的時延如表3所示。
表3 兩端同時進行數(shù)據(jù)修改操作
經(jīng)過實驗結果分析,該數(shù)據(jù)同步協(xié)議能夠適用于智能家居環(huán)境中,實現(xiàn)智能家居網(wǎng)關與云服務器之間的數(shù)據(jù)同步,并且同步時延在可接受范圍內(nèi)。
隨著智能化技術的不斷發(fā)展,智能家居產(chǎn)業(yè)也正在展現(xiàn)出新的生機與活力。越來越多的新技術引入家庭環(huán)境中,為人們提供一個更加舒適的生活環(huán)境[15]。文中利用云技術研究并設計了一套智能家居管理系統(tǒng),提供了對分散的家庭設備信息的集中高效管理。該系統(tǒng)的核心是云端系統(tǒng)與智能家居網(wǎng)關之間的數(shù)據(jù)同步技術。詳細定義了數(shù)據(jù)同步協(xié)議中通信報文的格式與具體報文交互流程,由此實現(xiàn)了云端系統(tǒng)與智能家居網(wǎng)關之間異構數(shù)據(jù)庫的增量同步。