文獻(xiàn)標(biāo)識碼: A
文章編號: 0258-7998(2013)10-0069-03
在傳統(tǒng)的數(shù)據(jù)采集中,較多采用RS485或CAN現(xiàn)場總線將分散節(jié)點的數(shù)據(jù)傳給數(shù)據(jù)接收器。由于有線傳輸,在安裝和維修方面會給實際應(yīng)用帶來許多不必要的麻煩。若采集數(shù)據(jù)節(jié)點對移動性要求比較高,則這種有線傳輸方式有時卻行不通。因此,若各數(shù)據(jù)采集節(jié)點通過無線方式將數(shù)據(jù)傳給數(shù)據(jù)接收器,則可以很好地解決上述的問題。在工業(yè)應(yīng)用中2.45 GHz無線通信具有頻段免費、通信距離遠(yuǎn)的優(yōu)點。目前基于2.45 GHz無線通信比較成熟的應(yīng)用有無繩電話、ZigBee、WiFi、藍(lán)牙等。它們有統(tǒng)一的協(xié)議標(biāo)準(zhǔn),但是具有協(xié)議復(fù)雜、開發(fā)難度大、周期長等不足。Nordic Semiconductor 公司的nRF24L01 系類單片無線收發(fā)芯片采用封閉協(xié)議通信, 而各個廠家可以根據(jù)自己的需求制定自己的通信協(xié)議[1-3]。因此采用以nRF24L01芯片為核心的射頻模塊對節(jié)點采集的數(shù)據(jù)進(jìn)行無線傳輸具有低成本、易開發(fā)等優(yōu)點。
但2.45 GHz無線通信的距離還是非常有限的,如ZigBee在2~20 m、WiFi在2~200 m。因此可以在接收器上移植TCP/IP網(wǎng)絡(luò)協(xié)議,最終通過遠(yuǎn)程網(wǎng)絡(luò)來實現(xiàn)對數(shù)據(jù)接收器的控制。遠(yuǎn)程訪問管理數(shù)據(jù)接收器有兩種方式:C/S(客戶機/服務(wù)器)模式和B/S(瀏覽器/服務(wù)器)模式。C/S模式只能在小范圍內(nèi)的網(wǎng)絡(luò)環(huán)境中應(yīng)用,缺乏靈活性,開發(fā)周期長而且升級難。而采用B/S模式,只要在和設(shè)備聯(lián)網(wǎng)的任何地方,合法用戶就可以通過瀏覽器遠(yuǎn)程管理控制接收器[4]。因此它具有系統(tǒng)維護(hù)方便、開發(fā)周期短的優(yōu)勢。
1 遠(yuǎn)程數(shù)據(jù)接收系統(tǒng)設(shè)計
基于nRF24L01射頻模塊的遠(yuǎn)程數(shù)據(jù)接收系統(tǒng)結(jié)構(gòu)如圖1所示。數(shù)據(jù)接收器以S3C2440為處理器,外圍擴展nRF24L01射頻模塊、存儲模塊和網(wǎng)絡(luò)通信模塊。各數(shù)據(jù)采集節(jié)點由低功耗MCU、射頻模塊和傳感器數(shù)據(jù)采集電路構(gòu)成。每個節(jié)點有一個ID號,將它與采集到數(shù)據(jù)一起寫到發(fā)送包的數(shù)據(jù)域中,然后通過射頻模塊發(fā)送給接收器的射頻接收單元進(jìn)行處理。在該系統(tǒng)中,S3C2440與nRF24L01射頻模塊通信由6根信號線組成,它們分別為:主機出從機進(jìn)數(shù)據(jù)線(MOSI) 、主機進(jìn)從機出數(shù)據(jù)線(MISO)、時鐘線(SCK)、設(shè)備選擇線(CS) 、中斷標(biāo)志線(IRQ)和接收發(fā)送模式選擇線(CE) [2-4]。IRQ中的信號可以代表不同突發(fā)情況的中斷事件:nRF24L01在發(fā)送模式下成功發(fā)送數(shù)據(jù)中斷;nRF24L01在接收模式下正確接收數(shù)據(jù)中斷;nRF24L01在發(fā)送模式下,達(dá)到最大重傳次數(shù)中斷。
S3C2440通過SPI接口對nRF24L01的相關(guān)寄存器進(jìn)行操作,以實現(xiàn)對射頻模塊的初始化和相關(guān)信息處理。為了利用Linux中比較成熟的網(wǎng)絡(luò)功能實現(xiàn)遠(yuǎn)程控制,在接收器上移植了嵌入式Linux操作系統(tǒng)。而在Linux系統(tǒng)中,所有的外部設(shè)備都被看作是目錄/dev下的一個文件,并為用戶的訪問提供了一種標(biāo)準(zhǔn)接口[4]。因此在本系統(tǒng)開發(fā)前要實現(xiàn)nRF24L01射頻模塊字符設(shè)備驅(qū)動程序。
2 nRF24L01通信功能實現(xiàn)
nRF24L01單片無線收發(fā)器芯片內(nèi)置頻率發(fā)生器、功率放大器、晶體振蕩器、調(diào)制器和解調(diào)器等功能模塊。通過在芯片外圍擴展少量的器件形成的射頻模塊可以利用全雙工的SPI串行接口與MCU實現(xiàn)通信。它有125個頻點,能夠?qū)崿F(xiàn)點對點、點對多點的無線通信。當(dāng)nRF24L01工作在“ShockBurstTM”方式下時,數(shù)據(jù)包格式由前導(dǎo)碼、地址、數(shù)據(jù)域和CRC校驗這4部分組成。其中前導(dǎo)碼由硬件自動進(jìn)行處理,當(dāng)nRF24L01在發(fā)送模式下自動加入前導(dǎo)碼,在接收模式下自動去除前導(dǎo)碼。它的作用是給芯片穩(wěn)定接收或發(fā)送預(yù)留一定的時間。地址長度為3~5 B,它由寄存器SETUP_AW進(jìn)行設(shè)定。數(shù)據(jù)域為發(fā)送包的有效載荷,長度可以為1~32 B。CRC校驗是可以選擇的,它由控制寄存器中的EN_CRC位來決定[3]。
數(shù)據(jù)采集節(jié)點中的nRF24L01設(shè)置為發(fā)送模式,節(jié)點將采集到的數(shù)據(jù)按照自己規(guī)定的格式填充到發(fā)送包的數(shù)據(jù)域。接收器的nRF24L01設(shè)置為接收模式用于接收節(jié)點發(fā)送的數(shù)據(jù)。在發(fā)送模式下芯片有6個數(shù)據(jù)通道可供選擇,而每個數(shù)據(jù)通道作為RF信道中一個邏輯通道,它們有自己的地址[2-3]。因此可以將數(shù)據(jù)采集節(jié)點的數(shù)據(jù)包地址設(shè)置為接收器nRF24L01芯片6個數(shù)據(jù)通道中某個未被利用的通道地址。從而實現(xiàn)一個接收器可以接收6個節(jié)點的數(shù)據(jù)。若節(jié)點個數(shù)大于6,則要采用一些防碰撞算法來解決數(shù)據(jù)沖突。
采用純ALOHA算法即隨機延遲算法可以用于解決上述問題,數(shù)據(jù)采集節(jié)點利用隨機數(shù)生成函數(shù)產(chǎn)生一個在(N1,N2)之間的隨機數(shù),把這個隨機數(shù)給定時計數(shù)器賦值,使得定時器的定時間隔在(T1,T2)之間[5]。若增大T2-T1,則發(fā)生碰撞的概率減小。
在nRF24L01射頻模塊驅(qū)動程序設(shè)計中主要實現(xiàn)了open()、close()、ioctl()、poll()等函數(shù)。其中open()和close()函數(shù)完成對設(shè)備模塊的打開與關(guān)閉;poll() 函數(shù)是用戶空間調(diào)用select()函數(shù)的接口,用來監(jiān)測設(shè)備文件的狀態(tài)。若射頻模塊成功接收到發(fā)射單元發(fā)送的數(shù)據(jù)則會返回文件可讀,而在其他時候則處于阻塞狀態(tài)。ioctl()函數(shù)為用戶程序提供了對nRF24L01射頻模塊操作的相關(guān)命令,如:RDID_NUM命令用于接收數(shù)據(jù),SENDID命令用于修改并發(fā)送數(shù)據(jù)。
3 數(shù)據(jù)接收器軟件設(shè)計
遠(yuǎn)程數(shù)據(jù)接收器的軟件基于Linux操作系統(tǒng),主要由BOA服務(wù)器、CGI程序、nRF24L01射頻模塊驅(qū)動程序和SQLite3數(shù)據(jù)庫組成,如圖2所示。用戶通過瀏覽器向遠(yuǎn)程BOA服務(wù)器發(fā)出HTTP請求,服務(wù)器的守護(hù)進(jìn)程接收到請求后創(chuàng)建一個CGI進(jìn)程,它將瀏覽器發(fā)送的相關(guān)數(shù)據(jù)設(shè)置成環(huán)境變量,然后執(zhí)行URL指定的CGI程序[4]。在整個軟件設(shè)計中CGI程序起著承上啟下的作用:一方面它從環(huán)境變量或標(biāo)準(zhǔn)輸入讀取用戶輸入數(shù)據(jù),并根據(jù)瀏覽器發(fā)送的相關(guān)命令對nRF24L01射頻模塊和SQLite3數(shù)據(jù)庫進(jìn)行操作;另一方面它把處理結(jié)果回送給BOA服務(wù)器及Web瀏覽器。
4 CGI程序設(shè)計
用戶通過瀏覽器管理遠(yuǎn)程數(shù)據(jù)接收器主要實現(xiàn)以下功能:控制nRF24L01射頻模塊接收或不接收來自數(shù)據(jù)采集節(jié)點中的數(shù)據(jù)、顯示采集到的實時數(shù)據(jù)和歷史數(shù)據(jù)。在本系統(tǒng)設(shè)計中,將用戶提交HTML表單數(shù)據(jù)的方式設(shè)置為GET方法,因此當(dāng)表單提交時,用戶的控制命令被保存到環(huán)境變量QUERY_STRING中。CGI程序首先通過getenv()函數(shù)獲取環(huán)境變量QUERY_STRING的內(nèi)容,然后根據(jù)環(huán)境變量的內(nèi)容執(zhí)行不同的操作,CGI程序流程圖如圖3所示?!?/p>
4.1 射頻模塊應(yīng)用程序設(shè)計
射頻模塊通過Posix消息隊列接收CGI程序發(fā)送的消息,消息的內(nèi)容有兩種:使射頻模塊接收數(shù)據(jù)采集節(jié)點到達(dá)的數(shù)據(jù)包命令和停止接收命令。由于System V 消息隊列無法通知CGI程序何時在消息隊列中放置了一個消息,同時,若采用msgrcv()函數(shù)一直輪詢,CPU的效率會比較低,而Posix消息隊列中的mq_notify()函數(shù),可以實現(xiàn)當(dāng)CGI程序發(fā)送消息時,能夠通過異步事件通知消息隊列的接收端。但是消息隊列描述字(mqd_t變量)不是“普通”描述字,不能通過select()函數(shù)檢測消息隊列是否為可讀狀態(tài)[6]。然而可以通過以下方式實現(xiàn):首先,創(chuàng)建一個管道,通過select()函數(shù)等待檢測管道的可讀狀態(tài);然后通過mq_notify()函數(shù)使當(dāng)消息隊列有消息到來時產(chǎn)生一個SIGUSR1信號,并且通過signal()函數(shù)捕獲這個信號。在信號處理函數(shù)中向管道寫入任意一個字符的數(shù)據(jù),使select()函數(shù)返回管道為可讀狀態(tài),從而程序向下執(zhí)行,通過mq_receive()函數(shù)讀取消息隊列的消息。之后根據(jù)消息的內(nèi)容對nRF24L01射頻模塊執(zhí)行不同的操作。射頻模塊應(yīng)用程序的流程圖如圖4所示。
在主線程中,設(shè)置了一個初始化為0的變量flag,用于標(biāo)記射頻模塊當(dāng)前是否已設(shè)置為接收節(jié)點數(shù)據(jù)。若第一次從消息隊列接收到使射頻模塊接收數(shù)據(jù)的命令,則將flag設(shè)置為1,并創(chuàng)建采集線程。當(dāng)flag為1且接收到停止接收數(shù)據(jù)命令時,則調(diào)用close()函數(shù)關(guān)閉射頻模塊設(shè)備,同時調(diào)用pthread_cancel()函數(shù)結(jié)束采集線程。
在采集線程中,首先調(diào)用SQLite3提供的C API接口函數(shù)sqlite3_open()打開或創(chuàng)建數(shù)據(jù)庫,并調(diào)用sqlite3_exec()函數(shù)創(chuàng)建兩個數(shù)據(jù)表,其中一個用于存儲實時數(shù)據(jù),一個用于存儲歷史數(shù)據(jù)。其次,通過open()函數(shù)打開射頻模塊設(shè)備,調(diào)用ioctl()函數(shù)向射頻模塊發(fā)送一些設(shè)備初始化的設(shè)置命令。初始化后設(shè)備等待節(jié)點數(shù)據(jù)的到來,一旦數(shù)據(jù)到達(dá)便返回設(shè)備為可讀狀態(tài),于是可以調(diào)用ioctl()函數(shù)中的RDID_NUM命令接收數(shù)據(jù)。最后通過sqlite3_exec()函數(shù)執(zhí)行數(shù)據(jù)庫操作的insert語句,將數(shù)據(jù)存儲在實時數(shù)據(jù)表中。
4.2 數(shù)據(jù)顯示線程
用戶通過瀏覽器查詢各節(jié)點采集到的數(shù)據(jù),是由CGI程序中數(shù)據(jù)顯示子線程實現(xiàn)的。數(shù)據(jù)顯示子線程根據(jù)接收到的命令從不同的數(shù)據(jù)表中讀取數(shù)據(jù)。該系統(tǒng)對數(shù)據(jù)的顯示以簡潔的直方圖形式呈現(xiàn),而沒有采用圖片這種比較占用資源的方式。以直方圖形式顯示數(shù)據(jù)能夠滿足大多數(shù)工業(yè)控制中對數(shù)據(jù)顯示的需求。系統(tǒng)測試時,各數(shù)據(jù)采集節(jié)點以MSP430F2121單片機為MCU、以DS18B20溫度傳感器采集周圍的溫度、用nRF24L01射頻模塊將采集到溫度以無線的方式傳輸給數(shù)據(jù)接收器。同時節(jié)點中射頻模塊的天線采集PCB天線,而接收器的天線采用增益為3 dBi棒狀天線,在此條件下,該數(shù)據(jù)接收器能夠接收100 m范圍內(nèi)的節(jié)點數(shù)據(jù),并通過網(wǎng)絡(luò)把數(shù)據(jù)返回到Web頁面中。應(yīng)用本系統(tǒng)對室內(nèi)溫度進(jìn)行監(jiān)測得到的數(shù)據(jù)截圖如圖5所示。
將無線射頻通信技術(shù)和網(wǎng)絡(luò)技術(shù)應(yīng)用于傳感器數(shù)據(jù)采集領(lǐng)域具有非常好的前景,該數(shù)據(jù)接收器可用于在惡劣的環(huán)境下對環(huán)境參數(shù)的多點監(jiān)測。數(shù)據(jù)接收器的射頻模塊PCB的布局對整體的性能有很大影響,同時采用大增益的天線可以使接收器獲取更遠(yuǎn)距離的節(jié)點數(shù)據(jù)。在軟件設(shè)計中由于采用了異步事件通知消息隊列的機制,因此在select()等待管道為可讀狀態(tài)時要注意處理由于信號中斷而使select()返回的EINTR狀態(tài)。
參考文獻(xiàn)
[1] 李雄飛,孫俊杰,陳磊,等.基于ZigBee技術(shù)的無線設(shè)備狀態(tài)監(jiān)測系統(tǒng)[J].儀表技術(shù)與傳感器,2012(12):139-140.
[2] 黃智偉. 單片無線發(fā)射與接收電路設(shè)計[M].西安:西安電子科技大學(xué)出版社,2009.
[3] SEMICONDUCTOR N. nRF24L01 Single Chip 2.4 GHz Transceiver Product Specification[EB/OL].[2007]. http://www.nordicsemi.com/eng/Products/2.4GHz-RF/nRF24L01.
[4] 劉剛,趙劍川. Linux系統(tǒng)移植[M].北京:清華大學(xué)出版社,2011.
[5] 鄧一文,張紅雨,張鵬程,等.RFID高頻讀寫器防碰撞算法研究[J].電子設(shè)計工程,2011(19):31-34.
[6] STEVENS W R. Unix 網(wǎng)絡(luò)編程卷2:進(jìn)程間通信[M].楊繼張, 譯.北京:清華大學(xué)出版社,2001.