文獻(xiàn)標(biāo)識(shí)碼: B
文章編號(hào): 0258-7998(2012)10-0122-04
隨著計(jì)算機(jī)技術(shù)和無(wú)線通信技術(shù)的快速發(fā)展,各種智能化產(chǎn)品不斷涌現(xiàn),其中無(wú)線傳感器網(wǎng)絡(luò)WSN(Wireless Sensor Networks)[1]具有無(wú)線通信、感知、協(xié)作等特點(diǎn),并很快融入到生活的方方面面。在大型超市、高檔小區(qū)、辦公樓里常常需要適時(shí)監(jiān)測(cè)區(qū)域環(huán)境內(nèi)的溫度、濕度及有毒氣體的濃度,以保障生命財(cái)產(chǎn)安全。傳統(tǒng)的環(huán)境監(jiān)測(cè)系統(tǒng)布線煩瑣,消耗人力。ZigBee技術(shù)作為一種新興的短距離無(wú)線傳感器網(wǎng)絡(luò)通信標(biāo)準(zhǔn),具有低功耗、低延遲、自組織等優(yōu)點(diǎn)[2],因而廣泛應(yīng)用到生產(chǎn)、生活領(lǐng)域,市場(chǎng)前景非常廣闊。
ZigBee標(biāo)準(zhǔn)基于IEEE 802.15.4低速率無(wú)線個(gè)人局域網(wǎng),支持介質(zhì)訪問(wèn)控制層和物理層標(biāo)準(zhǔn),并在此之上包含網(wǎng)絡(luò)層、安全層和應(yīng)用層,具備很強(qiáng)的設(shè)備聯(lián)網(wǎng)能力,它支持網(wǎng)狀結(jié)構(gòu)、星狀結(jié)構(gòu)及樹狀結(jié)構(gòu)三種自組織無(wú)線網(wǎng)絡(luò)拓?fù)漕愋徒Y(jié)構(gòu)[3]。本文基于ARM9控制平臺(tái)實(shí)現(xiàn)了傳感器網(wǎng)絡(luò)信息的實(shí)時(shí)顯示和ZigBee節(jié)點(diǎn)設(shè)備的控制。該無(wú)線傳感器網(wǎng)絡(luò)室內(nèi)環(huán)境遠(yuǎn)程監(jiān)控平臺(tái),以ZigBee芯片CC2530作為傳感器節(jié)點(diǎn)控制和無(wú)線通信芯片,實(shí)現(xiàn)溫度、濕度和氣壓等環(huán)境信息的感知。
1 系統(tǒng)方案設(shè)計(jì)
控制平臺(tái)基于WSN技術(shù)和嵌入式技術(shù),借鑒了國(guó)內(nèi)外優(yōu)秀環(huán)境監(jiān)測(cè)研究經(jīng)驗(yàn),設(shè)計(jì)了基于CC2530芯片采集傳感器數(shù)據(jù)的ZigBee無(wú)線網(wǎng)絡(luò)和基于ARM9的網(wǎng)絡(luò)控制臺(tái)。
1.1 系統(tǒng)總體功能介紹
本系統(tǒng)實(shí)現(xiàn)圖形化網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)的動(dòng)態(tài)構(gòu)建和管理,以及圖形化控制ZigBee節(jié)點(diǎn)設(shè)備;支持多跳網(wǎng)絡(luò);支持外界環(huán)境狀態(tài)信息感知,傳感器數(shù)據(jù)精確采集、無(wú)線傳輸和顯示,當(dāng)環(huán)境信息超過(guò)臨界值時(shí)報(bào)警等功能。
1.2 系統(tǒng)框架設(shè)計(jì)
系統(tǒng)由ARM控制臺(tái)模塊、基于ZigBee的無(wú)線傳感器網(wǎng)絡(luò)通信模塊及網(wǎng)關(guān)模塊三個(gè)主體部分構(gòu)成,系統(tǒng)框架結(jié)構(gòu)如圖1所示。
控制臺(tái)模塊采用ARM9芯片作為處理器,基于Linux操作系統(tǒng),搭配自制底板作為控制臺(tái)軟件運(yùn)行環(huán)境,采用QT-4.5.3作為應(yīng)用程序開發(fā)框架進(jìn)行控制臺(tái)軟件開發(fā)。
無(wú)線傳感器網(wǎng)絡(luò)通信模塊采用基于IEEE 802.15.4標(biāo)準(zhǔn)的ZStack-CC2530協(xié)議棧開發(fā),完成ZigBee網(wǎng)絡(luò)建立、維護(hù)以及傳感器數(shù)據(jù)采集、節(jié)點(diǎn)控制等功能。傳感器節(jié)點(diǎn)由ZigBee節(jié)點(diǎn)融合傳感器構(gòu)成。
(1) ZigBee節(jié)點(diǎn)。包括協(xié)調(diào)器節(jié)點(diǎn),路由器節(jié)點(diǎn)和終端節(jié)點(diǎn),采用ZigBee芯片CC2530自主設(shè)計(jì)和繪制電路圖以及外圍硬件電路。CC2530是一款SoC芯片,集成了處理器、無(wú)線電和串口等外設(shè)。
(2) 傳感器。包括溫濕度傳感器,振動(dòng)傳感器及壓力傳感器等,用于對(duì)環(huán)境狀態(tài)信息的動(dòng)態(tài)感知。
網(wǎng)關(guān)模塊采用集成于ARM平臺(tái)的串行口,通過(guò)UART方式連接ZigBee協(xié)調(diào)器與控制臺(tái),根據(jù)預(yù)定的幀進(jìn)行通信。上行和下行的數(shù)據(jù)都通過(guò)網(wǎng)關(guān)在網(wǎng)絡(luò)上傳輸,由其負(fù)責(zé)數(shù)據(jù)包的解析和轉(zhuǎn)發(fā)。
1.3 系統(tǒng)通信協(xié)議及數(shù)據(jù)格式設(shè)計(jì)
本系統(tǒng)在控制臺(tái)與ZigBee協(xié)調(diào)器之間,使用UART傳輸數(shù)據(jù);在ZigBee網(wǎng)絡(luò)節(jié)點(diǎn)之間都按照Z(yǔ)igBee協(xié)議實(shí)現(xiàn)通信??刂婆_(tái)、網(wǎng)關(guān)、ZigBee網(wǎng)絡(luò)之間按照約定的數(shù)據(jù)幀格式進(jìn)行數(shù)據(jù)包傳遞,幀結(jié)構(gòu)由幀頭、數(shù)據(jù)負(fù)載、幀尾三部分組成,如圖2所示。
(1) 1 B的幀頭0XFB和1 B的幀尾0XFE。
(2) 1 B的幀長(zhǎng)度和1 B的幀負(fù)載屬性。
(3) 多個(gè)字節(jié)的業(yè)務(wù)負(fù)載數(shù)據(jù),ZigBee網(wǎng)絡(luò)中的數(shù)據(jù)業(yè)務(wù)主要有節(jié)點(diǎn)設(shè)備描述符、節(jié)點(diǎn)設(shè)備數(shù)據(jù)、狀態(tài)和控制業(yè)務(wù)。
節(jié)點(diǎn)設(shè)備描述符用于描述當(dāng)前ZigBee節(jié)點(diǎn)的短地址、長(zhǎng)地址,以及節(jié)點(diǎn)所掛載的傳感器類型和數(shù)目;節(jié)點(diǎn)設(shè)備數(shù)據(jù)為傳感器實(shí)時(shí)采集的環(huán)境數(shù)據(jù);狀態(tài)和控制業(yè)務(wù)為用戶發(fā)出指令。
2 無(wú)線傳感器網(wǎng)絡(luò)程序設(shè)計(jì)
無(wú)線傳感器網(wǎng)絡(luò)基于ZStack-CC2530-2.2.0-1.3.0開發(fā),實(shí)現(xiàn)了ZigBee網(wǎng)絡(luò)的構(gòu)建,內(nèi)部使用小型操作系統(tǒng)OSAL[3],實(shí)現(xiàn)任務(wù)和消息的管理。數(shù)據(jù)采集和傳輸由自定義傳感器數(shù)據(jù)采集任務(wù)在應(yīng)用層登記串口消息后,交由OSAL管理完成。
2.1 傳感器數(shù)據(jù)采集與傳輸程序設(shè)計(jì)
本文所述的網(wǎng)絡(luò)是由協(xié)調(diào)器、路由器和終端節(jié)點(diǎn)構(gòu)成的樹狀網(wǎng)絡(luò)。協(xié)調(diào)器節(jié)點(diǎn)建立網(wǎng)絡(luò),其他節(jié)點(diǎn)則主動(dòng)尋找連接協(xié)調(diào)器的最小代價(jià)路由[3]。所有節(jié)點(diǎn)上電之初將發(fā)送節(jié)點(diǎn)的設(shè)備描述符,并周期上傳節(jié)點(diǎn)在線狀態(tài)信息。終端節(jié)點(diǎn)采集傳感器數(shù)據(jù)經(jīng)路由器轉(zhuǎn)發(fā)至協(xié)調(diào)器。
2.2 串口數(shù)據(jù)傳輸程序設(shè)計(jì)
串口作為命令和數(shù)據(jù)傳輸接口,協(xié)議棧默認(rèn)登記在MT層[4],本系統(tǒng)將串口消息登記到應(yīng)用層,并在應(yīng)用層完成處理。初始化串口并注冊(cè)好回調(diào)函數(shù)后,當(dāng)串口接收緩沖非空時(shí),就會(huì)觸發(fā)系統(tǒng)消息事件?;卣{(diào)函數(shù)首先檢測(cè)串口命令的起始標(biāo)識(shí),獲得起始標(biāo)識(shí)后,按照系統(tǒng)定義的串口命令格式讀取緩沖區(qū),同時(shí)填充到預(yù)先分配的結(jié)構(gòu)內(nèi)存區(qū)間。結(jié)束標(biāo)識(shí)用于校驗(yàn)該串口命令是否發(fā)生誤操作、誤傳輸。若傳輸正確,則將串口命令按照定義的消息格式登記到應(yīng)用層處理。
3 控制臺(tái)軟件程序設(shè)計(jì)
控制臺(tái)主要由網(wǎng)關(guān)通信功能塊、網(wǎng)絡(luò)拓?fù)淇刂婆c顯示功能塊,設(shè)備控制與顯示功能塊構(gòu)成,實(shí)現(xiàn)人機(jī)交互,實(shí)現(xiàn)對(duì)設(shè)備的控制和對(duì)數(shù)據(jù)的處理、顯示。
3.1 控制臺(tái)總體結(jié)構(gòu)介紹
控制臺(tái)有4個(gè)功能界面,分別為網(wǎng)絡(luò)拓?fù)渲鹘缑?、設(shè)備列表界面、全局控制界面及設(shè)備控制界面。各界面之間彼此聯(lián)系、共享數(shù)據(jù),總體框架如圖3所示。
3.2 控制臺(tái)功能設(shè)計(jì)
控制臺(tái)實(shí)現(xiàn)兩方面的功能:(1)處理來(lái)自網(wǎng)關(guān)模塊的數(shù)據(jù),根據(jù)節(jié)點(diǎn)描述符完成ZigBee網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)動(dòng)態(tài)構(gòu)建和節(jié)點(diǎn)狀態(tài)信息動(dòng)態(tài)直觀展示,并根據(jù)傳感器數(shù)據(jù)動(dòng)態(tài)顯示相應(yīng)信息。(2)接收用戶指令,發(fā)送相應(yīng)的控制數(shù)據(jù)包給網(wǎng)關(guān)模塊,并轉(zhuǎn)發(fā)至ZigBee協(xié)調(diào)器,完成對(duì)設(shè)備的精確控制,如打開、關(guān)閉設(shè)備,控制采集頻率等。
圖3中網(wǎng)絡(luò)拓?fù)渲鹘缑嬗糜赯igBee網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)動(dòng)態(tài)構(gòu)建和節(jié)點(diǎn)狀態(tài)信息動(dòng)態(tài)展示;設(shè)備列表界面展示每個(gè)ZigBee節(jié)點(diǎn)上傳感器硬件信息;全局控制界面針對(duì)特定ZigBee節(jié)點(diǎn)進(jìn)行整體控制;設(shè)備控制界面區(qū)別于全局控制界面,用來(lái)控制ZigBee節(jié)點(diǎn)上指定標(biāo)簽的傳感器設(shè)備。
3.3 通信網(wǎng)關(guān)程序設(shè)計(jì)
網(wǎng)絡(luò)通信接口作為網(wǎng)關(guān),負(fù)責(zé)ZigBee網(wǎng)絡(luò)協(xié)調(diào)器與控制臺(tái)軟件之間數(shù)據(jù)包的解包與封包,并按照數(shù)據(jù)幀結(jié)構(gòu)進(jìn)行通信。通過(guò)串口連接實(shí)現(xiàn)數(shù)據(jù)接收和發(fā)送。
通信網(wǎng)關(guān)結(jié)構(gòu)如圖4所示,網(wǎng)關(guān)不僅負(fù)責(zé)將上位機(jī)接收到的用戶下行命令封包,并遞送到ZigBee協(xié)調(diào)器,并轉(zhuǎn)發(fā)到相應(yīng)無(wú)線節(jié)點(diǎn),而且還負(fù)責(zé)ZigBee網(wǎng)絡(luò)上行數(shù)據(jù)包的解包,并遞送到控制臺(tái)。
由于ZigBee網(wǎng)絡(luò)數(shù)據(jù)包接收速率和控制臺(tái)處理速率之間不匹配,本系統(tǒng)采用循環(huán)隊(duì)列對(duì)數(shù)據(jù)進(jìn)行緩沖,以匹配兩端數(shù)據(jù)速率的不平衡。讀、寫循環(huán)隊(duì)列函數(shù)采用多線程實(shí)現(xiàn),線程一實(shí)現(xiàn)讀取串口數(shù)據(jù)并寫入隊(duì)列;線程二實(shí)現(xiàn)讀取循環(huán)隊(duì)列數(shù)據(jù)交由控制臺(tái)處理。線程之間利用互斥鎖和條件對(duì)臨界區(qū)進(jìn)行保護(hù),以實(shí)現(xiàn)同步。通過(guò)信號(hào)來(lái)喚醒。程序主體部分由一個(gè)主進(jìn)程負(fù)責(zé)維護(hù)兩個(gè)子線程,兩個(gè)子線程分別對(duì)循環(huán)隊(duì)列進(jìn)行讀寫操作。環(huán)形緩沖區(qū)以互斥鎖實(shí)現(xiàn)單生產(chǎn),單消費(fèi)模式,可有效節(jié)省空間,提高數(shù)據(jù)的處理速度。
在無(wú)線傳輸過(guò)程中可能發(fā)生丟包或者亂碼。產(chǎn)生丟包則網(wǎng)關(guān)讀取的數(shù)據(jù)不是完整的一幀;而出現(xiàn)亂碼則雖然收到完整的一幀數(shù)據(jù),但是其中部分字節(jié)已經(jīng)出現(xiàn)錯(cuò)誤。只有當(dāng)收到數(shù)據(jù)為完整的數(shù)據(jù)幀并且無(wú)亂碼時(shí),才能調(diào)用解析函數(shù)進(jìn)行解析。
針對(duì)傳輸中的丟包和亂碼,網(wǎng)關(guān)模塊使用了兩種數(shù)據(jù)校驗(yàn)方法:一種是幀頭、幀尾檢測(cè)法,用于驗(yàn)證完幀的完整性;另一種為增加校驗(yàn)碼法,用于檢驗(yàn)數(shù)據(jù)包是否發(fā)生丟包。
網(wǎng)關(guān)程序流程如圖5所示,圖中由主進(jìn)程產(chǎn)生兩個(gè)子線程,主進(jìn)程運(yùn)行run_module,負(fù)責(zé)初始化,包括打開串口,設(shè)置循環(huán)隊(duì)列,產(chǎn)生子線程等。由主進(jìn)程產(chǎn)生的兩個(gè)子線程分別為寫線程write_rs232和讀線程read_rs232。寫線程讀取串口的數(shù)據(jù),并將數(shù)據(jù)存儲(chǔ)到循環(huán)隊(duì)列中,讀線程從循環(huán)隊(duì)列讀取并解析數(shù)據(jù)。如果寫線程有數(shù)據(jù),將會(huì)使讀線程阻塞并等待寫線程完畢,讀線程讀取數(shù)據(jù)后也會(huì)發(fā)送信號(hào)到阻塞的寫線程,采用互斥鎖和條件變量的同步方式保護(hù)了共享數(shù)據(jù)區(qū)不被破壞,實(shí)現(xiàn)了數(shù)據(jù)同步。
3.4 網(wǎng)絡(luò)拓?fù)淇刂婆c顯示程序設(shè)計(jì)
網(wǎng)絡(luò)拓?fù)淇刂婆c顯示功能部分對(duì)來(lái)自ZigBee網(wǎng)絡(luò)的數(shù)據(jù),裁決模塊將根據(jù)最近30 s收到的傳感器節(jié)點(diǎn)信息來(lái)判定某ZigBee節(jié)點(diǎn)是否掉線,掉線或復(fù)活都將重構(gòu)網(wǎng)絡(luò)拓?fù)鋱D,并更新全局存儲(chǔ)區(qū)。
在網(wǎng)絡(luò)拓?fù)漤?yè)設(shè)置周期2 s的定時(shí)器QTimer,用于周期更新網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)。時(shí)間到,則提取共享存儲(chǔ)區(qū)中的全局變量,檢測(cè)是否存在超出30 s還未向控制臺(tái)報(bào)告存活狀態(tài)信息的節(jié)點(diǎn)。若存在,則初始化這樣的ZigBee節(jié)點(diǎn)為灰色,并失活此節(jié)點(diǎn),如果再次檢測(cè)到該節(jié)點(diǎn)上線,則恢復(fù)其缺省顏色并激活。采用另一個(gè)共享內(nèi)存區(qū)存儲(chǔ)網(wǎng)絡(luò)結(jié)構(gòu),提高網(wǎng)絡(luò)拓?fù)滹@示速度,若網(wǎng)絡(luò)拓?fù)溆凶儎?dòng),則更新此共享區(qū)。
本平臺(tái)采用的設(shè)備描述符包含64 bit長(zhǎng)地址,避免了因個(gè)別節(jié)點(diǎn)死掉后重新上線,而協(xié)調(diào)器將重新分配短地址避免導(dǎo)致網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)中出現(xiàn)一個(gè)實(shí)際節(jié)點(diǎn)對(duì)應(yīng)多個(gè)顯示節(jié)點(diǎn)的錯(cuò)誤。在構(gòu)建拓?fù)鋱D的過(guò)程中,線性掃描每個(gè)終端節(jié)點(diǎn),遞歸建立網(wǎng)絡(luò)拓?fù)洹?br/>3.5 傳感器數(shù)據(jù)顯示與設(shè)備控制程序設(shè)計(jì)
控制臺(tái)接收用戶指令,根據(jù)指令裁決器決定設(shè)備列表顯示或傳感器數(shù)據(jù)顯示。對(duì)設(shè)備控制結(jié)果由控制回饋模塊顯示,成功則表明指令已經(jīng)傳至網(wǎng)關(guān),但不能確定遠(yuǎn)程ZigBee節(jié)點(diǎn)是否收到該指令。
控制臺(tái)讀取用戶給定的指令,交由裁決器判斷用戶指令類型,若為傳感器數(shù)據(jù)顯示指令,則進(jìn)入傳感器指令顯示界面,并提取傳感器數(shù)據(jù)全局變量,以1 s為周期動(dòng)態(tài)顯示傳感器數(shù)據(jù);若為設(shè)備控制指令,則進(jìn)入設(shè)備控制界面,根據(jù)用戶指定的設(shè)備地址和編號(hào),發(fā)送控制命令至遠(yuǎn)程節(jié)點(diǎn)。
4 平臺(tái)測(cè)試與數(shù)據(jù)指標(biāo)
無(wú)線網(wǎng)絡(luò)由 1個(gè)協(xié)調(diào)器節(jié)點(diǎn)、1個(gè)路由器節(jié)點(diǎn)及7個(gè)終端節(jié)點(diǎn)構(gòu)成。終端節(jié)點(diǎn)都掛有溫/濕度傳感器,振動(dòng)傳感器及壓力傳感器。節(jié)點(diǎn)距離在10 m~20 m之間,多個(gè)終端節(jié)點(diǎn)和協(xié)調(diào)器之間有墻體阻擋, 通過(guò)路由器接入網(wǎng)絡(luò)進(jìn)行測(cè)試。
測(cè)試1:每個(gè)ZigBee節(jié)點(diǎn)加入網(wǎng)絡(luò),網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)都能正確顯示,且路由器斷電后,其子節(jié)點(diǎn)尋找最近的父節(jié)點(diǎn)并加入網(wǎng)絡(luò),重構(gòu)網(wǎng)絡(luò)拓?fù)洹?br/>
測(cè)試2:控制臺(tái)正確顯示遠(yuǎn)程ZigBee節(jié)點(diǎn)上的傳感器設(shè)備。
測(cè)試3:傳感器關(guān)閉、打開、周期采集等控制功能測(cè)試正常。
測(cè)試4:分別測(cè)試各個(gè)ZigBee節(jié)點(diǎn)不同時(shí)間的傳感器數(shù)據(jù)值,結(jié)果顯示準(zhǔn)確。
測(cè)試5:在測(cè)試1的基礎(chǔ)上,測(cè)試網(wǎng)絡(luò)丟包和數(shù)據(jù)速率。實(shí)際測(cè)試得到ZigBee無(wú)線網(wǎng)絡(luò)穩(wěn)定數(shù)據(jù)速率為20.5 kb/s,發(fā)送速率越高,則丟包率越高。
本文設(shè)計(jì)的基于CC2530的ZigBee無(wú)線傳感器網(wǎng)絡(luò)監(jiān)控平臺(tái)具有較強(qiáng)的網(wǎng)絡(luò)穩(wěn)定性,且丟包率和失誤率較小,網(wǎng)絡(luò)拓展能力較強(qiáng),可搭建不同的網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)以適應(yīng)復(fù)雜的實(shí)際環(huán)境;能實(shí)時(shí)感知環(huán)境狀態(tài)信息并交互處理,控制遠(yuǎn)程傳感器設(shè)備。將此技術(shù)用于環(huán)境監(jiān)控是一種可行的技術(shù)方案,也是未來(lái)物聯(lián)網(wǎng)發(fā)展的一個(gè)方向。
參考文獻(xiàn)
[1] 李長(zhǎng)庚,劉威鵬,胡純意,等.基于ARM和ZigBee的WSN節(jié)點(diǎn)設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)算機(jī)工程,2010,36(17):135-137.
[2] 尹慧琳,王磊,馮占軍. 無(wú)線傳感器網(wǎng)絡(luò)節(jié)點(diǎn)分布式信息融合算法研究[J].計(jì)算機(jī)工程與應(yīng)用,2007,43(17):18-20.
[3] 謝川.ZigBee中改進(jìn)的Cluster-Tree路由算法[J].計(jì)算機(jī)工程,2011,37(7):115-117.
[4] 刑偉偉,白瑞林,孟偉.ZigBee無(wú)線網(wǎng)關(guān)在MODBUS通信中的應(yīng)用[J].計(jì)算機(jī)工程與應(yīng)用,2011,47(29):81-84.