董 哲,邵曉琳
(北方工業(yè)大學(xué) 電氣與控制工程學(xué)院,北京 100144)
ZigBee技術(shù),在消費(fèi)性電子設(shè)備、工業(yè)控制、汽車及智能交通、農(nóng)業(yè)自動化、醫(yī)療輔助控制等方面具有廣闊的應(yīng)用前景。TI的CC2530芯片具備了實(shí)現(xiàn)Zig-Bee技術(shù)的各種底層硬件需求,是真正的一體化解決方案,完全符合ZigBee技術(shù)對節(jié)點(diǎn)“體積小”的要求。TI提供的ZStack協(xié)議棧,使ZigBee節(jié)點(diǎn)的軟件開發(fā)轉(zhuǎn)為應(yīng)用程序的開發(fā),盡可能地減輕了軟件開發(fā)的工作量。
從系統(tǒng)的角度來看,智能化的家居體驗(yàn)必然要求節(jié)點(diǎn)之間的互通互聯(lián),一個(gè)典型的ZigBee智能家居系統(tǒng)中節(jié)點(diǎn)繁多,功能各異,如果每個(gè)節(jié)點(diǎn)單獨(dú)開發(fā),則對系統(tǒng)的開發(fā)維護(hù)帶來諸多不便,對此本文創(chuàng)新性地給出了智能家居系統(tǒng)中通用節(jié)點(diǎn)的軟硬件設(shè)計(jì)方案,該方案降低了系統(tǒng)的開發(fā)和維護(hù)難度,并具有一定的通用性和可擴(kuò)展性。
智能家居設(shè)備可分為三類,一類是傳感器節(jié)點(diǎn),通過不同功能的傳感器檢測家居中的各種狀態(tài),如溫濕度、光照度等,該類節(jié)點(diǎn)由傳感變送單元、主控單元、通信單元組成。第二類是執(zhí)行器節(jié)點(diǎn),通過繼電器、紅外遙控等方式實(shí)現(xiàn)對家電的控制,該類節(jié)點(diǎn)由執(zhí)行單元、主控單元、通信單元組成。第三類是網(wǎng)關(guān)控制器,實(shí)現(xiàn)網(wǎng)絡(luò)的建立與維護(hù)、數(shù)據(jù)轉(zhuǎn)發(fā)、節(jié)點(diǎn)控制等功能,該類節(jié)點(diǎn)由主控單元、通信單元組成。本文設(shè)計(jì)的通用型節(jié)點(diǎn)實(shí)現(xiàn)了主控單元、通信單元的基本功能,在通用單元的基礎(chǔ)上只需擴(kuò)展傳感器、執(zhí)行器等即可實(shí)現(xiàn)智能家居中各專用設(shè)備硬件。同時(shí)本文開發(fā)了基于Z-stack的智能家居通用軟件,分為協(xié)調(diào)器和終端兩個(gè)版本,前者適用于網(wǎng)關(guān)控制器類設(shè)備,后者適用于傳感器、執(zhí)行器類設(shè)備,智能家居中所需的各種專用設(shè)備無需進(jìn)行單獨(dú)的軟件開發(fā),只需定義設(shè)備類型即可實(shí)現(xiàn)。
如圖1所示,智能家居系統(tǒng)中的ZigBee網(wǎng)絡(luò)主要由ZigBee協(xié)調(diào)器和ZigBee終端設(shè)備組成。ZigBee協(xié)調(diào)器負(fù)責(zé)建立和維護(hù)ZigBee網(wǎng)絡(luò),可通過串口連接上位機(jī)或家庭網(wǎng)關(guān)來實(shí)現(xiàn)對家居系統(tǒng)的監(jiān)測和控制;相同的ZigBee終端設(shè)備通過連接不同的傳感器和家居設(shè)備而構(gòu)成不同的應(yīng)用節(jié)點(diǎn)。
圖1 基于ZigBee的智能家居系統(tǒng)
如圖2所示,深色陰影部分為系統(tǒng)輸入,淺色陰影部分為系統(tǒng)輸出,ZigBee協(xié)調(diào)器為系統(tǒng)的控制中心,將綜合傳感器采集的環(huán)境信息以及串口接收的控制信息用來控制每個(gè)家居設(shè)備的運(yùn)行,同時(shí)將環(huán)境信息,以及家居設(shè)備運(yùn)行狀態(tài)發(fā)送到串口以供控制終端顯示。本系統(tǒng)具有自動控制、直接控制、連鎖控制、場景控制四種相互耦合的控制功能,此外系統(tǒng)還具有動作反饋的功能,不論設(shè)備以何種方式被控制,其動作變化都會在控制終端得到體現(xiàn)。
圖2 系統(tǒng)功能模型
(1)自動控制
協(xié)調(diào)器根據(jù)傳感設(shè)備采集的數(shù)據(jù)自動對某些家居設(shè)備進(jìn)行控制,如當(dāng)室外光照度較低時(shí)關(guān)閉窗簾。
(2)直接控制
用戶可根據(jù)自己的需要,直接在控制終端操作某一設(shè)備,如打開客廳的電視。
(3)連鎖控制
當(dāng)用戶的某一項(xiàng)活動需要控制多個(gè)設(shè)備時(shí),可實(shí)現(xiàn)只控制一個(gè)設(shè)備來實(shí)現(xiàn)連鎖控制,如當(dāng)用戶打開燃?xì)忾_關(guān)后油煙機(jī)自動打開。
(4)模式控制
用戶可以在控制終端選擇不同的模式,家居設(shè)備的不同子集會在特定的模式中有不同的響應(yīng)方式。如當(dāng)設(shè)置睡眠模式時(shí),一些安防功能會自動啟用,照明系統(tǒng)會自動切換至弱光檔以減少對眼睛的刺激。
每個(gè)ZigBee設(shè)備有一個(gè)全球唯一的64位IEEE長地址,但在ZigBee網(wǎng)絡(luò)中通常用16位的短地址來標(biāo)識自身和識別對方,也稱作網(wǎng)絡(luò)地址。對于協(xié)調(diào)器來說,短地址為0000H,對于路由節(jié)點(diǎn)和終端節(jié)點(diǎn)來說,短地址是它們在加入到網(wǎng)絡(luò)中時(shí)由協(xié)調(diào)器動態(tài)分配的,與網(wǎng)絡(luò)深度、最大路由數(shù)、最大節(jié)點(diǎn)數(shù)等參數(shù)的設(shè)置有關(guān),還與節(jié)點(diǎn)入網(wǎng)順序有關(guān),直接通信關(guān)鍵點(diǎn)在于目標(biāo)節(jié)點(diǎn)網(wǎng)絡(luò)短地址的獲得。
ZStack協(xié)議棧中定義的應(yīng)用層無線數(shù)據(jù)發(fā)送函數(shù)為AF_DataRequest,函數(shù)原型如下:
其中dstAddr為地址類型結(jié)構(gòu)體變量,包含目標(biāo)節(jié)點(diǎn)地址類型和網(wǎng)絡(luò)地址等參數(shù);cID為命令號,在ZStack協(xié)議棧里主要用來區(qū)別不同命令以控制不同的操作;len為發(fā)送數(shù)據(jù)的長度;*buf為指向發(fā)送數(shù)據(jù)緩沖區(qū)的指針。
ZigBee設(shè)備收到無線數(shù)據(jù)后,會在應(yīng)用層觸發(fā)AF_INCOMING_M(jìn)SG_CMD事件,可在結(jié)構(gòu)體afIncomingMSGPacket_t中解析出所接收的數(shù)據(jù)及其源地址、命令號等相關(guān)的參數(shù)。
智能家居系統(tǒng)中的ZigBee網(wǎng)絡(luò)是以應(yīng)用為中心的網(wǎng)絡(luò),用戶只關(guān)注各個(gè)ZigBee終端的應(yīng)用功能,而不關(guān)心每個(gè)節(jié)點(diǎn)的網(wǎng)絡(luò)地址,因此需要在終端的功能和它的網(wǎng)絡(luò)地址之間建立映射關(guān)系,系統(tǒng)才能正確地通信。
用撥碼開關(guān)為每個(gè)終端分配一個(gè)唯一的ID以區(qū)分其功能,以8位撥碼開關(guān)為例,如表1所示,4位區(qū)分區(qū)域,4位區(qū)分應(yīng)用,這樣每個(gè)無線應(yīng)用都有一個(gè)區(qū)域號和應(yīng)用號組成的1個(gè)字節(jié)的ID號,系統(tǒng)最多可容納256個(gè)獨(dú)立的應(yīng)用,足夠覆蓋家居生活的方方面面。
表1 終端應(yīng)用ID
協(xié)調(diào)器建立網(wǎng)絡(luò)成功后,終端節(jié)點(diǎn)會自動加入網(wǎng)絡(luò),終端入網(wǎng)成功后會在應(yīng)用層觸發(fā)ZDO_STATE_CHANGE事件,因此可以利用此事件來實(shí)現(xiàn)應(yīng)用層網(wǎng)絡(luò)的建立。首先終端在應(yīng)用層任務(wù)初始化時(shí)讀取撥碼開關(guān)狀態(tài),得到其ID號fID,當(dāng)終端的ZDO_STATE_CHANGE事件被觸發(fā),即終端成功加入網(wǎng)絡(luò)時(shí),將自己的ID號fID發(fā)送給協(xié)調(diào)器作為應(yīng)用層入網(wǎng)請求。協(xié)調(diào)器端定義一個(gè)記錄終端節(jié)點(diǎn)網(wǎng)絡(luò)地址的數(shù)組uint16 Saddr[256],當(dāng)協(xié)調(diào)器收到終端應(yīng)用層入網(wǎng)請求后將無線數(shù)據(jù)的源地址賦給數(shù)組Saddr以fID為下標(biāo)的元素:
這樣就在協(xié)調(diào)器端建立了與節(jié)點(diǎn)應(yīng)用功能對應(yīng)的網(wǎng)絡(luò)地址映射表,當(dāng)需要控制某個(gè)設(shè)備時(shí)將Saddr中以被控設(shè)備為ID號fID為下標(biāo)的元素賦值給協(xié)調(diào)器的目標(biāo)地址:
就可以將數(shù)據(jù)或命令發(fā)送到對應(yīng)的設(shè)備。
(1)網(wǎng)絡(luò)通信
如圖3所示,系統(tǒng)的網(wǎng)絡(luò)通信主要由灰色矩形框內(nèi)的7種情況發(fā)起,下面將分類對各種數(shù)據(jù)幀進(jìn)行定義和解釋。
圖3 系統(tǒng)網(wǎng)絡(luò)通信示意圖
a.串口通信幀結(jié)構(gòu)
協(xié)調(diào)器串口通信幀由起始碼、功能碼、數(shù)據(jù)碼三部分構(gòu)成,其中起始碼1字節(jié),值為0xFF,表示幀頭;功能碼1字節(jié),由0x00遞增,表示此幀的功能,數(shù)據(jù)碼長度和內(nèi)容由功能碼決定。
如表2,協(xié)調(diào)器的串口接收3種類型的幀,開機(jī)請求幀用于上位機(jī)程序打開時(shí)獲取當(dāng)前系統(tǒng)的信息;場景設(shè)置幀用于設(shè)置模式,如進(jìn)入睡眠模式,退出睡眠模式;節(jié)點(diǎn)控制幀用于直接控制,如用戶打開客廳的電視機(jī)。
表2 協(xié)調(diào)器串口接收數(shù)據(jù)幀
如表3,協(xié)調(diào)器的串口發(fā)送3種類型的幀,數(shù)據(jù)回復(fù)幀用于回復(fù)上位機(jī)的開機(jī)請求幀;設(shè)備入網(wǎng)幀用于告知上位機(jī)新加入ZigBee網(wǎng)絡(luò)的家居設(shè)備;設(shè)備數(shù)據(jù)幀用于向上位機(jī)反饋每個(gè)設(shè)備的參數(shù)和狀態(tài)信息,如溫度傳感器采集的溫度值,電視機(jī)的開關(guān)狀態(tài)。
表3 協(xié)調(diào)器串口發(fā)送數(shù)據(jù)幀
b.無線通信幀結(jié)構(gòu)
無線通信幀是指協(xié)調(diào)器和終端節(jié)點(diǎn)通信的無線數(shù)據(jù)幀,在此用協(xié)議棧中無線數(shù)據(jù)收發(fā)的一個(gè)參數(shù)cID(命令號)來區(qū)分幀的功能和類型,用無線收發(fā)的數(shù)據(jù)緩沖區(qū)buf來存放數(shù)據(jù),數(shù)據(jù)長度及內(nèi)容由命令號cID決定。
如表4,以cID的高字節(jié)作為功能碼來區(qū)分無線數(shù)據(jù)幀的類型,低字節(jié)存放節(jié)點(diǎn)fID來識別應(yīng)用。協(xié)調(diào)器接收2種類型的幀,入網(wǎng)幀為終端節(jié)點(diǎn)的應(yīng)用層入網(wǎng)請求;參數(shù)幀為終端節(jié)點(diǎn)的參數(shù)和狀態(tài)信息。
表4 協(xié)調(diào)器無線接收數(shù)據(jù)幀
如表5,協(xié)調(diào)器發(fā)送5種類型的幀,以cID高字節(jié)的高4位表示幀類型,入網(wǎng)回復(fù)幀用來回復(fù)新入網(wǎng)的節(jié)點(diǎn)系統(tǒng)當(dāng)前的模式;節(jié)點(diǎn)控制幀用于控制節(jié)點(diǎn)的行為動作;模式設(shè)置幀和連鎖控制幀用來進(jìn)行模式設(shè)置和連鎖控制,并對cID的低12位進(jìn)行如下的定義,高字節(jié)的低4位為控制方向(1為進(jìn)入,0為退出),低字節(jié)為控制號,表示當(dāng)前控制類型下的控制號。如0x0105為進(jìn)入第5種模式,0x0005為退出第5種模式;0x1103為進(jìn)入第一種連鎖,0x1003為退出第3種連鎖。
表5 協(xié)調(diào)器無線發(fā)送數(shù)據(jù)幀
(2)系統(tǒng)控制
在協(xié)調(diào)器和終端都定義一個(gè)函數(shù)指針數(shù)組
task00至taskFF為表1中每個(gè)對應(yīng)設(shè)備的應(yīng)用處理函數(shù),在協(xié)調(diào)器端表現(xiàn)為接收到對應(yīng)設(shè)備數(shù)據(jù)后的相關(guān)處理。
將終端設(shè)備分為控制型設(shè)備和輸入型設(shè)備,對于控制型終端設(shè)備M,其功能執(zhí)行函數(shù)taskM為收到協(xié)調(diào)器的控制信息后的操作。以16種模式為例,在終端節(jié)點(diǎn)程序中定義uint16的全局變量fmode(每一位表示一種模式,1表示模式被設(shè)置,0表示模式被清除),當(dāng)終端節(jié)點(diǎn)收到協(xié)調(diào)器發(fā)來的無線數(shù)據(jù)時(shí),如果是模式設(shè)置幀則按照控制方向和控制號更新fmode中相應(yīng)的模式位,然后調(diào)用process_task[fID]((pkt->clustered)>>12,(pkt->clustered)&0x00FF)來進(jìn)行相應(yīng)的操作。
在taskM中定義一個(gè)uint16的常量modeM,每一位表示一種模式,modeM含義為當(dāng)此變量中為1的位所對應(yīng)的模式至少有一種被設(shè)置時(shí)此設(shè)備打開,否則此設(shè)備關(guān)閉。當(dāng)收到模式設(shè)置幀時(shí),進(jìn)行判斷if(modeM&fmode),成立時(shí)打開設(shè)備,否則關(guān)閉設(shè)備,連鎖控制用相同的方法實(shí)現(xiàn);如果是入網(wǎng)回復(fù)幀,則記錄下系統(tǒng)當(dāng)前的模式值fmode;如果是節(jié)點(diǎn)控制幀則直接調(diào)用process_task[fID]((pkt->clustered)>>12,(pkt->clustered)&0x0FFF)進(jìn)行相應(yīng)的控制。
輸入型設(shè)備N又可分為開關(guān)量輸入和數(shù)據(jù)輸入。以煙霧傳感器為例,其輸入到終端的信號為高或低電平表示是否有火警信號,此類輸入為開關(guān)量輸入,用外部中斷來讀取,在協(xié)議棧的中斷處理函數(shù)HAL_ISR_FUNCTION中利用osal_set_event()函數(shù)來觸發(fā)應(yīng)用層的事件。以溫濕度傳感器為例,其輸入到終端的信號為溫濕度數(shù)據(jù),需要控制器定期讀取傳感參數(shù),此類輸入為數(shù)據(jù)輸入,用定時(shí)器中斷來讀取,在協(xié)議棧中利用osal_start_timerEx();當(dāng)外部中斷產(chǎn)生或定時(shí)時(shí)間到都會在應(yīng)用層觸發(fā)相應(yīng)的自定義事件。所以在應(yīng)用層的任務(wù)處理函數(shù)中去查詢事件進(jìn)行響應(yīng):
為避免和控制型設(shè)備M的控制類型(0~3)重合而導(dǎo)致的程序混亂,輸入型設(shè)備N的功能執(zhí)行函數(shù)taskN中的控制類型由4開始遞增。
用通用節(jié)點(diǎn)連接不同的傳感器和控制設(shè)備搭建的智能家居演示系統(tǒng)如圖4所示,系統(tǒng)配套的Android APP通過連接網(wǎng)關(guān)可實(shí)現(xiàn)監(jiān)控ZigBee智能家居網(wǎng)絡(luò)的功能,Android APP界面如圖5所示。
圖4 智能家居演示系統(tǒng)實(shí)物圖
圖5 智能家居系統(tǒng)Android APP監(jiān)控界面
本文介紹的基于ZigBee的智能家居通用節(jié)點(diǎn)的設(shè)計(jì)方案降低了智能家居系統(tǒng)開發(fā)和維護(hù)成本,滿足了智能化的家居系統(tǒng)控制要求,可以快速地實(shí)現(xiàn)設(shè)計(jì)方案到可執(zhí)行代碼的轉(zhuǎn)化。同時(shí)該方法具有一定的通用性,也適用于基于ZigBee的智能大棚監(jiān)管系統(tǒng)等類似系統(tǒng)的開發(fā)。
[1] 高守緯,吳燦陽.ZigBee技術(shù)實(shí)踐教程:基于CC2430/31的無線傳感器網(wǎng)絡(luò)解決方案[M].北京:北京航空航天大學(xué)出版社,2009.
[2] 王小強(qiáng),歐陽俊,黃寧淋.ZigBee無線傳感器網(wǎng)絡(luò)設(shè)計(jì)與實(shí)現(xiàn)[M].北京:化學(xué)工業(yè)出版社,2012.
[3] 周 游,方 濱,王 普.基于ZigBee技術(shù)的智能家居無線網(wǎng)絡(luò)系統(tǒng)[J].電子技術(shù)應(yīng)用,2005,31(9):37-40.