《電子技術(shù)應(yīng)用》
您所在的位置:首頁(yè) > 嵌入式技術(shù) > 設(shè)計(jì)應(yīng)用 > 基于Web和nRF24L01的遠(yuǎn)程數(shù)據(jù)接收器設(shè)計(jì)
基于Web和nRF24L01的遠(yuǎn)程數(shù)據(jù)接收器設(shè)計(jì)
來(lái)源:電子技術(shù)應(yīng)用2013年第10期
嚴(yán)林祥, 張紅雨
電子科技大學(xué) 電子工程學(xué)院,四川 成都 611731
摘要: 基于S3C2440-Linux嵌入式平臺(tái)和nRF24L01射頻模塊,介紹了一種遠(yuǎn)程數(shù)據(jù)接收器的設(shè)計(jì)。該數(shù)據(jù)接收器利用SQLite3存儲(chǔ)nRF24L01射頻模塊接收來(lái)自數(shù)據(jù)采集節(jié)點(diǎn)的數(shù)據(jù),用戶通過(guò)瀏覽器訪問(wèn)接收器上的BOA服務(wù)器進(jìn)行數(shù)據(jù)管理。在CGI程序設(shè)計(jì)中采用Posix消息隊(duì)列給數(shù)據(jù)接收器的射頻接收單元傳遞命令,利用多線程的方式對(duì)接收到的數(shù)據(jù)進(jìn)行處理。這種將傳感器采集到的數(shù)據(jù)通過(guò)2.45 GHz無(wú)線射頻模塊發(fā)送到數(shù)據(jù)接收器的方式非常適合用于遠(yuǎn)程環(huán)境監(jiān)測(cè)、旅游管理等場(chǎng)合。
中圖分類號(hào): TP2
文獻(xiàn)標(biāo)識(shí)碼: A
文章編號(hào): 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)場(chǎng)總線將分散節(jié)點(diǎn)的數(shù)據(jù)傳給數(shù)據(jù)接收器。由于有線傳輸,在安裝和維修方面會(huì)給實(shí)際應(yīng)用帶來(lái)許多不必要的麻煩。若采集數(shù)據(jù)節(jié)點(diǎn)對(duì)移動(dòng)性要求比較高,則這種有線傳輸方式有時(shí)卻行不通。因此,若各數(shù)據(jù)采集節(jié)點(diǎn)通過(guò)無(wú)線方式將數(shù)據(jù)傳給數(shù)據(jù)接收器,則可以很好地解決上述的問(wèn)題。在工業(yè)應(yīng)用中2.45 GHz無(wú)線通信具有頻段免費(fèi)、通信距離遠(yuǎn)的優(yōu)點(diǎn)。目前基于2.45 GHz無(wú)線通信比較成熟的應(yīng)用有無(wú)繩電話、ZigBee、WiFi、藍(lán)牙等。它們有統(tǒng)一的協(xié)議標(biāo)準(zhǔn),但是具有協(xié)議復(fù)雜、開(kāi)發(fā)難度大、周期長(zhǎng)等不足。Nordic Semiconductor 公司的nRF24L01 系類單片無(wú)線收發(fā)芯片采用封閉協(xié)議通信, 而各個(gè)廠家可以根據(jù)自己的需求制定自己的通信協(xié)議[1-3]。因此采用以nRF24L01芯片為核心的射頻模塊對(duì)節(jié)點(diǎn)采集的數(shù)據(jù)進(jìn)行無(wú)線傳輸具有低成本、易開(kāi)發(fā)等優(yōu)點(diǎn)。

    但2.45 GHz無(wú)線通信的距離還是非常有限的,如ZigBee在2~20 m、WiFi在2~200 m。因此可以在接收器上移植TCP/IP網(wǎng)絡(luò)協(xié)議,最終通過(guò)遠(yuǎn)程網(wǎng)絡(luò)來(lái)實(shí)現(xiàn)對(duì)數(shù)據(jù)接收器的控制。遠(yuǎn)程訪問(wèn)管理數(shù)據(jù)接收器有兩種方式:C/S(客戶機(jī)/服務(wù)器)模式和B/S(瀏覽器/服務(wù)器)模式。C/S模式只能在小范圍內(nèi)的網(wǎng)絡(luò)環(huán)境中應(yīng)用,缺乏靈活性,開(kāi)發(fā)周期長(zhǎng)而且升級(jí)難。而采用B/S模式,只要在和設(shè)備聯(lián)網(wǎng)的任何地方,合法用戶就可以通過(guò)瀏覽器遠(yuǎn)程管理控制接收器[4]。因此它具有系統(tǒng)維護(hù)方便、開(kāi)發(fā)周期短的優(yōu)勢(shì)。
1 遠(yuǎn)程數(shù)據(jù)接收系統(tǒng)設(shè)計(jì)
    基于nRF24L01射頻模塊的遠(yuǎn)程數(shù)據(jù)接收系統(tǒng)結(jié)構(gòu)如圖1所示。數(shù)據(jù)接收器以S3C2440為處理器,外圍擴(kuò)展nRF24L01射頻模塊、存儲(chǔ)模塊和網(wǎng)絡(luò)通信模塊。各數(shù)據(jù)采集節(jié)點(diǎn)由低功耗MCU、射頻模塊和傳感器數(shù)據(jù)采集電路構(gòu)成。每個(gè)節(jié)點(diǎn)有一個(gè)ID號(hào),將它與采集到數(shù)據(jù)一起寫(xiě)到發(fā)送包的數(shù)據(jù)域中,然后通過(guò)射頻模塊發(fā)送給接收器的射頻接收單元進(jìn)行處理。在該系統(tǒng)中,S3C2440與nRF24L01射頻模塊通信由6根信號(hào)線組成,它們分別為:主機(jī)出從機(jī)進(jìn)數(shù)據(jù)線(MOSI) 、主機(jī)進(jìn)從機(jī)出數(shù)據(jù)線(MISO)、時(shí)鐘線(SCK)、設(shè)備選擇線(CS) 、中斷標(biāo)志線(IRQ)和接收發(fā)送模式選擇線(CE) [2-4]。IRQ中的信號(hào)可以代表不同突發(fā)情況的中斷事件:nRF24L01在發(fā)送模式下成功發(fā)送數(shù)據(jù)中斷;nRF24L01在接收模式下正確接收數(shù)據(jù)中斷;nRF24L01在發(fā)送模式下,達(dá)到最大重傳次數(shù)中斷。

    S3C2440通過(guò)SPI接口對(duì)nRF24L01的相關(guān)寄存器進(jìn)行操作,以實(shí)現(xiàn)對(duì)射頻模塊的初始化和相關(guān)信息處理。為了利用Linux中比較成熟的網(wǎng)絡(luò)功能實(shí)現(xiàn)遠(yuǎn)程控制,在接收器上移植了嵌入式Linux操作系統(tǒng)。而在Linux系統(tǒng)中,所有的外部設(shè)備都被看作是目錄/dev下的一個(gè)文件,并為用戶的訪問(wèn)提供了一種標(biāo)準(zhǔn)接口[4]。因此在本系統(tǒng)開(kāi)發(fā)前要實(shí)現(xiàn)nRF24L01射頻模塊字符設(shè)備驅(qū)動(dòng)程序。
2 nRF24L01通信功能實(shí)現(xiàn)
    nRF24L01單片無(wú)線收發(fā)器芯片內(nèi)置頻率發(fā)生器、功率放大器、晶體振蕩器、調(diào)制器和解調(diào)器等功能模塊。通過(guò)在芯片外圍擴(kuò)展少量的器件形成的射頻模塊可以利用全雙工的SPI串行接口與MCU實(shí)現(xiàn)通信。它有125個(gè)頻點(diǎn),能夠?qū)崿F(xiàn)點(diǎn)對(duì)點(diǎn)、點(diǎn)對(duì)多點(diǎn)的無(wú)線通信。當(dāng)nRF24L01工作在“ShockBurstTM”方式下時(shí),數(shù)據(jù)包格式由前導(dǎo)碼、地址、數(shù)據(jù)域和CRC校驗(yàn)這4部分組成。其中前導(dǎo)碼由硬件自動(dòng)進(jìn)行處理,當(dāng)nRF24L01在發(fā)送模式下自動(dòng)加入前導(dǎo)碼,在接收模式下自動(dòng)去除前導(dǎo)碼。它的作用是給芯片穩(wěn)定接收或發(fā)送預(yù)留一定的時(shí)間。地址長(zhǎng)度為3~5 B,它由寄存器SETUP_AW進(jìn)行設(shè)定。數(shù)據(jù)域?yàn)榘l(fā)送包的有效載荷,長(zhǎng)度可以為1~32 B。CRC校驗(yàn)是可以選擇的,它由控制寄存器中的EN_CRC位來(lái)決定[3]。
    數(shù)據(jù)采集節(jié)點(diǎn)中的nRF24L01設(shè)置為發(fā)送模式,節(jié)點(diǎn)將采集到的數(shù)據(jù)按照自己規(guī)定的格式填充到發(fā)送包的數(shù)據(jù)域。接收器的nRF24L01設(shè)置為接收模式用于接收節(jié)點(diǎn)發(fā)送的數(shù)據(jù)。在發(fā)送模式下芯片有6個(gè)數(shù)據(jù)通道可供選擇,而每個(gè)數(shù)據(jù)通道作為RF信道中一個(gè)邏輯通道,它們有自己的地址[2-3]。因此可以將數(shù)據(jù)采集節(jié)點(diǎn)的數(shù)據(jù)包地址設(shè)置為接收器nRF24L01芯片6個(gè)數(shù)據(jù)通道中某個(gè)未被利用的通道地址。從而實(shí)現(xiàn)一個(gè)接收器可以接收6個(gè)節(jié)點(diǎn)的數(shù)據(jù)。若節(jié)點(diǎn)個(gè)數(shù)大于6,則要采用一些防碰撞算法來(lái)解決數(shù)據(jù)沖突。
    采用純ALOHA算法即隨機(jī)延遲算法可以用于解決上述問(wèn)題,數(shù)據(jù)采集節(jié)點(diǎn)利用隨機(jī)數(shù)生成函數(shù)產(chǎn)生一個(gè)在(N1,N2)之間的隨機(jī)數(shù),把這個(gè)隨機(jī)數(shù)給定時(shí)計(jì)數(shù)器賦值,使得定時(shí)器的定時(shí)間隔在(T1,T2)之間[5]。若增大T2-T1,則發(fā)生碰撞的概率減小。
    在nRF24L01射頻模塊驅(qū)動(dòng)程序設(shè)計(jì)中主要實(shí)現(xiàn)了open()、close()、ioctl()、poll()等函數(shù)。其中open()和close()函數(shù)完成對(duì)設(shè)備模塊的打開(kāi)與關(guān)閉;poll() 函數(shù)是用戶空間調(diào)用select()函數(shù)的接口,用來(lái)監(jiān)測(cè)設(shè)備文件的狀態(tài)。若射頻模塊成功接收到發(fā)射單元發(fā)送的數(shù)據(jù)則會(huì)返回文件可讀,而在其他時(shí)候則處于阻塞狀態(tài)。ioctl()函數(shù)為用戶程序提供了對(duì)nRF24L01射頻模塊操作的相關(guān)命令,如:RDID_NUM命令用于接收數(shù)據(jù),SENDID命令用于修改并發(fā)送數(shù)據(jù)。
3 數(shù)據(jù)接收器軟件設(shè)計(jì)
    遠(yuǎn)程數(shù)據(jù)接收器的軟件基于Linux操作系統(tǒng),主要由BOA服務(wù)器、CGI程序、nRF24L01射頻模塊驅(qū)動(dòng)程序和SQLite3數(shù)據(jù)庫(kù)組成,如圖2所示。用戶通過(guò)瀏覽器向遠(yuǎn)程BOA服務(wù)器發(fā)出HTTP請(qǐng)求,服務(wù)器的守護(hù)進(jìn)程接收到請(qǐng)求后創(chuàng)建一個(gè)CGI進(jìn)程,它將瀏覽器發(fā)送的相關(guān)數(shù)據(jù)設(shè)置成環(huán)境變量,然后執(zhí)行URL指定的CGI程序[4]。在整個(gè)軟件設(shè)計(jì)中CGI程序起著承上啟下的作用:一方面它從環(huán)境變量或標(biāo)準(zhǔn)輸入讀取用戶輸入數(shù)據(jù),并根據(jù)瀏覽器發(fā)送的相關(guān)命令對(duì)nRF24L01射頻模塊和SQLite3數(shù)據(jù)庫(kù)進(jìn)行操作;另一方面它把處理結(jié)果回送給BOA服務(wù)器及Web瀏覽器。

4 CGI程序設(shè)計(jì)
    用戶通過(guò)瀏覽器管理遠(yuǎn)程數(shù)據(jù)接收器主要實(shí)現(xiàn)以下功能:控制nRF24L01射頻模塊接收或不接收來(lái)自數(shù)據(jù)采集節(jié)點(diǎn)中的數(shù)據(jù)、顯示采集到的實(shí)時(shí)數(shù)據(jù)和歷史數(shù)據(jù)。在本系統(tǒng)設(shè)計(jì)中,將用戶提交HTML表單數(shù)據(jù)的方式設(shè)置為GET方法,因此當(dāng)表單提交時(shí),用戶的控制命令被保存到環(huán)境變量QUERY_STRING中。CGI程序首先通過(guò)getenv()函數(shù)獲取環(huán)境變量QUERY_STRING的內(nèi)容,然后根據(jù)環(huán)境變量的內(nèi)容執(zhí)行不同的操作,CGI程序流程圖如圖3所示?!?/p>

 

 

4.1 射頻模塊應(yīng)用程序設(shè)計(jì)
    射頻模塊通過(guò)Posix消息隊(duì)列接收CGI程序發(fā)送的消息,消息的內(nèi)容有兩種:使射頻模塊接收數(shù)據(jù)采集節(jié)點(diǎn)到達(dá)的數(shù)據(jù)包命令和停止接收命令。由于System V 消息隊(duì)列無(wú)法通知CGI程序何時(shí)在消息隊(duì)列中放置了一個(gè)消息,同時(shí),若采用msgrcv()函數(shù)一直輪詢,CPU的效率會(huì)比較低,而Posix消息隊(duì)列中的mq_notify()函數(shù),可以實(shí)現(xiàn)當(dāng)CGI程序發(fā)送消息時(shí),能夠通過(guò)異步事件通知消息隊(duì)列的接收端。但是消息隊(duì)列描述字(mqd_t變量)不是“普通”描述字,不能通過(guò)select()函數(shù)檢測(cè)消息隊(duì)列是否為可讀狀態(tài)[6]。然而可以通過(guò)以下方式實(shí)現(xiàn):首先,創(chuàng)建一個(gè)管道,通過(guò)select()函數(shù)等待檢測(cè)管道的可讀狀態(tài);然后通過(guò)mq_notify()函數(shù)使當(dāng)消息隊(duì)列有消息到來(lái)時(shí)產(chǎn)生一個(gè)SIGUSR1信號(hào),并且通過(guò)signal()函數(shù)捕獲這個(gè)信號(hào)。在信號(hào)處理函數(shù)中向管道寫(xiě)入任意一個(gè)字符的數(shù)據(jù),使select()函數(shù)返回管道為可讀狀態(tài),從而程序向下執(zhí)行,通過(guò)mq_receive()函數(shù)讀取消息隊(duì)列的消息。之后根據(jù)消息的內(nèi)容對(duì)nRF24L01射頻模塊執(zhí)行不同的操作。射頻模塊應(yīng)用程序的流程圖如圖4所示。

 在主線程中,設(shè)置了一個(gè)初始化為0的變量flag,用于標(biāo)記射頻模塊當(dāng)前是否已設(shè)置為接收節(jié)點(diǎn)數(shù)據(jù)。若第一次從消息隊(duì)列接收到使射頻模塊接收數(shù)據(jù)的命令,則將flag設(shè)置為1,并創(chuàng)建采集線程。當(dāng)flag為1且接收到停止接收數(shù)據(jù)命令時(shí),則調(diào)用close()函數(shù)關(guān)閉射頻模塊設(shè)備,同時(shí)調(diào)用pthread_cancel()函數(shù)結(jié)束采集線程。
    在采集線程中,首先調(diào)用SQLite3提供的C API接口函數(shù)sqlite3_open()打開(kāi)或創(chuàng)建數(shù)據(jù)庫(kù),并調(diào)用sqlite3_exec()函數(shù)創(chuàng)建兩個(gè)數(shù)據(jù)表,其中一個(gè)用于存儲(chǔ)實(shí)時(shí)數(shù)據(jù),一個(gè)用于存儲(chǔ)歷史數(shù)據(jù)。其次,通過(guò)open()函數(shù)打開(kāi)射頻模塊設(shè)備,調(diào)用ioctl()函數(shù)向射頻模塊發(fā)送一些設(shè)備初始化的設(shè)置命令。初始化后設(shè)備等待節(jié)點(diǎn)數(shù)據(jù)的到來(lái),一旦數(shù)據(jù)到達(dá)便返回設(shè)備為可讀狀態(tài),于是可以調(diào)用ioctl()函數(shù)中的RDID_NUM命令接收數(shù)據(jù)。最后通過(guò)sqlite3_exec()函數(shù)執(zhí)行數(shù)據(jù)庫(kù)操作的insert語(yǔ)句,將數(shù)據(jù)存儲(chǔ)在實(shí)時(shí)數(shù)據(jù)表中。
4.2 數(shù)據(jù)顯示線程
    用戶通過(guò)瀏覽器查詢各節(jié)點(diǎn)采集到的數(shù)據(jù),是由CGI程序中數(shù)據(jù)顯示子線程實(shí)現(xiàn)的。數(shù)據(jù)顯示子線程根據(jù)接收到的命令從不同的數(shù)據(jù)表中讀取數(shù)據(jù)。該系統(tǒng)對(duì)數(shù)據(jù)的顯示以簡(jiǎn)潔的直方圖形式呈現(xiàn),而沒(méi)有采用圖片這種比較占用資源的方式。以直方圖形式顯示數(shù)據(jù)能夠滿足大多數(shù)工業(yè)控制中對(duì)數(shù)據(jù)顯示的需求。系統(tǒng)測(cè)試時(shí),各數(shù)據(jù)采集節(jié)點(diǎn)以MSP430F2121單片機(jī)為MCU、以DS18B20溫度傳感器采集周?chē)臏囟?、用nRF24L01射頻模塊將采集到溫度以無(wú)線的方式傳輸給數(shù)據(jù)接收器。同時(shí)節(jié)點(diǎn)中射頻模塊的天線采集PCB天線,而接收器的天線采用增益為3 dBi棒狀天線,在此條件下,該數(shù)據(jù)接收器能夠接收100 m范圍內(nèi)的節(jié)點(diǎn)數(shù)據(jù),并通過(guò)網(wǎng)絡(luò)把數(shù)據(jù)返回到Web頁(yè)面中。應(yīng)用本系統(tǒng)對(duì)室內(nèi)溫度進(jìn)行監(jiān)測(cè)得到的數(shù)據(jù)截圖如圖5所示。
    將無(wú)線射頻通信技術(shù)和網(wǎng)絡(luò)技術(shù)應(yīng)用于傳感器數(shù)據(jù)采集領(lǐng)域具有非常好的前景,該數(shù)據(jù)接收器可用于在惡劣的環(huán)境下對(duì)環(huán)境參數(shù)的多點(diǎn)監(jiān)測(cè)。數(shù)據(jù)接收器的射頻模塊PCB的布局對(duì)整體的性能有很大影響,同時(shí)采用大增益的天線可以使接收器獲取更遠(yuǎn)距離的節(jié)點(diǎn)數(shù)據(jù)。在軟件設(shè)計(jì)中由于采用了異步事件通知消息隊(duì)列的機(jī)制,因此在select()等待管道為可讀狀態(tài)時(shí)要注意處理由于信號(hào)中斷而使select()返回的EINTR狀態(tài)。
參考文獻(xiàn)
[1] 李雄飛,孫俊杰,陳磊,等.基于ZigBee技術(shù)的無(wú)線設(shè)備狀態(tài)監(jiān)測(cè)系統(tǒng)[J].儀表技術(shù)與傳感器,2012(12):139-140.
[2] 黃智偉. 單片無(wú)線發(fā)射與接收電路設(shè)計(jì)[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高頻讀寫(xiě)器防碰撞算法研究[J].電子設(shè)計(jì)工程,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)載。