張 繼 平,崔 洪 亮,項(xiàng) 伯 陽(yáng),于 忠 得
(大連工業(yè)大學(xué) 信息科學(xué)與工程學(xué)院,遼寧 大連 116034)
傳統(tǒng)的數(shù)據(jù)采集網(wǎng)絡(luò)是基于現(xiàn)場(chǎng)總線技術(shù)和單片機(jī)應(yīng)用技術(shù)的有線網(wǎng)絡(luò),底層節(jié)點(diǎn)和上層節(jié)點(diǎn)設(shè)備之間的通信,需要通過(guò)現(xiàn)場(chǎng)施工布線實(shí)現(xiàn),設(shè)備移動(dòng)困難,尤其在需要增刪底層節(jié)點(diǎn)設(shè)備時(shí),必須通過(guò)現(xiàn)場(chǎng)的改線、布線施工才能完成,十分不便。隨著計(jì)算機(jī)技術(shù)、網(wǎng)絡(luò)通訊技術(shù)、傳感器技術(shù)的發(fā)展,最近幾年推出一種新的網(wǎng)絡(luò)——無(wú)線傳感器網(wǎng)絡(luò),用于工業(yè)領(lǐng)域的數(shù)據(jù)采集系統(tǒng)的底層網(wǎng)絡(luò)。
無(wú)線傳感器網(wǎng)絡(luò)在工業(yè)領(lǐng)域中的應(yīng)用難點(diǎn)在于保證數(shù)據(jù)傳輸?shù)膶?shí)時(shí)性。Zigbee無(wú)線傳感器設(shè)備搜索時(shí)延一般為30ms,休眠激活和活動(dòng)設(shè)備信道接入時(shí)延分別為15ms。由此可見(jiàn),Zigbee網(wǎng)絡(luò)節(jié)點(diǎn)間的數(shù)據(jù)傳輸時(shí)延在100ms以內(nèi),通過(guò)采用短幀數(shù)據(jù)傳輸、改變網(wǎng)絡(luò)結(jié)構(gòu)可進(jìn)一步降低傳輸時(shí)延,保證數(shù)據(jù)傳輸?shù)膶?shí)時(shí)性[1]。
為了解決傳統(tǒng)的基于現(xiàn)場(chǎng)總線技術(shù)的傳感器網(wǎng)絡(luò)的布線困難、設(shè)備難于移動(dòng)、設(shè)備節(jié)點(diǎn)增刪帶來(lái)的高難度布線施工等問(wèn)題,本文提出了一個(gè)由3層節(jié)點(diǎn)設(shè)備、二級(jí)網(wǎng)絡(luò)組成的無(wú)線數(shù)據(jù)采集系統(tǒng)方案,其中底層傳感器節(jié)點(diǎn)和中間層數(shù)據(jù)采集節(jié)點(diǎn)之間,利用Zigbee無(wú)線技術(shù),實(shí)現(xiàn)數(shù)據(jù)通信,避免了組網(wǎng)、改網(wǎng)過(guò)程的布線施工,節(jié)省人力物力。中間數(shù)據(jù)采集節(jié)點(diǎn)的設(shè)計(jì),采用了嵌入式技術(shù),在ARM處理器和Linux操作系統(tǒng)的支持下,不僅實(shí)現(xiàn)一般數(shù)據(jù)采集節(jié)點(diǎn)的功能,而且具有很好的人機(jī)交互界面和網(wǎng)絡(luò)瀏覽功能。中間層數(shù)據(jù)采集節(jié)點(diǎn)與上層之間采用以太網(wǎng)連接,實(shí)現(xiàn)了數(shù)據(jù)的遠(yuǎn)程瀏覽。
硬件結(jié)構(gòu)如圖1所示,采用3層網(wǎng)絡(luò)結(jié)構(gòu),分傳感層、數(shù)據(jù)采集層、Web層。
圖1 系統(tǒng)框架圖Fig.1 System diagram
傳感層由數(shù)據(jù)采集模塊(傳感器檢測(cè)電路、放大電路、A/D轉(zhuǎn)換器)、數(shù)據(jù)處理和控制模塊(微處理器、存儲(chǔ)器)、通信模塊(Zigbee無(wú)線收發(fā)器)構(gòu)成。實(shí)現(xiàn)將傳感器檢測(cè)的物理參數(shù)變成數(shù)字信號(hào),經(jīng)過(guò)處理后,通過(guò)Zigbee無(wú)線收發(fā)器發(fā)送到上層的采集節(jié)點(diǎn)。
處于網(wǎng)絡(luò)中間的數(shù)據(jù)采集節(jié)點(diǎn)設(shè)備,是系統(tǒng)的核心設(shè)備,硬件由ARM9微處理器、存儲(chǔ)器、彩色LCD顯示器、串口控制器,以太網(wǎng)控制器、Zigbee無(wú)線收發(fā)器等部件組成,在Linux操作系統(tǒng)的支持下,編程實(shí)現(xiàn)向下通過(guò)Zigbee無(wú)線收發(fā)器實(shí)現(xiàn)與傳感器節(jié)點(diǎn)的通信,采集其檢測(cè)的數(shù)據(jù);向上通過(guò)以太網(wǎng)和Web服務(wù)器,支持Web層的數(shù)據(jù)瀏覽;數(shù)據(jù)采集節(jié)點(diǎn)設(shè)備,通過(guò)彩色LCD顯示屏,可以實(shí)現(xiàn)采集數(shù)據(jù)的實(shí)時(shí)顯示和其他的人機(jī)交互功能。
Web層主要是PC機(jī)等網(wǎng)絡(luò)顯示操作設(shè)備。通過(guò)訪問(wèn)數(shù)據(jù)采集層提供的域名,實(shí)現(xiàn)數(shù)據(jù)的遠(yuǎn)程訪問(wèn)[2]。
軟件部分的設(shè)計(jì)主要包括:傳感器節(jié)點(diǎn)軟件設(shè)計(jì)和數(shù)據(jù)采集節(jié)點(diǎn)軟件設(shè)計(jì)。
傳感器節(jié)點(diǎn)軟件設(shè)計(jì)采用傳統(tǒng)的前/后臺(tái)(超循環(huán))系統(tǒng)設(shè)計(jì),利用中斷服務(wù)程序(前臺(tái)行為)保證數(shù)據(jù)采集的實(shí)時(shí)性。主要實(shí)現(xiàn)傳感器數(shù)據(jù)采集、數(shù)據(jù)處理和無(wú)線傳輸數(shù)據(jù)的封裝及響應(yīng)網(wǎng)絡(luò)上層節(jié)點(diǎn)的調(diào)度命令四部分功能。
數(shù)據(jù)采集節(jié)點(diǎn)通過(guò)Zigbee模塊、接收傳感器節(jié)點(diǎn)的數(shù)據(jù),在本地存儲(chǔ),并提供web端的遠(yuǎn)程訪問(wèn)功能。
數(shù)據(jù)采集節(jié)點(diǎn)設(shè)計(jì)主要包括:Linux操作系統(tǒng)移植、Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)、GUI(GTK)移植及應(yīng)用程序開(kāi)發(fā)四部分。
2.2.1 Linux操作系統(tǒng)移植
獲取Linux內(nèi)核源代碼,根據(jù)目標(biāo)板硬件對(duì)系統(tǒng)進(jìn)行裁剪與移植。
2.2.2 Linux設(shè)備驅(qū)動(dòng)的開(kāi)發(fā)
基于input子系統(tǒng)與平臺(tái)總線結(jié)合的方式開(kāi)發(fā)觸摸屏驅(qū)動(dòng)。
Linux內(nèi)核提供了平臺(tái)設(shè)備注冊(cè)函數(shù)platform_device_register()和平臺(tái)驅(qū)動(dòng)注冊(cè)函數(shù)platform_driver_register().驅(qū)動(dòng)模塊初始化的時(shí)候,調(diào)用平臺(tái)設(shè)備probe方法完成對(duì)驅(qū)動(dòng)程序IO內(nèi)存申請(qǐng)與映射、中斷號(hào)注冊(cè)、硬件IO初始化、設(shè)備結(jié)構(gòu)初始化與注冊(cè)[3]。
Linux輸入子系統(tǒng)為輸入設(shè)備提供統(tǒng)一的編程接口,驅(qū)動(dòng)設(shè)計(jì)的核心工作是向系統(tǒng)報(bào)告觸摸屏輸入事件。Linux內(nèi)核提供input_report_xxx()函數(shù)用于報(bào)告事件的發(fā)生和按鍵的坐標(biāo)等[4]。
驅(qū)動(dòng)完成后,將驅(qū)動(dòng)加入內(nèi)核中進(jìn)行驅(qū)動(dòng)模塊的編譯,將編譯好的驅(qū)動(dòng)模塊轉(zhuǎn)入目標(biāo)系統(tǒng)中,在串口終端下加載模塊后,查看驅(qū)動(dòng)模塊信息如圖2。
圖2 Touchscree.ko模塊信息Fig.2 Touchscree.ko model message
2.2.3 GUI(GTK)移植及應(yīng)用程序開(kāi)發(fā)
(1)移植GTK圖形開(kāi)發(fā)庫(kù),采用GTK實(shí)現(xiàn)數(shù)據(jù)本地顯示,主要提供實(shí)時(shí)曲線,歷史曲線,參數(shù)設(shè)置界面等。
(2)Zigbee數(shù)據(jù)采集程序開(kāi)發(fā),利用GTK提供線程接口,建立一個(gè)數(shù)據(jù)采集線程,此線程負(fù)責(zé)讀取Zigbee模塊上傳的數(shù)據(jù),并根據(jù)底層設(shè)備生成的id生成realtime數(shù)據(jù)文件。
gtk_init(&argc,&argv);
gtk_creatdisplay();
g_thread_create(getzigbeedata,F(xiàn)ALSE,NULL);
上面是一段gtk初始化及線程啟動(dòng)程序,gtk_init(&argc,&argv)用于初始化GTK環(huán)境,gtk_creatdisplay()函數(shù)用于生成并維護(hù)所有顯示界面,通過(guò)g_thread_creat()啟動(dòng)一個(gè)數(shù)據(jù)采集線程。getzigbeedata()為數(shù)據(jù)采集程序,主要實(shí)現(xiàn)讀取串口數(shù)據(jù)。在Linux下設(shè)置串口的參數(shù)被包含在struct termios結(jié)構(gòu)中[5]。
根據(jù)實(shí)際應(yīng)用進(jìn)行參數(shù)設(shè)置完成后,通過(guò)readdatafromtty函數(shù)讀取串口數(shù)據(jù),并檢測(cè)數(shù)據(jù)的有效性。在程序設(shè)計(jì)中,底層設(shè)備id為唯一的設(shè)備標(biāo)識(shí),通過(guò)這個(gè)標(biāo)識(shí)來(lái)區(qū)別不同設(shè)備傳輸?shù)臄?shù)據(jù),傳輸?shù)臄?shù)據(jù)格式為:
paranum用于表示設(shè)備所要上傳的參數(shù)數(shù)量,struct para用于描述上傳的參數(shù),指示參數(shù)編碼及對(duì)應(yīng)參數(shù)的數(shù)據(jù)。
圖3 Zigbee數(shù)據(jù)采集流程圖Fig.3 Zigbee data acquisition flow chart
在Linux下移植Boa服務(wù)器,利用C語(yǔ)言開(kāi)發(fā)CGI動(dòng)態(tài)腳本程序,通過(guò)客戶端瀏覽器來(lái)訪問(wèn),實(shí)現(xiàn)數(shù)據(jù)的遠(yuǎn)程顯示[6],如圖4。
圖4 實(shí)時(shí)數(shù)據(jù)Fig.4 Real-time data
本課題在實(shí)驗(yàn)室環(huán)境下,采用傳感器節(jié)點(diǎn)與18B20溫度傳感器結(jié)合的方式,采集溫度數(shù)據(jù),將數(shù)據(jù)封裝后通過(guò)Zigbee通信模塊發(fā)送出去,接收端采用Zigbee模塊,利用接收程序,讀取上傳數(shù)據(jù),并寫入文件。在學(xué)校局域網(wǎng)范圍內(nèi),通過(guò)移植的Boa服務(wù)器結(jié)合移植的Linux端花生殼軟件,實(shí)現(xiàn)了通過(guò)域名訪問(wèn)本地服務(wù)器的功能。
通過(guò)以上工作,完成了無(wú)線傳感器網(wǎng)絡(luò)檢測(cè)系統(tǒng)硬件平臺(tái)和軟件開(kāi)發(fā)環(huán)境等關(guān)鍵技術(shù)的初步研究工作。提出在保證數(shù)據(jù)傳輸實(shí)時(shí)性的基礎(chǔ)上解決傳統(tǒng)傳感器網(wǎng)絡(luò)布線困難、設(shè)備難于移動(dòng)的問(wèn)題。將無(wú)線傳感器網(wǎng)絡(luò)、ARM處理器、Linux操作系統(tǒng)引入到檢測(cè)系統(tǒng)中,提高了系統(tǒng)運(yùn)行速度和穩(wěn)定性,使系統(tǒng)擁有良好的人機(jī)界面和以太網(wǎng)接口,方便遠(yuǎn)程參數(shù)設(shè)置和數(shù)據(jù)查看。Linux系統(tǒng)和GTK的使用,使軟件的開(kāi)發(fā)更容易。
[1]陳丹,鄭增威,李際軍.無(wú)線傳感器網(wǎng)絡(luò)研究綜述[J].計(jì)算機(jī)測(cè)量與控制,2004,12(8):701-704.
[2]車飛鋒,孟開(kāi)元,曹慶年.基于ARM的嵌入式 Web服務(wù)器的研究與實(shí)現(xiàn)[J].微計(jì)算機(jī)信息,2008,24(9-2):86-88.
[3]于忠得,林敏,申華.嵌入式系統(tǒng)基礎(chǔ)教程[M].北京:國(guó)防工業(yè)出版社,2009:1-14.
[4]張子石.一種Linux嵌入式系統(tǒng)的中斷處理機(jī)制[J].微計(jì)算機(jī)信息,2009,12(2):82-83.
[5]韋東山.嵌入式Linux應(yīng)用開(kāi)發(fā)完全手冊(cè)[M].北京:人民郵電出版社,2008:76-114.
[6]蔡奇玉,連振漢,張志強(qiáng).CGI編程指南[M].北京:機(jī)械工業(yè)出版社,1997:56-73.