本發(fā)明涉及智能家居通信技術(shù)領(lǐng)域,特別涉及一種基于mqtt多層級聯(lián)的消息路由方法。
背景技術(shù):
智能家居網(wǎng)關(guān)能夠?qū)⒓彝ル娖髟O(shè)備通過有線方式、無線方式與它連接后通過一個統(tǒng)一的接口與外部網(wǎng)絡(luò)進行通信,在智能家居中擔(dān)任核心角色。但是目前智能家居方案存在諸多不足,一般家庭內(nèi)部只部署一個網(wǎng)關(guān),單網(wǎng)關(guān)所能提供的硬件接口有限,無線通信區(qū)域范圍受限。雖然采用多網(wǎng)關(guān)的結(jié)構(gòu)可以彌補物理距離和硬件資源不足的缺陷,但是多個網(wǎng)關(guān)之間的連接和管理是一大難題,所以較少被采用。
當(dāng)前物聯(lián)網(wǎng)存在很多傳輸協(xié)議,其中mqtt(messagequeuingtelemetrytransport,消息隊列遙測傳輸)是由ibm公司開發(fā),運行與tcp/ip之上、基于消息推送、可靠、穩(wěn)健、開源的協(xié)議,在通用性、可擴展性、兼容性、耗能和流量等方面都有明顯優(yōu)勢。但是當(dāng)前基于mqtt協(xié)議的網(wǎng)絡(luò)通信存在以下兩個問題:由于mqtt通信多采用集中星型網(wǎng)絡(luò)拓撲,在傳統(tǒng)的mqtt遠程控制中,家庭內(nèi)的多個智能家居網(wǎng)關(guān)可以各自通過互聯(lián)網(wǎng)和智能家居服務(wù)平臺的mqttbroker進行連接通信,這樣對于一個家庭來說,多個網(wǎng)關(guān),對外就存在著多個通信的接口,平臺對同一家庭多個網(wǎng)關(guān)管理不方便,也對多個家庭的多個網(wǎng)關(guān)管理不便。另一個問題是當(dāng)家庭內(nèi)部存在多個網(wǎng)關(guān)時,用戶需要訪問不同的網(wǎng)關(guān)去控制不同區(qū)域內(nèi)的家電設(shè)備。
針對當(dāng)前智能家居方案的不足和mqtt協(xié)議通信的特點,本發(fā)明提出了一種基于mqtt多層級聯(lián)的消息路由方法,改進mqtt協(xié)議的集中星型網(wǎng)絡(luò)拓撲,支持多層級聯(lián)的網(wǎng)關(guān)拓撲,使用多網(wǎng)關(guān)的智能家居方案,實現(xiàn)多網(wǎng)關(guān)之間的多層級聯(lián)組網(wǎng)并進行消息路由。
技術(shù)實現(xiàn)要素:
本發(fā)明的目的在于提供基于mqtt多層級聯(lián)的消息路由方法,改進mqtt協(xié)議的集中星型網(wǎng)絡(luò)拓撲,支持多層級聯(lián)的網(wǎng)關(guān)拓撲,支持多網(wǎng)關(guān)的連接組網(wǎng)和消息路由,解決當(dāng)前智能家居多網(wǎng)關(guān)的連接、通信和管理問題,并支持家庭中根據(jù)自定義規(guī)則將家電設(shè)備劃分于不同區(qū)域進行安全快捷的內(nèi)網(wǎng)控制和小范圍管理。
本發(fā)明的目的至少通過如下技術(shù)方案之一實現(xiàn)。
一種基于mqtt多層級聯(lián)的消息路由方法,包括基于mqtt的多網(wǎng)關(guān)組網(wǎng),路由下行和路由上行;
所述基于mqtt多網(wǎng)關(guān)組網(wǎng)將新網(wǎng)關(guān)添加到原有網(wǎng)絡(luò)中,在新網(wǎng)關(guān)上添加新的家電設(shè)備,新網(wǎng)關(guān)與其他網(wǎng)關(guān)相連形成基于mqtt的多層級聯(lián)的網(wǎng)絡(luò)拓撲結(jié)構(gòu);
所述路由下行指由mqtt控制端發(fā)送的消息路由到家電設(shè)備,路由下行是在基于mqtt的多層級聯(lián)的網(wǎng)絡(luò)中查找網(wǎng)關(guān)的下級路由規(guī)則,并將消息轉(zhuǎn)發(fā)至下級網(wǎng)關(guān);
所述路由上行指家電設(shè)備的反饋消息路由到mqtt控制端,其中包括家電設(shè)備的反饋消息路由到所有mqtt控制端和家電設(shè)備的反饋消息路由到其中一個mqtt控制端。
進一步地,所述的方法包括如下步驟:
步驟一、基于mqtt的多網(wǎng)關(guān)組網(wǎng)。
步驟二、在基于mqtt多網(wǎng)關(guān)組網(wǎng)的基礎(chǔ)上進行路由下行,由mqtt控制端發(fā)送的消息路由到家電設(shè)備。
步驟三、在基于mqtt多網(wǎng)關(guān)組網(wǎng)的基礎(chǔ)上進行路由上行,家電設(shè)備的反饋消息路由到mqtt控制端。
上述步驟一中基于mqtt的多網(wǎng)關(guān)組網(wǎng)包括下述步驟:
(1)、網(wǎng)關(guān)啟動時先查詢本地數(shù)據(jù)庫是否存在自身的uid(uniqueidentifier,全局唯一標識)。若不存在,則根據(jù)snowflake算法生成uid,uid用于標識網(wǎng)關(guān),網(wǎng)關(guān)自動訂閱主題“/uid/#”(mqtt主題格式,斜線(/)是用來分隔一棵主題樹里的各個層次,它提供了一個層次結(jié)構(gòu)的主題空間。數(shù)字符號(#)即多層次通配符,用來匹配一個主題內(nèi)的任意層次。“/uid/#”表示在“/uid/”層次下的所有主題)。
(2)、接著查詢本地數(shù)據(jù)庫,用戶通過web頁面配置該節(jié)點的上一級路由節(jié)點的ip地址。
(3)、然后uid網(wǎng)關(guān)與上一級網(wǎng)關(guān)uid0進行連接。獲得上級網(wǎng)關(guān)的路由規(guī)則“.../uid0/#”(省略號“...”指該上級網(wǎng)關(guān)可能存在比自身層次高的網(wǎng)關(guān),路由規(guī)則“.../uid0/#”指可以路由到主題層次為“.../uid0/”以下的所有主題),更新本地路由表中上級網(wǎng)關(guān)的路由規(guī)則為“.../uid0/#”,當(dāng)前自身的路由規(guī)則為“.../uid0/uid/#”。
(4)、上一級網(wǎng)關(guān)接收到uid網(wǎng)關(guān)連接后,在自身的下級網(wǎng)關(guān)路由規(guī)則中添加一條“.../uid/#”。
(5)、uid網(wǎng)關(guān)啟動設(shè)備發(fā)現(xiàn)程序、將搜索到且信息匹配的家電設(shè)備的sid(systemidentification,系統(tǒng)標識碼)與自身的uid,以uid/sid的格式作為家電設(shè)備的全局唯一標識(usid),同時網(wǎng)關(guān)在自身的設(shè)備列表中記錄“sid”和路由規(guī)則。
(6)、uid網(wǎng)關(guān)將usid上報給上一級網(wǎng)關(guān),上級網(wǎng)關(guān)在自身的設(shè)備列表中記錄“uid/sid”和路由規(guī)則。
(7)、每一級網(wǎng)關(guān)遞歸執(zhí)行上一步操作,直到usid上報到智能家居服務(wù)平臺為止。
優(yōu)選的,所述步驟(5)中,網(wǎng)關(guān)在自身的設(shè)備列表中記錄“sid”和路由規(guī)則具體操作如下:
由于當(dāng)前網(wǎng)關(guān)搜索到sid的家電設(shè)備直連到網(wǎng)關(guān)上,因此路由規(guī)則填寫網(wǎng)關(guān)自己的uid,并且后綴填寫該設(shè)備接到網(wǎng)關(guān)設(shè)備的哪個硬件接口,如串口uart1上,則設(shè)備列表中記錄“sid”,路由規(guī)則“uid/uart0”。
優(yōu)選的,所述步驟(6)中,uid網(wǎng)關(guān)將usid上報給上一級網(wǎng)關(guān),上級網(wǎng)關(guān)在自身的設(shè)備列表中記錄“uid/sid”和路由規(guī)則具體操作如下:
uid網(wǎng)關(guān)查找路由表中上級網(wǎng)關(guān)的路由規(guī)則為“.../uid0/”,路由規(guī)則作為發(fā)布主題的前綴。例如網(wǎng)關(guān)發(fā)布通知消息,主題為“.../uid0/devinfo_notify”,內(nèi)容為usid;標識為uid0的上級網(wǎng)關(guān)默認自動訂閱主題為“.../uid0/#”的消息,便能接收到主題前綴為“.../uid0/”的所有與自身相關(guān)的消息。標識為uid0的上級網(wǎng)關(guān)接收到usid后在自身原有的設(shè)備列表中添加記錄“sid”,路由規(guī)則為下級網(wǎng)關(guān)“uid”。
上述步驟二中在基于mqtt多網(wǎng)關(guān)組網(wǎng)的基礎(chǔ)上進行路由下行,由mqtt控制端發(fā)送的消息路由到家電設(shè)備包括下述小步驟:
(1)、經(jīng)過步驟一組成的多層級聯(lián)網(wǎng)關(guān)結(jié)構(gòu)中,任意一個網(wǎng)關(guān)接收到來自mqtt控制端的消息時,先提取消息中的被控對象。
(2)、接著查詢本地設(shè)備列表。
(3)、若被控對象不存在于本地設(shè)備列表中,則上報上一級網(wǎng)關(guān),最終上報到服務(wù)平臺,服務(wù)平臺將此消息丟棄。
(4)、若被控對象存在于本地設(shè)備列表中,查詢路由規(guī)則,直接發(fā)送該消息給路由規(guī)則中的下級網(wǎng)關(guān),如果下一級是自身,則通過相應(yīng)透傳模塊將消息發(fā)送給家電設(shè)備。
優(yōu)選的,所述步驟(1)(2)中,uid0網(wǎng)關(guān)收到mqtt控制消息主題為“.../uid0/control/sid”,先提取出被控對象sid,接著查詢本地設(shè)備列表存在sid,路由規(guī)則為下級網(wǎng)關(guān)“uid”,修改主題中uid0為uid,轉(zhuǎn)發(fā)該消息到下級網(wǎng)關(guān)。
上述步驟三中在基于mqtt多網(wǎng)關(guān)組網(wǎng)的基礎(chǔ)上進行路由上行,家電設(shè)備的反饋消息路由到mqtt控制端包括兩種情況,一種是家電設(shè)備的反饋消息路由到所有mqtt控制端,一種是家電設(shè)備的反饋消息路由到具體某一mqtt控制端。
家電設(shè)備的反饋消息路由到所有mqtt控制端包括下述小步驟:
(1)、經(jīng)過步驟一組成的多層級聯(lián)網(wǎng)關(guān)結(jié)構(gòu)中,任意一個網(wǎng)關(guān)接收到來自家電設(shè)備的消息時,查詢本地的移動控制端列表,獲取直連到該網(wǎng)關(guān)的所有mqtt控制端。
(2)、接著將消息轉(zhuǎn)發(fā)給每一個直連的mqtt控制端。
(3)、將消息上報給上一級網(wǎng)關(guān),并且發(fā)送給它的下一級網(wǎng)關(guān)。上級網(wǎng)關(guān)接收到上行消息除了發(fā)送給自己上級,還要發(fā)送給除了上報該消息的網(wǎng)關(guān)之外的其他下級網(wǎng)關(guān);下級網(wǎng)關(guān)接收到上行消息時只下發(fā)給下級,每一個網(wǎng)關(guān)都會將消息轉(zhuǎn)發(fā)給所有直連的mqtt控制端,確保智能家居系統(tǒng)中所有mqtt控制端的信息同步。需注意的是,當(dāng)下級網(wǎng)關(guān)收到來自上級網(wǎng)關(guān)的上行消息時,下級網(wǎng)關(guān)不再需要將上行消息上報給上級網(wǎng)關(guān),否則會形成廣播風(fēng)暴。
家電設(shè)備的反饋消息路由到具體某一mqtt控制端包括下述小步驟:
(1)、經(jīng)過步驟一組成的多層級聯(lián)網(wǎng)關(guān)結(jié)構(gòu)中,任意一個網(wǎng)關(guān)接收到來自家電設(shè)備的消息時,查詢本地的移動控制端列表,判斷是否包含目的mqtt控制端,若存在則發(fā)送到該目的mqtt控制端并停止,若不存在則發(fā)送到上級網(wǎng)關(guān)。
(2)、上級網(wǎng)關(guān)接收到消息,重復(fù)步驟(1),直至停止或者發(fā)送到服務(wù)平臺。
與現(xiàn)有技術(shù)相比,本發(fā)明的有益效果在于:
1)改進了mqtt協(xié)議的集中星型網(wǎng)絡(luò)拓撲,支持多層級聯(lián)的網(wǎng)關(guān)拓撲。改進后智能家居服務(wù)平臺的mqttbroker不需要同時管理來自同個家庭的多個網(wǎng)關(guān),每個家庭可以只有一個一級網(wǎng)關(guān)直連到服務(wù)平臺,相當(dāng)一個家庭只提供一個對外接口,其余網(wǎng)關(guān)連接到一級網(wǎng)關(guān)以下;并且當(dāng)家庭內(nèi)部存在多個網(wǎng)關(guān)時,用戶可以通過不同網(wǎng)關(guān)去控制不同區(qū)域內(nèi)的家電設(shè)備,而無需認定具體某一網(wǎng)關(guān)才能控制該設(shè)備。
2)支持多網(wǎng)關(guān)的連接組網(wǎng)和消息路由,實現(xiàn)一種通過mqtt進行多網(wǎng)關(guān)組網(wǎng)的方法。該方法能支持家庭中根據(jù)自定義規(guī)則將家電設(shè)備劃分于不同區(qū)域進行安全快捷的內(nèi)網(wǎng)控制和小范圍管理,并擴大無線通信區(qū)域范圍。比如支持將家庭內(nèi)部根據(jù)物理距離或者硬件通信接口劃分為不同小區(qū)域,如房間一劃分為區(qū)域一,房間二為區(qū)域二,方便用戶對不同區(qū)域進行不同的控制和管理。
附圖說明
圖1為實施例中實現(xiàn)的基于mqtt的多層級聯(lián)網(wǎng)關(guān)拓撲圖。
圖2為實施例中多網(wǎng)關(guān)組網(wǎng)流程示意圖。
圖3為具體實施過程中路由下行流程圖。
圖4為具體實施過程中路由上行到所有mqtt控制端流程圖。
具體實施方式
下面結(jié)合附圖和具體的實施例對本發(fā)明的實施方案做進一步的說明。
本實例的基于mqtt多層級聯(lián)的消息路由方法,主要由四個步驟組成,步驟如下:
步驟1:基于mqtt的多網(wǎng)關(guān)組網(wǎng):添加新網(wǎng)關(guān),家電設(shè)備連接到新網(wǎng)關(guān)。具體組網(wǎng)流程如圖2所示,最終形成圖1的多層級聯(lián)的網(wǎng)關(guān)拓撲圖。
a)網(wǎng)關(guān)啟動時先查詢本地數(shù)據(jù)庫是否存在自身的uid。若不存在,則根據(jù)snowflake算法生成uid,uid用于標識網(wǎng)關(guān),網(wǎng)關(guān)自動訂閱主題“/uid/#”。
例如啟動新網(wǎng)關(guān),新網(wǎng)關(guān)查詢不到uid,根據(jù)snowflake算法生成uid,網(wǎng)關(guān)自動訂閱主題“/uid/#”。
b)用戶通過web頁面配置該節(jié)點的上一級路由節(jié)點的ip地址。
c)uid網(wǎng)關(guān)與上一級網(wǎng)關(guān)進行連接。如果上級網(wǎng)關(guān)標識為uid0,并直連到智能家居服務(wù)平臺,將獲得上級網(wǎng)關(guān)的路由規(guī)則“/uid0/#”,更新本地路由表中上級網(wǎng)關(guān)的路由規(guī)則為“/uid0/#”,當(dāng)前自身的路由規(guī)則為“/uid0/uid/#”。
d)上一級網(wǎng)關(guān)接收到uid網(wǎng)關(guān)連接后,在自身的下級網(wǎng)關(guān)路由規(guī)則中添加一條“/uid/#”。
e)uid網(wǎng)關(guān)啟動設(shè)備發(fā)現(xiàn)程序、將搜索到且信息匹配的家電設(shè)備的sid與自身的uid,以uid/sid的格式作為家電設(shè)備的全局唯一標識,同時網(wǎng)關(guān)在自身的設(shè)備列表中記錄“sid”和路由規(guī)則。
f)uid網(wǎng)關(guān)將usid上報給上級網(wǎng)關(guān)uid0,上級網(wǎng)關(guān)在自身的設(shè)備列表中記錄“uid/sid”和路由規(guī)則“/uid”。
g)每一級網(wǎng)關(guān)遞歸執(zhí)行上一步操作,直到usid上報到智能家居服務(wù)平臺為止。
這里上級網(wǎng)關(guān)uid0由于直連服務(wù)平臺,則將usid上報到智能家居服務(wù)平臺。
步驟2:用戶控制設(shè)備,數(shù)據(jù)路由下行,具體流程如圖3所示。
a)用戶使用mqtt控制端連上任一網(wǎng)關(guān),比如連上標識為uid0網(wǎng)關(guān)。
b)用戶發(fā)送控制消息控制某一設(shè)備,比如發(fā)送主題為“/control/sid”控制標識為sid的設(shè)備。
c)uid0網(wǎng)關(guān)使用最后“/”后綴提取出消息中被控對象為sid
d)uid0網(wǎng)關(guān)查找本地設(shè)備列表,存在sid,路由規(guī)則為“/uid”
e)uid0網(wǎng)關(guān)發(fā)布接收到的控制消息,主題為“/uid/control/sid”
f)下一級網(wǎng)關(guān)uid由于訂閱了主題“/uid/#”,于是接收到主題為“/uid/control/sid”的控制消息,同樣提取出消息被控對象sid,查找本地設(shè)備列表存在“uid/sid”,由后綴匹配可知存在sid,路由規(guī)則為“/uid/uart0”,于是轉(zhuǎn)發(fā)該消息到本地串口uart0
g)sid家電接收到來自串口uart0的控制消息。
步驟3:設(shè)備信息反饋給所有用戶,數(shù)據(jù)路由上行,具體流程如圖4所示。
a)任意一個網(wǎng)關(guān)接收到來自家電設(shè)備的消息時,查詢本地的移動控制端列表,獲取直連到該網(wǎng)關(guān)的所有mqtt控制端,接著將消息轉(zhuǎn)發(fā)給每一個直連的mqtt控制端。
比如sid設(shè)備狀態(tài)改變,生成設(shè)備狀態(tài)消息,通過uart0發(fā)送給uid網(wǎng)關(guān),uid網(wǎng)關(guān)先查詢本地移動控制列表獲取mqtt控制端列表,逐一發(fā)送狀態(tài)消息給直連到自身的所有mqtt控制端。
b)上級網(wǎng)關(guān)接收到上行消息除了發(fā)送給自己上級,還要發(fā)送給除了上報該消息的網(wǎng)關(guān)之外的其他下級網(wǎng)關(guān);下級網(wǎng)關(guān)接收到上行消息時只下發(fā)給下級,每一個網(wǎng)關(guān)都會將消息轉(zhuǎn)發(fā)給所有直連的mqtt控制端,確保智能家居系統(tǒng)中所有mqtt控制端的信息同步。
比如uid網(wǎng)關(guān)將狀態(tài)消息發(fā)送給上級網(wǎng)關(guān)uid0,上級網(wǎng)關(guān)uid0接收到后將查詢上級路由規(guī)則,由于沒有上級了就發(fā)送給智能家居服務(wù)平臺,否則發(fā)送給上級網(wǎng)關(guān);接著網(wǎng)關(guān)uid0查詢除了上報的網(wǎng)關(guān)uid之外其他下級網(wǎng)關(guān),由于沒有則停止,否則發(fā)送給下級網(wǎng)關(guān)。
同時uid0網(wǎng)關(guān)查詢本地的移動控制端列表,將消息轉(zhuǎn)發(fā)給每一個直連的mqtt控制端。
步驟4:設(shè)備信息反饋給特定某個用戶,路由數(shù)據(jù)上行
a)任意一個網(wǎng)關(guān)接收到來自家電設(shè)備的消息時,查詢本地的移動控制端列表,判斷是否包含目的mqtt控制端,若存在則發(fā)送到該目的mqtt控制端并停止,若不存在則發(fā)送到上級網(wǎng)關(guān)。
比如sid設(shè)備狀態(tài)改變,生成設(shè)備狀態(tài)消息,并且只想通知標識為uuid(universallyuniqueidentifier,通用唯一識別碼)的mqtt控制端,則在狀態(tài)消息中包含uuid,并通過串口uart0發(fā)送給uid網(wǎng)關(guān)。uid網(wǎng)關(guān)接收到消息后,提取出目的mqtt控制端uuid,并查詢本地的移動控制端列表是否存在uuid,若存在則發(fā)送并停止,若不存在則查詢上級網(wǎng)關(guān)路由規(guī)則,并發(fā)送給上級網(wǎng)關(guān)uid0。
b)上級網(wǎng)關(guān)接收到消息,重復(fù)執(zhí)行上一步直到發(fā)送到目的mqtt控制端或者服務(wù)平臺。
上級網(wǎng)關(guān)uid0收到消息先解析出目的mqtt控制端,再查詢本地移動控制列表判斷其是否存在,若存在則發(fā)送給該mqtt控制端并停止,若不存在,則通知它的上一級網(wǎng)關(guān),由于uid0沒有上級網(wǎng)關(guān),所以發(fā)送給服務(wù)平臺并停止。
上述步驟為本發(fā)明較佳的具體實施方式,但本發(fā)明的保護范圍并不局限于此,任何熟悉本技術(shù)領(lǐng)域的技術(shù)人員在本發(fā)明揭露的技術(shù)范圍內(nèi),可輕易想到的變化或替換,都應(yīng)涵蓋在本發(fā)明的保護范圍之內(nèi)。因此,本發(fā)明的保護范圍應(yīng)該以權(quán)利要求的保護范圍為準。