《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 嵌入式技術(shù) > 設(shè)計應(yīng)用 > 基于Web和nRF24L01的遠(yuǎn)程數(shù)據(jù)接收器設(shè)計
基于Web和nRF24L01的遠(yuǎn)程數(shù)據(jù)接收器設(shè)計
來源:電子技術(shù)應(yīng)用2013年第10期
嚴(yán)林祥, 張紅雨
電子科技大學(xué) 電子工程學(xué)院,四川 成都 611731
摘要: 基于S3C2440-Linux嵌入式平臺和nRF24L01射頻模塊,介紹了一種遠(yuǎn)程數(shù)據(jù)接收器的設(shè)計。該數(shù)據(jù)接收器利用SQLite3存儲nRF24L01射頻模塊接收來自數(shù)據(jù)采集節(jié)點的數(shù)據(jù),用戶通過瀏覽器訪問接收器上的BOA服務(wù)器進(jìn)行數(shù)據(jù)管理。在CGI程序設(shè)計中采用Posix消息隊列給數(shù)據(jù)接收器的射頻接收單元傳遞命令,利用多線程的方式對接收到的數(shù)據(jù)進(jìn)行處理。這種將傳感器采集到的數(shù)據(jù)通過2.45 GHz無線射頻模塊發(fā)送到數(shù)據(jù)接收器的方式非常適合用于遠(yuǎn)程環(huán)境監(jiān)測、旅游管理等場合。
中圖分類號: TP2
文獻(xiàn)標(biāo)識碼: A
文章編號: 0258-7998(2013)10-0069-03
Design of remote data receiver based on Web and nRF24L01
Yan Linxiang, Zhang Hongyu
School of Electronic Engineering, University of Electronic Science and Technology of China, Chengdu 611731, China
Abstract: A remote data receiver is designed based on S3C2440-Linux embedded platform and nRF24L01 RF module. The data receiver uses SQLite3 to store the data which are received by nRF24L01 RF module from the data acquisition node. Through browser user can access to the BOA server for data management. In CGI program, commands were passed to RF receiving by Posix message queues. Multithreading technology was used to process the received data. The approach of using 2.45 GHz wireless RF module to pass the data which are acquired by sensors to the data receiver is well suited for remote environmental monitoring, tourism management and other occasions.
Key words : data receiver; nRF24L01 RF module; CGI program; multithread; Posix message queues

    在傳統(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.

此內(nèi)容為AET網(wǎng)站原創(chuàng),未經(jīng)授權(quán)禁止轉(zhuǎn)載。