劉向誠(chéng) 雷斌
摘 要: 針對(duì)在野外環(huán)境監(jiān)測(cè)中點(diǎn)多面廣、環(huán)境惡劣等問(wèn)題,研究ZigBee技術(shù)能夠?qū)崿F(xiàn)野外環(huán)境數(shù)據(jù)的無(wú)線傳輸。而以前的傳感器網(wǎng)絡(luò)不滿足ZigBee協(xié)議的要求,不能通過(guò)ZigBee網(wǎng)絡(luò)進(jìn)行傳輸,這里介紹一種基于Z?Stack協(xié)議棧,在ZigBee網(wǎng)絡(luò)中實(shí)現(xiàn)以CC2530終端數(shù)據(jù)低功耗串口透明傳輸?shù)南到y(tǒng),該系統(tǒng)能夠通過(guò)終端節(jié)點(diǎn)將采集到的數(shù)據(jù)無(wú)線透明傳輸?shù)絽f(xié)調(diào)器節(jié)點(diǎn)上,從而實(shí)現(xiàn)數(shù)據(jù)的無(wú)線傳輸,并且該設(shè)計(jì)功耗低,適合野外長(zhǎng)期使用。
關(guān)鍵詞: Z?Stack協(xié)議棧; ZigBee網(wǎng)絡(luò); 透明傳輸; 低功耗
中圖分類號(hào): TN919?34 文獻(xiàn)標(biāo)識(shí)碼: A 文章編號(hào): 1004?373X(2015)05?0019?04
Realization of data transparent transmission for WSN monitoring system
LIU Xiang?cheng, LEI Bin
(Institute of Electronic and Information Engineering, Xian Technological University, Xian 710021, China)
Abstract: ZigBee technology research is benefit for overcoming multiple point, broad area, harsh environment and other issues in the field environmental monitoring , as well as realizing wireless transmission of environmental data in field. The previous sensor network could not meet the requirements of zigbee agreement, and could not transmit data through ZigBee network. A low power serial data transparent transmission system through CC2530 terminal in ZigBee network is introduced in this paper, which is based on Z?Stack protocol stack. The system can transmit the data collected through terminal nodes to the coordinator nodes in wireless transparently transmission mode. The system has the advantage of low power consumption, and is suitable for long?term use in the field.
Keywords: Z?Stack protocol stack; ZigBee network; transparent transmission; low power consumption
0 引 言
伴隨社會(huì)發(fā)展對(duì)各種信息的無(wú)限需求,野外環(huán)境監(jiān)測(cè)越來(lái)越受到有關(guān)部門的重視,隨之而來(lái)的問(wèn)題也就越來(lái)越多。在很多監(jiān)測(cè)場(chǎng),因?yàn)樘筋^布設(shè)比較分散、數(shù)采儀需求量較大,在當(dāng)前科研經(jīng)費(fèi)有限的情況下無(wú)法全部實(shí)現(xiàn)自動(dòng)化采集,仍然需要組織人員定期到現(xiàn)場(chǎng)觀測(cè)?;谝陨闲枨?,給出一種基于ZigBee技術(shù)的WSN分布式測(cè)控系統(tǒng),WSN(Wireless Sensor Network,無(wú)線傳感器網(wǎng)絡(luò))是一種新型的數(shù)字化探測(cè)技術(shù),融合了傳感技術(shù)、信息處理技術(shù)和網(wǎng)絡(luò)通信技術(shù)。在德州儀器(TI)公司提供的半開(kāi)源ZigBee協(xié)議棧Z?Stack程序基礎(chǔ)上實(shí)現(xiàn)CC2530終端低功耗數(shù)據(jù)的串口透?jìng)?,通過(guò)傳感器采集到的數(shù)據(jù)與終端節(jié)點(diǎn)相連,終端節(jié)點(diǎn)與協(xié)調(diào)器進(jìn)行數(shù)據(jù)的透明傳輸,協(xié)調(diào)器再通過(guò)串口將數(shù)據(jù)上報(bào)給PC機(jī)。
1 系統(tǒng)的整體設(shè)計(jì)
整個(gè)系統(tǒng)由PC機(jī),數(shù)采儀,協(xié)調(diào)器以及終端節(jié)點(diǎn)構(gòu)成。整個(gè)網(wǎng)絡(luò)中的協(xié)調(diào)器只能有一個(gè),而與數(shù)采儀相連的終端節(jié)點(diǎn)可有多個(gè)。系統(tǒng)的總體設(shè)計(jì)圖如圖1所示。
數(shù)采儀將現(xiàn)場(chǎng)采集到的數(shù)據(jù)通過(guò)轉(zhuǎn)換接口發(fā)送到終端節(jié)點(diǎn)上,終端節(jié)點(diǎn)在獲取串口數(shù)據(jù)以后,對(duì)所獲得的數(shù)據(jù)進(jìn)行封裝,然后通過(guò)基于IEEE 802.15.4的ZigBee無(wú)線通信協(xié)議將數(shù)據(jù)傳遞給協(xié)調(diào)器,協(xié)調(diào)器把所獲取的數(shù)據(jù)進(jìn)行解析,應(yīng)用層獲得數(shù)據(jù)以后再通過(guò)串口上傳到PC機(jī),PC機(jī)可以在串口調(diào)試器上讀取采集到的數(shù)據(jù),從而實(shí)現(xiàn)數(shù)據(jù)的采集,透明傳輸以及數(shù)據(jù)的上報(bào)整個(gè)過(guò)程。
2 低功耗管理及定時(shí)喚醒功能
整個(gè)軟件的開(kāi)發(fā)均以實(shí)現(xiàn)終端的低功耗為核心,因此低功耗是終端的最大特點(diǎn);又因?yàn)榻K端還擔(dān)任數(shù)據(jù)傳輸任務(wù),所以終端的另外一個(gè)功能是能夠?qū)崿F(xiàn)兩個(gè)模塊間數(shù)據(jù)的透明傳輸。但具體實(shí)現(xiàn)低功耗的情況需要根據(jù)在野外可能遇到的問(wèn)題而設(shè)置進(jìn)入低功耗的條件。
本設(shè)計(jì)是采用休眠與喚醒方式來(lái)實(shí)現(xiàn)低功耗設(shè)計(jì)的,終端節(jié)點(diǎn)在每次喚醒后,根據(jù)查詢協(xié)調(diào)器是否有任務(wù)或者通過(guò)判斷是否有網(wǎng)絡(luò)存在來(lái)決定是否進(jìn)入休眠狀態(tài)。
以本設(shè)計(jì)所選用的終端節(jié)點(diǎn)芯片CC2530為例,通過(guò)閱讀其數(shù)據(jù)手冊(cè),得知其具有3種不同休眠運(yùn)行模式,使得它尤其適應(yīng)超低功耗要求的系統(tǒng)。在工作模式下,由于ZigBee技術(shù)的傳輸速率低,傳輸數(shù)據(jù)量小,因此信號(hào)收發(fā)時(shí)間短;在非工作模式下,ZigBee節(jié)點(diǎn)處于休眠狀態(tài)。
CC2530有3種供電模式,分別是PM1,PM2,PM3,根據(jù)分析得知PM1模式功耗比較大;PM2模式比較省功耗而且可以被定時(shí)器喚醒;PM3模式最省電但只能被外部中斷喚醒,有一定局限性。綜合考慮選擇PM2模式,PM2模式通過(guò)睡眠定時(shí)器,實(shí)現(xiàn)終端節(jié)點(diǎn)的休眠、喚醒,使其低功耗運(yùn)行,減少節(jié)點(diǎn)能耗。
終端低功耗功能流程圖如圖2所示。
每隔8 s終端會(huì)自動(dòng)喚醒,喚醒后自動(dòng)檢測(cè)是否存在網(wǎng)絡(luò),如果存在網(wǎng)絡(luò),則啟動(dòng)入網(wǎng)流程,如果沒(méi)有網(wǎng)絡(luò),則繼續(xù)休眠。終端醒來(lái)后會(huì)處于準(zhǔn)備狀態(tài),準(zhǔn)備接收協(xié)調(diào)器的命令,待終端完成采集工作后,由協(xié)調(diào)器廣播休眠命令,終端收到休眠命令后,會(huì)自動(dòng)進(jìn)入休眠狀態(tài),考慮到惡劣情況,即網(wǎng)絡(luò)不穩(wěn)定,網(wǎng)絡(luò)連接又?jǐn)嚅_(kāi)后,終端也會(huì)進(jìn)入休眠,這樣就實(shí)現(xiàn)了終端的低功耗問(wèn)題。終端成功入網(wǎng)后的流程圖如圖3所示。
3 數(shù)據(jù)的透明傳輸
在無(wú)線透明傳輸應(yīng)用中,發(fā)射模塊(也可作為接收模塊)與接收模塊(也可作為發(fā)射模塊)進(jìn)行信息交換的數(shù)據(jù)格式,沒(méi)有像指令字頭、結(jié)束符等數(shù)據(jù)包信息,只要發(fā)射模塊串口有數(shù)據(jù)輸出,模塊就把串口的數(shù)據(jù)以無(wú)線方式編碼發(fā)送。當(dāng)接收模塊接收到發(fā)射模塊發(fā)送的無(wú)線數(shù)據(jù)信號(hào)后進(jìn)行解碼,把解碼后的數(shù)據(jù)按發(fā)射模塊的格式從串口輸出,所發(fā)即所得,即對(duì)模塊使用者來(lái)說(shuō)是透明的。其流程示意圖如圖4所示。
這里的發(fā)送方主要是指終端節(jié)點(diǎn),而接收方主要指協(xié)調(diào)器,協(xié)調(diào)器將終端節(jié)點(diǎn)發(fā)來(lái)的數(shù)據(jù)經(jīng)過(guò)解析后,通過(guò)串口上傳到PC機(jī)去讀取數(shù)據(jù),整個(gè)數(shù)據(jù)的傳輸過(guò)程對(duì)于發(fā)送方和接收方都是透明的,PC機(jī)如果想獲得某個(gè)終端節(jié)點(diǎn)采集的數(shù)據(jù),可以通過(guò)串口向協(xié)調(diào)器發(fā)送命令,根據(jù)網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)找到相應(yīng)節(jié)點(diǎn)的網(wǎng)絡(luò)地址,從而完成采集命令的發(fā)送。
整個(gè)網(wǎng)絡(luò)系統(tǒng)中主要涉及到基于IEEE 802.15.4的ZigBee網(wǎng)絡(luò)通信協(xié)議,主要是發(fā)送方的射頻模塊通過(guò)ZigBee通信協(xié)議將封裝好的數(shù)據(jù)傳遞到接收方的射頻模塊,這一方面對(duì)于用戶來(lái)講是透明的。
3.1 串口透?jìng)鞯闹饕绦?/p>
本系統(tǒng)協(xié)調(diào)器和終端節(jié)點(diǎn)程序主要是基于Z?Stack協(xié)議棧進(jìn)行編寫的,其中串口透?jìng)飨嚓P(guān)函數(shù)如下,使用C語(yǔ)言編程:
(1) 首先在SampleApp.c中添加函數(shù)
SampleApp_ProcessMTMessage(afIncomingMSGPacket_t *msg),函數(shù)主體如下:
void SampleApp_ProcessMTMessage(afIncomingMSGPacket_t *msg)
{
//const char *msgPtr = ((const char *)msg+2);
uint8 *pBuf; //定義數(shù)據(jù)存儲(chǔ)指針
uint8 len; //定義數(shù)據(jù)長(zhǎng)度
//flag這個(gè)參數(shù)不能放在該函數(shù)中,必須定義為全局變量,
否則后面的if無(wú)法進(jìn)入
// deviceaddr = msg->srcAddr.addr.shortAddr;
if(flag==1)
//這里不能用while代替if,否則無(wú)法進(jìn)入該函數(shù)
{
len=msg->hdr.status; //獲取串口數(shù)據(jù)長(zhǎng)度
pBuf=(uint8 *)msg+2; //(uint8 *)((osal_event_hdr_t*)msg+1); //獲取串口數(shù)據(jù)
HalUARTWrite(HAL_UART_PORT_0,pBuf,len);
//將串口數(shù)據(jù)寫到PC(再寫回去)
HalUARTWrite(0, "\n", 1);
//以上兩句是用來(lái)作測(cè)試用的
if (AF_DataRequest( &SampleApp_Periodic_DstAddr, &SampleApp_epDesc,
SAMPLEAPP_LEDCTL_CLUSTERID,
len+2,
(uint8*)msg,
&SampleApp_TransID,
AF_DISCV_ROUTE,
AF_DEFAULT_RADIUS)==afStatus_SUCCESS)
//發(fā)送獲取的串口數(shù)據(jù)
}
}
(2) 然后再在SampleApp.c 的函數(shù)SampleApp_ProcessEvent(uint8 task_id, uint16 events)中添加串口事件,其代碼如下:
case SPI_INCOMING_ZAPP_DATA:
//串口接收數(shù)據(jù)觸發(fā)事件
SampleApp_ProcessMTMessage(MSGpkt); //調(diào)用串口函數(shù)
MT_UartAppFlowControl (MT_UART_ZAPP_RX_READY);
//調(diào)用串口流控制函數(shù)
break;
(3) 最后在SampleApp.c的函數(shù)SampleApp_MessageMSGCB(afIncomingMSGPacket_t *pkt)中添加如下代碼:
case SAMPLEAPP_LEDCTL_CLUSTERID:
cmd_counter=0;
cmd_to_close=0;
len=pkt->cmd.Data[1];
//這里很重要,原來(lái)是len=pkt->cmd.Data[0]時(shí)有誤; 長(zhǎng)
度在數(shù)據(jù)中的位置,要查看MT_UartProcessZAppData
的說(shuō)明,如果長(zhǎng)度不對(duì),會(huì)多出很多亂碼
for(i=0;i //這里不能加“=”號(hào),否則數(shù)據(jù)一長(zhǎng),數(shù)據(jù)會(huì)多出一位! HalUARTWrite(0,&pkt->cmd.Data[i+2],1);
//這里也很重要,之前是pkt->cmd.Data[i+1],數(shù)據(jù)的起始
位!?。?/p>
HalUARTWrite(0, "\n", 1);
if((pkt->cmd.Data[2]==′o′)&&(pkt->cmd.Data[3]==′n′)&&(pkt->cmd.Data[4]==′0′)) //建立單播命令
{flag=1;}
else if((pkt->cmd.Data[2]==′o′)&&(pkt->cmd.Data[3]==
′f′)&&(pkt->cmd.Data[4]==′f′)
&& (pkt->cmd.Data[5]==′0′)) //拆除單播命令
{flag=0;}
else if((pkt->cmd.Data[2]==′s′)&&(pkt->cmd.Data[3]==′l′)&&(pkt->cmd.Data[4]==′p′))
//休眠命令
{
osal_start_timerEx(SampleApp_TaskID, SAMPLEAPP_SEND_PERIODIC_MSG_EVT,SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT); //注冊(cè)下次喚醒事件
NLME_SetPollRate(0); //輪詢清零
sleep_cmd=1; //休眠標(biāo)志位置1
}
break;
至此整個(gè)和串口透?jìng)飨嚓P(guān)的函數(shù)均已添加完畢。
3.2 串口透?jìng)鲗?shí)驗(yàn)
透?jìng)鲗?shí)驗(yàn)的原理圖如圖5所示。
將協(xié)調(diào)器通過(guò)串口與PC機(jī)相連,打開(kāi)SSCOM串口助手,將串口助手設(shè)置為波特率為115 200 b/s、8位、無(wú)奇偶校驗(yàn)、無(wú)硬件流模式;再將終端按照同樣的方法和設(shè)置與PC機(jī)相連,上電后終端LED長(zhǎng)亮表示入網(wǎng)成功,此時(shí)協(xié)調(diào)器發(fā)送“on0”作為啟動(dòng)命令,終端再發(fā)送10個(gè)a到10個(gè)h作為80個(gè)字節(jié),看協(xié)調(diào)器的接收情況。
串口測(cè)試結(jié)果如圖6所示。圖6左側(cè)是協(xié)調(diào)器串口圖,右側(cè)是終端串口圖。
測(cè)試結(jié)果:根據(jù)ZigBee協(xié)議棧官方資料的查閱,通過(guò)多次對(duì)發(fā)送數(shù)據(jù)包字節(jié)個(gè)數(shù)的調(diào)整,以及對(duì)SSCOM串口助手定時(shí)發(fā)送時(shí)間的更改,得出串口透?jìng)饕粋€(gè)數(shù)據(jù)包最大為83 B,每個(gè)數(shù)據(jù)包之間的時(shí)間間隔不能少于33 ms才不會(huì)產(chǎn)生丟包現(xiàn)象。因此,建議一個(gè)數(shù)據(jù)包為80 B,一秒內(nèi)傳輸?shù)臄?shù)據(jù)包個(gè)數(shù)不要超過(guò)30個(gè)。
4 結(jié) 語(yǔ)
本設(shè)計(jì)主要是在德州儀器(TI)公司提供的半開(kāi)源ZigBee協(xié)議棧Z?Stack程序基礎(chǔ)上,通過(guò)CC2530開(kāi)發(fā)板實(shí)現(xiàn)終端低功耗串口透明傳輸以及數(shù)據(jù)的采集。因?yàn)閆igBee技術(shù)是一種近距離、低復(fù)雜度、低功耗、低速率、低成本的雙向無(wú)線通信技術(shù)。主要用于距離短、功耗低且傳輸速率不高的各種電子設(shè)備之間進(jìn)行數(shù)據(jù)傳輸以及典型的有周期性數(shù)據(jù)、間歇性數(shù)據(jù)和低反應(yīng)時(shí)間數(shù)據(jù)傳輸?shù)膽?yīng)用。所以本設(shè)計(jì)避免了復(fù)雜的通信協(xié)議,網(wǎng)絡(luò)組建方便、快速,采用無(wú)線傳輸方式,受地理環(huán)境約束小,低功耗,適合長(zhǎng)期野外使用。
參考文獻(xiàn)
[1] 劉彥飛,王成,余成波,等.基于ZigBee的數(shù)據(jù)透明傳輸系統(tǒng)的設(shè)計(jì)[J].計(jì)算機(jī)科學(xué),2009,26(4A):76?78.
[2] 王小強(qiáng),歐陽(yáng)駿,黃寧淋.ZigBee無(wú)線傳感器網(wǎng)絡(luò)設(shè)計(jì)與實(shí)現(xiàn)[M].北京:化學(xué)工業(yè)出版社,2012.
[3] 歐杰峰.基于IEEE 802.15.4的無(wú)線傳感器網(wǎng)絡(luò)組網(wǎng)研究[D].杭州:浙江大學(xué),2006.
[4] 任志健,王鳳,邱澤敏,等.基于物聯(lián)網(wǎng)的透明傳輸移動(dòng)環(huán)境勘探節(jié)點(diǎn)設(shè)計(jì)[J].實(shí)驗(yàn)室研究與探索,2013(6):103?108.
[5] 唐思超.嵌入式系統(tǒng)軟件設(shè)計(jì)實(shí)戰(zhàn):基于IAR Embedded Workbench [M].北京:北京航空航天大學(xué)出版社,2010.
[6] 張少軍.無(wú)線傳感器網(wǎng)絡(luò)技術(shù)及應(yīng)用[M].北京:中國(guó)電力出版社,2010.
[7] 賢武.傳感器原理與應(yīng)用[M].成都:電子科技大學(xué)出版社,1999.
[8] 姚仲歡.無(wú)線傳感器網(wǎng)絡(luò)中基于網(wǎng)絡(luò)拓?fù)渑c路由的節(jié)能技術(shù)研究[D].南寧:廣西大學(xué),2008.
[9] 任秀麗,于海斌.ZigBee無(wú)線通信協(xié)議實(shí)現(xiàn)技術(shù)的研究[J].計(jì)算機(jī)工程與應(yīng)用,2007(6):143?145.
[10] 孫戈.短距離無(wú)線通信及組網(wǎng)技術(shù)[M].西安:西安電子科技大學(xué)出版社,2006.