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

圖1 客戶端與服務器的數據同步流程
在本次實驗環境中,家庭智能網關使用ARM-Tiny6410開發板,安裝Fedora9-FriendlyARM操作系統,使用SQLite數據庫;云端服務器使用MySQL數據庫。家庭網關和云服務器的數據包括設備信息、情景模式信息和情景設備關系信息。
以下分3種情況對協議的功能和性能進行測試,主要記錄數據同步過程中的同步時延。
(1)客戶端進行數據修改操作。依次在客戶端修改多條數據,測試協議的功能與性能。實驗結果顯示,客戶端能夠及時地將數據修改操作同步到云服務器。數據同步過程中的時延如表1所示。

表1 客戶端進行數據修改操作
(2)服務器進行數據修改操作。依次在服務器修改多條數據,測試協議的功能與性能。實驗結果顯示,云服務器能夠及時地將數據修改操作同步到客戶端。數據同步過程中的時延如表2所示。

表2 服務器進行數據修改操作
(3)客戶端和服務器同時進行數據修改操作。依次同時在客戶端和服務器修改多條數據,測試協議的功能與性能。實驗結果顯示,云服務器和客戶端都能及時地將數據修改操作同步到對方,并且當客戶端和服務器的數據修改操作沖突時,確實是以客戶端的修改操作為準的。數據同步過程中的時延如表3所示。

表3 兩端同時進行數據修改操作
經過實驗結果分析,該數據同步協議能夠適用于智能家居環境中,實現智能家居網關與云服務器之間的數據同步,并且同步時延在可接受范圍內。
隨著智能化技術的不斷發展,智能家居產業也正在展現出新的生機與活力。越來越多的新技術引入家庭環境中,為人們提供一個更加舒適的生活環境[15]。文中利用云技術研究并設計了一套智能家居管理系統,提供了對分散的家庭設備信息的集中高效管理。該系統的核心是云端系統與智能家居網關之間的數據同步技術。詳細定義了數據同步協議中通信報文的格式與具體報文交互流程,由此實現了云端系統與智能家居網關之間異構數據庫的增量同步。