朱俊光,高 健,田 俊,趙 敏,戚海峰,謝亞卓,莊建軍
(南京大學(xué) 電子科學(xué)與工程學(xué)院電工電子實(shí)驗(yàn)中心,江蘇 南京 210023)
一切生命體賴以生存的環(huán)境中必不可少的元素除了合適的光照、水分、空氣、養(yǎng)料,還有環(huán)境的溫濕度。環(huán)境溫濕度對(duì)農(nóng)業(yè)、醫(yī)藥業(yè)、氣象業(yè)、食品行業(yè)、工控行業(yè)等都有極其重要的影響。因此設(shè)計(jì)出一種溫濕度實(shí)時(shí)監(jiān)測(cè)的系統(tǒng),并能方便地為人們所掌握顯得尤其重要。另外,隨著互聯(lián)網(wǎng)的不斷發(fā)展壯大,新一代的網(wǎng)絡(luò)——物聯(lián)網(wǎng)[1],即物物相連的互聯(lián)網(wǎng)應(yīng)運(yùn)而生。物聯(lián)網(wǎng)有著極大的發(fā)展?jié)摿Γ梢越o人類的生活環(huán)境帶來(lái)更多的快捷,而且方便與智能[2-3]。
隨著物聯(lián)網(wǎng)技術(shù)最近幾年的迅速發(fā)展,無(wú)線傳感網(wǎng)技術(shù)進(jìn)入應(yīng)用階段[4-7]。本文在充分研 究 ZStack協(xié)議棧、嵌入式開(kāi)發(fā)以及網(wǎng)頁(yè)設(shè)計(jì)的基礎(chǔ)上進(jìn)行了綜合設(shè)計(jì),即首先利用無(wú)線傳感網(wǎng)中的ZigBee技術(shù),在底層建立短距離無(wú)線傳感網(wǎng)并實(shí)現(xiàn)采樣數(shù)據(jù)傳輸,將底層數(shù)據(jù)傳輸至上層的嵌入式網(wǎng)關(guān)平臺(tái),對(duì)數(shù)據(jù)進(jìn)行加工處理,通過(guò)驅(qū)動(dòng)平臺(tái)中的LCD屏幕來(lái)提供一個(gè)友好的UI界面,方便人們實(shí)時(shí)觀察溫濕度,并在嵌入式平臺(tái)上搭建服務(wù)器,利用 WiFi來(lái)訪問(wèn)相應(yīng)的動(dòng)態(tài)數(shù)據(jù)網(wǎng)頁(yè),從而實(shí)現(xiàn)實(shí)時(shí)監(jiān)測(cè)環(huán)境溫濕度的變化。
按照由下至上的順序?qū)⒄麄€(gè)系統(tǒng)分為3個(gè)大模塊,即底層數(shù)據(jù)采集模塊、中間層數(shù)據(jù)傳輸模塊和上層數(shù)據(jù)處理模塊。
底層模塊由溫濕度傳感器SHT11和TI公司的ZigBee芯片CC2530構(gòu)成,由CC2530控制傳感器檢測(cè)環(huán)境溫濕度,并作為無(wú)線傳感網(wǎng)中的節(jié)點(diǎn)模塊。中間層數(shù)據(jù)傳輸模塊由兩塊CC2530構(gòu)成,分別作為ZigBee網(wǎng)絡(luò)中節(jié)點(diǎn)和協(xié)調(diào)器自動(dòng)組網(wǎng),無(wú)線傳輸溫濕度數(shù)據(jù),并在協(xié)調(diào)器一端將數(shù)據(jù)通過(guò)異步串口通信交由嵌入式網(wǎng)關(guān)平臺(tái)處理。上層數(shù)據(jù)處理模塊為整個(gè)嵌入式網(wǎng)關(guān)平臺(tái),所需用到資源有核心板(搭載ARM11架構(gòu)的S3C6410微處理器、256MB Mobile DDR、128 MB NAND Flash)、DM9000A10/100MB網(wǎng)卡、真彩色寬屏LCD和USB無(wú)線網(wǎng)卡。最后還需搭建實(shí)驗(yàn)環(huán)境中的局域網(wǎng),利用WiFi加入無(wú)線局域網(wǎng),利用網(wǎng)內(nèi)設(shè)備進(jìn)行測(cè)試,其系統(tǒng)結(jié)構(gòu)框圖見(jiàn)圖1示。

圖1 系統(tǒng)結(jié)構(gòu)框圖
溫濕度傳感器SHT11為瑞士Sensirion公司設(shè)計(jì)的數(shù)字式溫濕度傳感器,具有全量程標(biāo)定,兩線數(shù)字輸出;濕度測(cè)量范圍0~100%RH,溫度測(cè)量范圍-40~+123.8℃,濕度測(cè)量精度±3.0%RH,溫度測(cè)量精度±0.4℃[8]。作為ZigBee模塊的CC2530具有射頻收發(fā)器產(chǎn)品中的許多優(yōu)良性能。
CC2530內(nèi)部集成了一塊具有增強(qiáng)型的8051處理器,一塊可讀寫的Flash閃存,一定大小的內(nèi)存塊以及大量其他功能模塊。為了簡(jiǎn)化開(kāi)發(fā),使用CC2530支持的Z-Stack網(wǎng)絡(luò)協(xié)議棧,它是由TI開(kāi)發(fā)的遵循Zig-Bee協(xié)議規(guī)范的網(wǎng)絡(luò)協(xié)議棧[9]。
為了開(kāi)發(fā)調(diào)試的需要,將宿主機(jī)的串口分別與嵌入式平臺(tái)和CC2530相連接,實(shí)現(xiàn)將調(diào)試信息通過(guò)串口打印在宿主機(jī)上。另外,利用以太網(wǎng)接口將開(kāi)發(fā)板與宿主機(jī)兩端用網(wǎng)線互聯(lián),因?yàn)樵谑褂肗FS、TFTP服務(wù)或者其他一些網(wǎng)絡(luò)服務(wù)時(shí)要用到。通過(guò)USB-A轉(zhuǎn)Mini連接宿主機(jī)與ZigBee模塊,用于向其下載調(diào)試程序。
根據(jù)各個(gè)模塊的具體實(shí)現(xiàn)功能的不同,按照由下至上的順序分別予以設(shè)計(jì)。
這部分工作主要是對(duì)ZigBee節(jié)點(diǎn)內(nèi)部的單片機(jī)模塊進(jìn)行編程。首先考慮到CC2530有3個(gè)8位端口組成,端口1、2、3分別用P0,P1,P2來(lái)表示,其中,P0和P1是完全的8位端口,而P2僅有5位可用。所有的端口均可以通過(guò)SFR寄存器P0、P1和P2位尋址和字節(jié)尋址。傳感器芯片只提供2個(gè)I/O端口:DATA和SCK,前者為數(shù)據(jù)輸入輸出端口,后者為只可輸入的時(shí)鐘信號(hào)端口。因此將P0_0與SCK相連以提供時(shí)鐘序列,P0_1與DATA相連以讀寫溫濕度數(shù)據(jù)。
在了解硬件連接基礎(chǔ)上對(duì)數(shù)據(jù)采集模塊進(jìn)行軟件設(shè)計(jì),程序由3部分構(gòu)成:
(1)主函數(shù)部分:首先調(diào)用函數(shù)初始化串口通信以及溫濕度傳感器,然后調(diào)用函數(shù)獲取溫濕度數(shù)據(jù),最后將數(shù)據(jù)處理后調(diào)用串口控制函數(shù),打印調(diào)試信息。
(2)溫濕度傳感器控制部分:具體實(shí)現(xiàn)初始化傳感器函數(shù),即設(shè)置P0端口的相關(guān)寄存器;實(shí)現(xiàn)獲取溫濕度數(shù)據(jù)的函數(shù),根據(jù)傳感器資料說(shuō)明,端口按照一定時(shí)序發(fā)出特定的序列即可進(jìn)行相應(yīng)控制;實(shí)現(xiàn)將得到的數(shù)據(jù)進(jìn)行計(jì)算修正的函數(shù)。
(3)串口打印控制部分:包括從串口獲取PC鍵盤按鍵值、發(fā)送一個(gè)字符、發(fā)送一串字符等功能使主函數(shù)的打印信息能顯示在串口通信軟件界面上。
其主要部分的流程圖見(jiàn)圖2。

圖2 溫濕度采集模塊流程圖
該模塊分為兩部分,一為基于Z-Stack協(xié)議棧開(kāi)發(fā)使節(jié)點(diǎn)與協(xié)調(diào)器自動(dòng)組網(wǎng)形成ZigBee網(wǎng)絡(luò),并通過(guò)該網(wǎng)絡(luò)實(shí)現(xiàn)數(shù)據(jù)無(wú)線傳輸;二為使協(xié)調(diào)器與嵌入式核心板中ARM處理器進(jìn)行串行異步通信,將數(shù)據(jù)最終交由嵌入式平臺(tái)處理。
Z-Stack采用分布式尋址,兼容AODV路由協(xié)議,可以滿足近程通信的要求,即使通信鏈路失效發(fā)生也可有效工作。為了區(qū)分Z-Stack協(xié)議棧中復(fù)雜的硬件驅(qū)動(dòng)系統(tǒng),又提供了OSAL層[10](類似于單片機(jī)上的操作系統(tǒng),實(shí)則為根據(jù)所觸發(fā)的事件選擇調(diào)度相應(yīng)任務(wù)),可調(diào)度APP層的任務(wù)。另外,Z-Stack提供了源碼例程SampleApp。該例程實(shí)現(xiàn)的功能主要是協(xié)調(diào)器自啟動(dòng)(組網(wǎng))和節(jié)點(diǎn)設(shè)備自動(dòng)入網(wǎng)。在了解ZStack的工作流程后,程序的開(kāi)發(fā)將在APP層對(duì)SampleApp.c進(jìn)行改寫完成。
這部分程序主要為利用OSAL層任務(wù)事件輪詢調(diào)度機(jī)制,通過(guò)系統(tǒng)周期性定時(shí)廣播數(shù)據(jù)到group1中去實(shí)現(xiàn)。當(dāng)ZigBee節(jié)點(diǎn)加入網(wǎng)絡(luò)后觸發(fā)狀態(tài)改變事件,系統(tǒng)開(kāi)啟定時(shí)器,定時(shí)時(shí)間一到就觸發(fā)廣播消息事件;系統(tǒng)為其創(chuàng)建相應(yīng)的任務(wù)ID,調(diào)用廣播消息函數(shù);節(jié)點(diǎn)端的廣播消息函數(shù)讀取前一個(gè)模塊得到的數(shù)據(jù),利用AF_DataRequest()函數(shù)接口調(diào)用下層射頻硬件驅(qū)動(dòng)函數(shù)發(fā)送溫濕度數(shù)據(jù);觸發(fā)協(xié)調(diào)器端的接收數(shù)據(jù)事件處理函數(shù)SampleApp_M(jìn)essageMSGCB(),將捕獲的溫濕度數(shù)據(jù)處理后,以字符串的形式通過(guò)串口顯示在宿主機(jī)的終端中,以方便調(diào)試和開(kāi)發(fā)。另外,協(xié)調(diào)器通過(guò)異步串行接口將數(shù)據(jù)交由ARM處理器。
為了后續(xù)拓展,為可處理多個(gè)節(jié)點(diǎn)溫濕度數(shù)據(jù),該模塊設(shè)計(jì)采用服務(wù)器與客戶端兩進(jìn)程間通信來(lái)實(shí)現(xiàn)[11]。將接收Z(yǔ)igBee協(xié)調(diào)器通過(guò)異步串行通信發(fā)送過(guò)來(lái)的數(shù)據(jù)作為服務(wù)器進(jìn)程,并封裝ZigBee功能提供相應(yīng)應(yīng)用接口。客戶端進(jìn)程則主要是用于同服務(wù)器端進(jìn)行交互,解析獲取溫濕度數(shù)據(jù),同時(shí)為實(shí)現(xiàn)UI圖形界面提供封裝好的接口,為此還需用Qt設(shè)計(jì)UI界面。其中雙方是利用套接口(Socket)來(lái)使進(jìn)程之間通信,但是由于Socket本身不支持同時(shí)等待和超時(shí)處理,所以它不能直接用來(lái)完成多進(jìn)程之間的相互實(shí)時(shí)通信。本實(shí)驗(yàn)采用事件驅(qū)動(dòng)庫(kù)libev的方式構(gòu)建服務(wù)器模型。
Libev是一種高性能事件循環(huán)/事件驅(qū)動(dòng)庫(kù)。需要循環(huán)探測(cè)事件是否產(chǎn)生,其循環(huán)體用ev_loop結(jié)構(gòu)來(lái)表達(dá),并用ev_loop()來(lái)啟動(dòng)。用戶需要做的僅僅是在合適的時(shí)候,將某些ev_io從ev_loop加入或剔除。
服務(wù)器主要實(shí)現(xiàn)流程:首先開(kāi)啟一個(gè)Zigbee后臺(tái)線程(底層)監(jiān)聽(tīng)服務(wù)器調(diào)用信息,接著利用ev_io_start(loop,&ev_io_watcher)啟動(dòng)一個(gè)接收線程,專門用來(lái)接收客戶端發(fā)送過(guò)來(lái)的命令數(shù)據(jù)幀;然后按照相應(yīng)的協(xié)議進(jìn)行解析,跳轉(zhuǎn)到相應(yīng)的接口,進(jìn)一步調(diào)用底層Zigbee協(xié)調(diào)器并返回正確的信息給客戶端。
客戶端主要實(shí)現(xiàn)流程:首先調(diào)用GetConnect接口函數(shù)連接到服務(wù)器的端口,然后開(kāi)啟一個(gè)Zigbeetopo線程用來(lái)調(diào)用接口函數(shù),發(fā)出獲取ZigBee網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)信息的數(shù)據(jù)幀,創(chuàng)建另一線程接收并解析服務(wù)器端返回的數(shù)據(jù)幀,同時(shí)已創(chuàng)建的UI界面設(shè)置定時(shí)器,動(dòng)態(tài)刷新加載溫濕度數(shù)據(jù),繪制成溫濕度曲線圖。
服務(wù)器與客戶端進(jìn)程間通信模型如圖3所示。
此外還需利用Qt對(duì)UI界面設(shè)計(jì)。首先利用Qtdesigner為整體界面布局,其中包括背景顯示框、LCD數(shù)值顯示框以及曲線圖顯示框,編譯生成一個(gè)UI類;然后采用多繼承的方法構(gòu)造新類,并使用Qt中的信號(hào)與槽函數(shù)機(jī)制,使得接收到溫濕度數(shù)據(jù)觸發(fā)LCD數(shù)值顯示和曲線圖顯示槽函數(shù)動(dòng)作。設(shè)計(jì)流程見(jiàn)圖4。

圖3 服務(wù)器與客戶端進(jìn)程間通信模型

圖4 LCD數(shù)值顯示和曲線圖顯示槽函數(shù)設(shè)計(jì)流程
以上只是完成了溫濕度的采集顯示,還未真正發(fā)揮出物聯(lián)網(wǎng)所實(shí)現(xiàn)的人與物相連,這部分就需要搭建Web服務(wù)來(lái)實(shí)現(xiàn)[12-13]。實(shí)現(xiàn) Web服務(wù)需要移植嵌入式服務(wù)器,設(shè)計(jì)動(dòng)態(tài)網(wǎng)頁(yè),并通過(guò)WiFi最終在已搭建好的局域網(wǎng)內(nèi)實(shí)現(xiàn)手機(jī)、PC等可實(shí)時(shí)查看數(shù)據(jù)。
由于嵌入式設(shè)備資源一般都比較有限,并且也不需要同時(shí)處理多用戶的請(qǐng)求,因此不能使用Linux下最常用的如Apache等服務(wù)器,而需要使用一些專門為嵌入式設(shè)備設(shè)計(jì)的Web服務(wù)器。常見(jiàn)的嵌入式Web服務(wù)器主要有:lighttpd、thttpd、shttpd和BOA等。本文選擇移植BOA作為嵌入式服務(wù)器。BOA是一個(gè)非常小巧的Web服務(wù)器,可執(zhí)行代碼只有約60KB,它是一個(gè)單任務(wù)Web服務(wù)器,只能依次完成用戶的請(qǐng)求,而不會(huì)fork出新的進(jìn)程來(lái)處理并發(fā)連接請(qǐng)求,但BOA支持CGI,能夠?yàn)镃GI程序fork出一個(gè)進(jìn)程來(lái)執(zhí)行。
對(duì)BOA服務(wù)器的配置主要是在/etc/boa目錄下創(chuàng)建一個(gè)boa.conf文件,此文件包括服務(wù)器將使用主機(jī)的端口號(hào)、運(yùn)行服務(wù)器的身份、錯(cuò)誤信息記錄的指定文件、存放html文件的目錄、默認(rèn)首頁(yè)文件等相關(guān)信息,此外還需根據(jù)配置信息在相應(yīng)的一些目錄下創(chuàng)建文件。
網(wǎng)頁(yè)設(shè)計(jì)則是利用html制作靜態(tài)頁(yè)面,并結(jié)合JavaScript實(shí)現(xiàn)動(dòng)態(tài)顯示。JavaScript是一種基于對(duì)象和事件驅(qū)動(dòng)并具有相對(duì)安全性的客戶端腳本語(yǔ)言,同時(shí)也是一種廣泛用于客戶端Web開(kāi)發(fā)的腳本語(yǔ)言,常用來(lái)給HTML網(wǎng)頁(yè)添加動(dòng)態(tài)功能,比如響應(yīng)用戶的各種操作。JavaScript腳本可以獨(dú)立成文件,也可以內(nèi)聯(lián)到HTML文檔之中。
另外,利用AJAX實(shí)時(shí)刷新網(wǎng)頁(yè)數(shù)據(jù)。AJAX:異步JavaScript和XML,它是一種在無(wú)需重新加載整個(gè)網(wǎng)頁(yè)的情況下,就能更新部分網(wǎng)頁(yè)的技術(shù)[14]。它通過(guò)在后臺(tái)與服務(wù)器進(jìn)行少量的數(shù)據(jù)交換,便可以使網(wǎng)頁(yè)實(shí)現(xiàn)異步更新。這意味著可以在不重新加載整個(gè)網(wǎng)頁(yè)的情況下,對(duì)網(wǎng)頁(yè)的某部分元素進(jìn)行更新。由于溫濕度數(shù)據(jù)放入數(shù)據(jù)緩沖區(qū),是利用fopen、fread、fwrite以及fseek函數(shù)將數(shù)據(jù)緩沖區(qū)內(nèi)數(shù)據(jù)寫入XML文本適當(dāng)位置中,要想讀取XML文檔中的數(shù)據(jù)并將它顯示在Web頁(yè)面上,需將XML文件轉(zhuǎn)化為XMLDOM(XML文檔對(duì)象模型),然后再利用JavaScript來(lái)解析并實(shí)時(shí)它。
通過(guò)搭建WIFI模塊,使得用戶可以通過(guò)支持WIFI的設(shè)備比如手機(jī)等更加便捷地查看溫濕度數(shù)據(jù)。WIFI是一個(gè)無(wú)線網(wǎng)絡(luò)通信技術(shù)的品牌,WIFI的運(yùn)作至少需要1個(gè)AP和1個(gè)或1個(gè)以上的client。AP由路由器搭建的局域網(wǎng)充當(dāng),將插上無(wú)線網(wǎng)卡的嵌入式開(kāi)發(fā)板看作一個(gè)client,然后就可以與其他client進(jìn)行通信。要使無(wú)線網(wǎng)卡能正常工作,首先需加載驅(qū)動(dòng),然后對(duì)其進(jìn)行一系列設(shè)置,使之加入到局域網(wǎng)中。由于開(kāi)發(fā)板上配置有服務(wù)器,因此設(shè)置好合適IP以后,在手機(jī)等瀏覽器中輸入IP,就能查看溫濕度數(shù)據(jù)。
最終實(shí)現(xiàn)的效果如圖5和圖6所示。

圖5 顯示在LCD上的溫濕度曲線

圖6 手機(jī)和PC訪問(wèn)溫濕度數(shù)據(jù)網(wǎng)頁(yè)
通過(guò)以上綜合設(shè)計(jì)實(shí)現(xiàn)的溫濕度系統(tǒng),既可以在LCD屏幕上看到實(shí)時(shí)動(dòng)態(tài)曲線,又可以用手機(jī)查看實(shí)時(shí)更新的數(shù)據(jù)網(wǎng)頁(yè),實(shí)現(xiàn)了物聯(lián)網(wǎng)所提出的人物相連的概念,使通信交流不僅局限于人與人之間進(jìn)行。
(
)
[1]彭?yè)P(yáng),蔣長(zhǎng)兵.物聯(lián)網(wǎng)技術(shù)與應(yīng)用基礎(chǔ)[M].北京:中國(guó)物資出版社,2011.
[2]車轔轔,孔英會(huì),趙建立,等.基于物聯(lián)網(wǎng)的智慧實(shí)驗(yàn)室設(shè)計(jì)[J].實(shí)驗(yàn)技術(shù)與管理,2013,30(10):212-215.
[3]黃崢,古鵬.物聯(lián)網(wǎng)實(shí)驗(yàn)室建設(shè)研究與探討[J].實(shí)驗(yàn)技術(shù)與管理,2012,29(2):191-195.
[4]彭程.基于物聯(lián)網(wǎng)技術(shù)的智慧農(nóng)業(yè)發(fā)展策略研究[J].西安郵電學(xué)院學(xué)報(bào),2012,17(2):94-98.
[5]周建國(guó),周勇,丁立人,等.物聯(lián)網(wǎng)技術(shù)在大型儀器共享中的應(yīng)用研究[J].物聯(lián)網(wǎng)技術(shù),2012(8):74-77.
[6]馬榮飛.基于物聯(lián)網(wǎng)技術(shù)網(wǎng)絡(luò)自適應(yīng)移動(dòng)節(jié)點(diǎn)資源監(jiān)測(cè)研究[J].計(jì)算機(jī)工程與設(shè)計(jì),2012,33(5):1725-1728.
[7]饒緒黎,張美平,馬現(xiàn)虎.基于物聯(lián)網(wǎng)技術(shù)的實(shí)驗(yàn)設(shè)備運(yùn)行監(jiān)控管理系統(tǒng)設(shè)計(jì)[J].山東大學(xué)學(xué)報(bào):理學(xué)版,2012,47(11):74-77.
[8]馮顯英,葛榮雨.基于數(shù)字溫濕度傳感器SHT11的溫濕度測(cè)控系統(tǒng)[J].自動(dòng)化儀表,2006,27(1):59-61.
[9]童英華.基于Z-Stack的無(wú)線溫濕度采集系統(tǒng)[J].現(xiàn)代電子技術(shù),2012,35(23):115-117.
[10]曾寶國(guó).Z-STACK協(xié)議棧應(yīng)用開(kāi)發(fā)分析[J].物聯(lián)網(wǎng)技術(shù),2011,1(3):71-73.
[11]曾寶國(guó),曾妍.基于 WSN的開(kāi)放性實(shí)驗(yàn)室電源管理系統(tǒng)[J].物聯(lián)網(wǎng)技術(shù),2012(6):56-58.
[12]馬驥,喬雙,李丹.基于Web的嵌入式DSP測(cè)控系統(tǒng)設(shè)計(jì)[J].東北師大學(xué)報(bào):自然科學(xué)版,2007,39(1):41-45.
[13]劉佳,劉柏全,宋鐵成,等.一種物聯(lián)網(wǎng)教學(xué)實(shí)驗(yàn)系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J].電氣電子教學(xué)學(xué)報(bào),2010,32(6):89-92.
[14]劉西杰,柳林.HTML、CSS、JavaScript網(wǎng)頁(yè)制作從入門到精通[M].北京:人民郵電出版社,2013.