基于物聯(lián)網(wǎng)的燈光控制系統(tǒng)-組網(wǎng)設(shè)計_第1頁
基于物聯(lián)網(wǎng)的燈光控制系統(tǒng)-組網(wǎng)設(shè)計_第2頁
基于物聯(lián)網(wǎng)的燈光控制系統(tǒng)-組網(wǎng)設(shè)計_第3頁
基于物聯(lián)網(wǎng)的燈光控制系統(tǒng)-組網(wǎng)設(shè)計_第4頁
基于物聯(lián)網(wǎng)的燈光控制系統(tǒng)-組網(wǎng)設(shè)計_第5頁
已閱讀5頁,還剩34頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

畢業(yè)設(shè)計說明書設(shè)計題目:基于物聯(lián)網(wǎng)的燈光控制系統(tǒng) 組網(wǎng)設(shè)計業(yè)級號名師教導(dǎo)專班學(xué)姓指業(yè)級號名師教導(dǎo)專班學(xué)姓指物聯(lián)網(wǎng)XX二O一四年十二月二十日

設(shè)計內(nèi)容:課題簡介:以道惟爾公司CC2430無線傳感器節(jié)點和光照傳感器模塊為載體,基于IAR和VS2010開發(fā)環(huán)境,設(shè)計一個燈光控制系統(tǒng),實現(xiàn)對道路燈光亮滅進行控制,并接受上位機監(jiān)控命令。主要任務(wù):(1)傳輸層WSN組網(wǎng)程序與透明傳輸層程序開發(fā);(2)撰寫設(shè)計報告。主要技術(shù)要求如下:(1)采用模塊化設(shè)計思想規(guī)劃各子程序功能;(2)無線傳感器網(wǎng)絡(luò)通訊的基本數(shù)據(jù)幀格式為:幀頭、父節(jié)點地址、源節(jié)點地址、數(shù)據(jù)長度、數(shù)據(jù)、幀尾。(3)CC2430協(xié)調(diào)器與PC串口通訊的基本數(shù)據(jù)幀格式為:幀頭、功能碼、數(shù)據(jù)長度、數(shù)據(jù)、幀尾;(4)傳輸層應(yīng)實現(xiàn)透明傳輸。進度安排:.任務(wù)分解,收集有關(guān)資料并消化吸收2周;.制定設(shè)計方案 1周;.軟件設(shè)計 6周;.撰寫設(shè)計報告 2周;.準(zhǔn)備畢業(yè)答辯。主要參考文獻、資料(寫清楚參考文獻名稱、作者、出版單位):[1]陳林是.無線傳感器網(wǎng)絡(luò)技術(shù)與應(yīng)用.電子工業(yè)出版社,2009[2]高守瑋,吳燦陽.ZigBee技術(shù)實踐教程.北京航空航天大學(xué)出版社,2009[3]李文件,段如玉.ZigBee無線網(wǎng)絡(luò)技術(shù)入門與實戰(zhàn).北京航空航天大學(xué)出版社,2007[4]金純,羅祖秋,羅氏,陳前試.218860技術(shù)基礎(chǔ)及案例分析.國防工業(yè)出版社,2008[5]黃嘉輝.C#.NET網(wǎng)絡(luò)程序設(shè)計.科學(xué)出版社,2004[6]厲小軍.信息技術(shù)基礎(chǔ).浙江大學(xué)出版社,2005[7——CC2430設(shè)計、開發(fā)與實踐.國防工業(yè)出版社,2010審批意見教研室負責(zé)人:年月日#頁第4章WSN無線網(wǎng)絡(luò)軟件開發(fā)與測試本設(shè)計中,應(yīng)實現(xiàn)路燈協(xié)調(diào)器與PC之間的無線通訊。ZigBee無線傳感器網(wǎng)絡(luò)軟件主要功能是將協(xié)調(diào)器上傳的數(shù)據(jù)進行處理并上傳到PC,再將PC下發(fā)的數(shù)據(jù)傳到路燈。本任務(wù)將依據(jù)任務(wù)二中所分析出來的通信協(xié)議,進行無線傳感網(wǎng)的軟件開發(fā),通過本任務(wù)的學(xué)習(xí),可以達到以下目標(biāo):.能結(jié)合實際,描述ZigBee協(xié)議棧的任務(wù)調(diào)度流程。.能根據(jù)規(guī)劃的通訊協(xié)議,編程實現(xiàn)所需功能。4.1無線傳感器網(wǎng)絡(luò)(WSN)簡介4.1.1無線傳感器網(wǎng)絡(luò)概念WSN是wirelesssensornetwork的簡稱,即無線傳感器網(wǎng)絡(luò)。無線傳感器網(wǎng)絡(luò)(WirelessSensorNetwork,WSN)就是由部署在監(jiān)測區(qū)域內(nèi)大量的廉價微型傳感器節(jié)點組成,通過無線通信方式形成的一個多跳的自組織的網(wǎng)絡(luò)系統(tǒng),其目的是實時監(jiān)測、感知、采集和處理網(wǎng)絡(luò)覆蓋區(qū)域中被感知對象的信息,并發(fā)送給觀察者。傳感器、感知對象和觀察者構(gòu)成了無線傳感器網(wǎng)絡(luò)的三個要素。4數(shù)據(jù)結(jié)構(gòu)設(shè)計(1)串口發(fā)送數(shù)據(jù)結(jié)構(gòu)設(shè)計根據(jù)所制定的串口通訊協(xié)議,首先定義串口發(fā)送數(shù)據(jù)結(jié)構(gòu)體如下:typedefstruct{uint8Head[4]〃幀頭uint8func[3];〃幀類型uint8len[1]//幀長度uint8phyaddr[8];//物理地址uint16netaddr[2];〃網(wǎng)絡(luò)地址uint8dat[7];〃數(shù)據(jù)int8Tail[3];〃幀尾}UartSendBuf;同時,為了操作方便,定義了一個數(shù)組,指向結(jié)構(gòu)體typedef$仃口5,二者構(gòu)成一個串口發(fā)送數(shù)據(jù)緩沖區(qū)共用體。其代碼如下:Typedefuniontpedefunion{uint8RfSendBuf.DatArr[27];UartRfStructuartRfStructBuff;}RfUartDataUnion收發(fā)數(shù)據(jù)緩沖區(qū)變量定義externRfUartDataUnionUartReceBuf;〃串口接收緩沖區(qū)(用于MT層)RfUartDataUnionUartSendBuf;〃串口發(fā)送緩沖區(qū)RfUartDataUnionRfSendBuf;//射頻發(fā)送緩沖區(qū)RfUartDataUnionRfReceBuf;//射頻接收緩沖區(qū)4.2基于2-5七2。女協(xié)議棧應(yīng)用程序的開發(fā)網(wǎng)絡(luò)拓撲選擇本系統(tǒng)的無線網(wǎng)絡(luò)基于Z-Stack協(xié)議棧完成,由于監(jiān)測點不多、分布范圍較窄,故采用星形網(wǎng)絡(luò)拓撲結(jié)構(gòu)。Z-Stack無線網(wǎng)絡(luò)運行的基本流程為了方便任務(wù)管理,ZigBee2006協(xié)議棧協(xié)議棧定義了OSAL層(OperationSstemAbstractionLaer,操作系統(tǒng)抽象層。OSAL完全構(gòu)建在應(yīng)用層上,主要是采用了輪詢的概念,并且引入了優(yōu)先級。它的主要作用是隔離Z-Stack協(xié)議棧和特定硬件系統(tǒng),用戶無須過多了解具體平臺的底層,就可以利用操作系統(tǒng)抽象層提供的豐富工具實現(xiàn)各種功能,包括任務(wù)注冊、初始化和啟動,同步任務(wù),多任務(wù)間的消息傳遞,中斷處理,定時器控制,內(nèi)存定位等。圖3.1表示的是Z-Stack的啟動流程和OSAL所處的位置。OSAL中判斷事件發(fā)生是通過tasksEvents[id在務(wù)事件數(shù)組來進行的[28][29]。在OSAL初始化的時候,tasksEvents口數(shù)組被初始化為零,一旦系統(tǒng)中有事件發(fā)生,就用osal_set_event函數(shù)把tasksEvents[taskID賦值為對應(yīng)的事件。不同的任務(wù)有不同的taskID,這樣任務(wù)事件數(shù)組tasksEvents中就表示了系統(tǒng)中哪些任務(wù)存在沒有處理的事件Z-Stack的啟動流程和OSAL所處位置流程圖如圖4-1所示:

圖4-1ZigBee2007Pro協(xié)議棧OSAL流程圖然后就會調(diào)用各任務(wù)處理對應(yīng)的事件,任務(wù)是OSAL中很重要的概念。任務(wù)通過函數(shù)指針來調(diào)用,參數(shù)有兩個:任務(wù)標(biāo)識符(taskID)和對應(yīng)的事件(event)。Z-Stack中就已經(jīng)有7種默認的任務(wù)了,它們存儲在taskArr這個函數(shù)指針數(shù)組中。定義如下:constpTaskEventHandlerFntasksArr口={macEventLoop,nwk_event_loop,Hal_ProcessEvent,#ifdefined(MT_TASK)MT_ProcessEvent,#endifAPS_event_loop,ZDApp_event_loop,Water_Monitor_ProcessEvent};從7個事件的名字就可以看出,每個默認的任務(wù)對應(yīng)著的是協(xié)議的層次。從上到下則反映出了任務(wù)的優(yōu)先級,如MAC事件處理macEventLoop的優(yōu)先級高于網(wǎng)路層事件處理nwk_event_loop。系統(tǒng)是按照死循環(huán)形式工作的,模擬了通常的多任務(wù)操作系統(tǒng),把CPU分成N個時間片,在高速的頻率下感覺就是同時運行多個任務(wù)了。4.3基于ZigBee2006的無線傳感網(wǎng)組網(wǎng)編程ZigBee無線網(wǎng)絡(luò)的工作過程如圖3.2所示。首先由協(xié)調(diào)器建立網(wǎng)絡(luò),然后路由器和終端節(jié)點發(fā)現(xiàn)網(wǎng)絡(luò),并在加入網(wǎng)絡(luò)后主動向協(xié)調(diào)器上報網(wǎng)絡(luò)參數(shù),然后轉(zhuǎn)入等候命令狀態(tài)。協(xié)調(diào)器在收到路由器和終端節(jié)點的入網(wǎng)信息后,通過ZigBee-ARM網(wǎng)關(guān)上報到應(yīng)用層子系統(tǒng)的服務(wù)器中,然后轉(zhuǎn)入等候命令狀態(tài)。若網(wǎng)關(guān)收到來自通信服務(wù)器的socket命令,經(jīng)解析后通過串口送往ZigBee協(xié)調(diào)器,再下發(fā)到終端節(jié)點4ZigBee無線網(wǎng)絡(luò)的工作過程流程圖ZigBee無線網(wǎng)絡(luò)的工作過程流程圖如圖4-2所示:圖4-2ZigBee無線網(wǎng)絡(luò)的工作過程流程圖協(xié)調(diào)器在收到路由器和終端節(jié)點的入網(wǎng)信息后,通過ZigBee_AMR網(wǎng)關(guān)上報到應(yīng)用層子系統(tǒng)的服務(wù)器中,然后轉(zhuǎn)入等候命令狀態(tài)。若網(wǎng)關(guān)收到來自服務(wù)器的socket命令,經(jīng)解析后通過串口送往ZigBee協(xié)調(diào)器,在下發(fā)到終端節(jié)點。4函數(shù)調(diào)用類任務(wù).射頻發(fā)送數(shù)據(jù)封裝函數(shù)的(RfSendDataFrame)使用方法。(1)函數(shù)功能及參數(shù)聲明如下//函數(shù)功能:射頻發(fā)送數(shù)據(jù)封裝函數(shù)〃參數(shù)說明:uint8*func 〃幀類型,3B// uint8*phyaddr〃源節(jié)點物理地址,8B// uint16netaddr 〃源節(jié)點網(wǎng)絡(luò)地址,2B// uuint8*dat 〃數(shù)據(jù)包,7BvoidRfSendDataFrame(uint8*func,uint8*phyaddr,uint16netaddr,uint8*dat);(形參列表:定義形式)(2)如果已經(jīng)有了功能碼(func)、物理地址(phyaddr)、網(wǎng)絡(luò)地址(netaddr)、數(shù)據(jù)(dat),定義如下:uint8func[3];〃幀類型uint8phyaddr;〃物理地址uint16netaddr;〃網(wǎng)絡(luò)地址uint8dat[7]; 〃數(shù)據(jù)(3)首先將幀類型設(shè)置為"JNS”(注冊網(wǎng)絡(luò)),物理地址和網(wǎng)絡(luò)地址為自動提取源節(jié)點的物理地址和網(wǎng)絡(luò)地址,按協(xié)議裝數(shù)據(jù)包,然后再封裝為射頻發(fā)送數(shù)據(jù),實現(xiàn)代碼如下。uint8func[3];〃幀類型uint8*phyaddr;//物理地址uint16netaddr;〃網(wǎng)絡(luò)地址uint8dat[7]; //數(shù)據(jù)//裝幀頭func[0]=’J';func[1]=‘N';func[2]=’S';〃裝物理地址uint8*ieeeAddr;ieeeAddr=NLME_GetExtAddr();uint8i;for(i=0;i<7;i++){phyaddr[i]=*(uint8*)(ieeeAddr+i);}〃裝網(wǎng)絡(luò)地址netaddr=NLME_GetShortAddr();〃裝數(shù)據(jù)包:節(jié)點類型(38)、父節(jié)點網(wǎng)絡(luò)地址(2B)、參數(shù)(2B)dat[0]=‘R';dat[1]=‘F';dat[2]=‘D';fatheraddr=NLME_GetCoordShortAddr();dat[3]=HI_UINT16(fatheraddr);dat[4]=LO_UINT16(fatheraddr);dat[5]=0;dat[6]=0;RfSendDataFrame(func,phyaddr,netaddr,dat);(1)再將幀類型設(shè)置為“CPA”(下發(fā)控制指令),物理地址和網(wǎng)絡(luò)地址為自動提取源節(jié)點的物理地址和網(wǎng)絡(luò)地址按協(xié)議裝數(shù)據(jù)包,然后再封裝為射頻發(fā)送數(shù)據(jù),實現(xiàn)代碼如下。uint8func[3];〃幀類型uint8phyaddr;〃物理地址uint16netaddr;//網(wǎng)絡(luò)地址uint8dat[7]; //數(shù)據(jù)//裝幀頭func[0]=’C';func[1]=‘P';func[2]=‘A';〃裝物理地址uint8*ieeeAddr;ieeeAddr=NLME_GetExtAddr();uint8i;for(i=0;i<7;i++){phyaddr[i]=*(uint8*)(ieeeAddr+i);}〃裝網(wǎng)絡(luò)地址netaddr=NLME_GetShortAddr();〃裝數(shù)據(jù)包42電]=11001111;//別墅燈dat[1]=‘O’;dat[2]=‘N’;dat[3]=0;dat[4]=0;dat[5]=0;dat[6]=0;RfSendDataFrame(func,phyaddr,netaddr,dat);(2)將幀類型設(shè)置為“RNP”(下發(fā)獲取網(wǎng)絡(luò)參數(shù)指令),物理地址和網(wǎng)絡(luò)地址為自動提取源節(jié)點的物理地址和網(wǎng)絡(luò)地址按協(xié)議裝數(shù)據(jù)包,然后再封裝為射頻發(fā)送數(shù)據(jù)實現(xiàn)代碼如下。uint8func[3]; 〃幀類型uint8*phyaddr;//物理地址uint16netaddr;〃網(wǎng)絡(luò)地址uint8dat[7]; 〃數(shù)據(jù)〃裝幀頭func[0]=‘R';func[1]=‘N';func[2]=‘P';〃裝物理地址uint8*ieeeAddr;ieeeAddr=NLME_GetExtAddr();uint8i;for(i=0;i<7;i++){phyaddr[i]=*(uint8*)(ieeeAddr+i);}〃裝網(wǎng)絡(luò)地址netaddr=NLME_GetShortAddr();〃裝數(shù)據(jù)包dat[0]=0;dat[1]=0;dat[2]=0;dat[3]=0;dat[4]=0;dat[5]=0;dat[6]=0;RfSendDataFrame(func,phyaddr,netaddr,dat);4WSN點對點發(fā)送數(shù)據(jù)函數(shù)WSN點對點發(fā)送數(shù)據(jù)函數(shù)的(RfSendDataFuncP2P)使用方法。//(1)幀類型func[0]='S';func[1]='P';func[2]='S';//(2)封裝物理地址:8字節(jié)phyaddr=NLME_GetExtAddr();//(3)封裝網(wǎng)絡(luò)地址:2字節(jié)netaddr=NLME_GetShortAddr();//(4)數(shù)據(jù)包fatheraddr=NLME_GetCoordShortAddr();dat[0]=LO_UINT16(fatheraddr);dat[1]=HI_UINT16(fatheraddr);if(SampleApp_NwkState==DEV_ROUTER)〃路由器節(jié)點{dat[2]='R';dat[3]='O';dat[4]='U';}elseif(SampleApp_NwkState==DEV_END_DEVICE)//終端節(jié)點{dat[2]='R';dat[3]='F';dat[4]='D';}//(5)調(diào)用函數(shù),封裝數(shù)據(jù)RfSendDataFrame(func,phyaddr,netaddr,dat);〃第二步:上傳數(shù)據(jù):將RfSendBuf的數(shù)據(jù)發(fā)送到協(xié)調(diào)器RfSendDataFuncP2P(0x0000,SAMPLEAPP_ONLINE_CLUSTERID,RfSendBuf.DatArr,29);//第三步:重啟SAMPLEAPP_OnLine_MSG_EVT事osal_start_timerEx(SampleApp_TaskID,SAMPLEAPP_OnLine_MSG_EVT,SampleApp_OnLine_MSG_TIMEOUT);}#endif〃第四步:從消息隊列中刪除return(eventsASAMPLEAPP_OnLine_MSG_EVT);return0;}4.3.4協(xié)調(diào)器把從串口接受的PC數(shù)據(jù)轉(zhuǎn)發(fā)給下級節(jié)點函數(shù)協(xié)調(diào)器收到PC的串口數(shù)據(jù)后,將數(shù)據(jù)轉(zhuǎn)發(fā)到WSN的函數(shù)(UartRxComCallBack)使用方法。#ifdefSCITC_Coordinatormemset(UartSendBuf.DatArr,0,27);if(pkt->cmd.DataLength<=27){〃復(fù)制數(shù)據(jù)到串口發(fā)送變量memcpy(UartSendBuf.DatArr,pkt->cmd.Data,pkt->cmd.DataLength);〃修改幀頭UartSendBuf.DatStr.Head[0]='&';UartSendBuf.DatStr.Head[1]='W';UartSendBuf.DatStr.Head[2]=T;UartSendBuf.DatStr.Head[3]='N';}switch(pkt->clusterId){caseSAMPLEAPP_JOIN_NWK_CLUSTERID:{HalUARTWrite(HAL_UART_PORT_0UartSendBuf.DatArr,27);break;}caseSAMPLEAPP_ONLINE_CLUSTERID:〃周期性上傳的入網(wǎng)消息簇{,,break;}caseSAMPLEAPP_DATAMSG_CLUSTERID:〃如果上傳的實時數(shù)據(jù){HalUARTWrite(HAL_UART_PORT_0,UartSendBuf.DatArr,;break;}default:break;}#endif串口業(yè)務(wù)邏輯設(shè)計程序流程圖如圖4-3所示。開皚AFPFERKXMCCLt^^EUD?.----=.— — —--一. * _者提Ml頭,幀長,幀尾YVj(到n數(shù)寵?二>— 4返e?¥?提取幀委塞Yes Yes Yes返回] (返回圖4-3串口業(yè)務(wù)邏輯設(shè)計程序流程圖第5章Server服務(wù)端軟件開發(fā)與測試PC展示層軟件用于實時接收ZigBee無限傳感器網(wǎng)絡(luò)上報的各交通路燈的亮滅狀態(tài),在本展示層軟件中,主要分為窗體表示層、業(yè)務(wù)邏輯層、數(shù)據(jù)訪問層。5.1三層架構(gòu)程序設(shè)計簡介在三層架構(gòu)設(shè)計中,數(shù)據(jù)訪問層一般用于對數(shù)據(jù)庫進行各項操作,即實現(xiàn)對數(shù)據(jù)表的Select、Insert、Update.Delete操作。本項目不涉及數(shù)據(jù)庫的操作,因此數(shù)據(jù)訪問層的功能主要是完成串口的操作,包括獲取可用串口、打開串口、關(guān)閉串口、通過串口收發(fā)數(shù)據(jù)等。2.業(yè)務(wù)邏輯層業(yè)務(wù)邏輯層是三層架構(gòu)設(shè)計中體現(xiàn)核心價值的部分,主要負責(zé)業(yè)務(wù)規(guī)劃的制定、業(yè)務(wù)流程的實現(xiàn)。表示層位于離用戶最近的最上層,用于顯示數(shù)據(jù)和接收用戶輸入的數(shù)據(jù),為用戶提供一種交互式操作的界面。三層架構(gòu)設(shè)計方框圖如圖5-1所示:圖5-1三層架構(gòu)設(shè)計方

5.2CC2430終端節(jié)點對燈組的控制I/O口的分配關(guān)系各區(qū)域燈光控制分配端口如下表5-1所示:表5-1區(qū)域燈光控制星光大道0803星光大道南側(cè)奇數(shù)燈0xFB0804星光大道北側(cè)偶數(shù)燈0x6D星光大道北側(cè)奇數(shù)燈星光大道南側(cè)奇數(shù)燈太陽路0803太陽路偶數(shù)燈0xED太陽路奇數(shù)燈濱河路0803濱河路奇數(shù)燈0xF70804濱河路偶數(shù)燈0xDF月亮路0804月亮路0xFB水星路0803水星路奇數(shù)燈0xBE水星路偶數(shù)燈銀河大道0803銀河大道南側(cè)偶數(shù)燈0x5F銀河大道北側(cè)偶數(shù)燈0804銀河大道南側(cè)奇數(shù)燈0xB7銀河大道北側(cè)奇數(shù)燈這次畢業(yè)設(shè)計我們做的是基于物聯(lián)網(wǎng)燈光控制系統(tǒng)的項目。我們項目組共有3位成員,大家各自負責(zé)項目的一部分,我主要做的是項目中的CC2430無線傳感器網(wǎng)絡(luò)層軟件設(shè)計。由于這一塊在本次設(shè)計中有承上啟下的作用,如果處理不當(dāng)就會在實際調(diào)試中造成系統(tǒng)無法運行。通過與指導(dǎo)老師的交流和小組的共同努力我們一一解決了相應(yīng)的問題。通過這次畢業(yè)設(shè)計我也發(fā)現(xiàn)自己專業(yè)基礎(chǔ)知識的不足之處。比如缺乏綜合應(yīng)用專業(yè)知識的能力,對具體規(guī)范要求的不熟悉和對知識點的模糊,需要在做的過程中不斷的去總結(jié)和查閱相關(guān)資料,在這個過程是對自己知識的不足之處的一個補充和鞏固。這次畢業(yè)設(shè)計是對自己大學(xué)三年所學(xué)的一次大檢閱,雖然馬上要畢業(yè)了,但是自己的求學(xué)之路還很長,以后更應(yīng)該在工作中學(xué)習(xí),不斷鍛煉和提高自己的能力。在畢業(yè)設(shè)計期間,如果沒有老師細心的指導(dǎo),組員的幫助,而是自己一個人獨自做設(shè)計,不與任何人交流,這是完全不行的,設(shè)計就是一個團隊的工作,如果不能與他人進行良好的溝通與交流,那將會使自己困難重重。所以在本次畢業(yè)設(shè)計過程中,我懂得了一個道理,團結(jié)得力量,只有更好得與他人進行溝通與交流,吸取他人的建議,工作才會更加的順利。在論文即將完成之際,我的心情無法平靜,從開始進入課題到論文的順利完成,這些日子里,有多少可敬的師長、同學(xué)、朋友給了我無言的幫助,在這里請接受我誠摯的謝意!參考文獻[1]陳林是.無線傳感器網(wǎng)絡(luò)技術(shù)與應(yīng)用.電子工業(yè)出版社,2009[2]高守瑋,吳燦陽.ZigBee技術(shù)實踐教程.北京航空航天大學(xué)出版社,2009[3]李文件,段如玉.ZigBee無線網(wǎng)絡(luò)技術(shù)入門與實戰(zhàn).北京航空航天大2007[4]金純,羅祖秋,羅氏,陳前試.ZigBee技術(shù)基礎(chǔ)及案例分析.國防工業(yè)出版2008[5]郭淵博,楊魁武,趙儉.ZigBee技術(shù)與應(yīng)用——CC2430設(shè)計、開發(fā)與實踐.國防工業(yè)出版社,2010[6]黃嘉輝.C#.NET網(wǎng)絡(luò)程序設(shè)計.科學(xué)出版社,2004厲小軍.信息技術(shù)基礎(chǔ).浙江大學(xué)出版社,2005孫利民,李建中,李偷朱,紅松.無線傳感器網(wǎng)絡(luò).清華大學(xué)出版社,2005[9]戴佳,戴衛(wèi).51單片機C語言應(yīng)用程序設(shè)計實例精講.電子工業(yè)出版社,2006宗小翀,,2009,2003附錄一#include"OSAL.h"#include"ZGlobals.h"#include"AF.h"#include"aps_groups.h"#include"ZDApp.h"#include"SampleApp.h"#include"SampleAppHw.h"#include"OnBoard.h"#include"string.h"#include"MT_UART.h"#include"HAL_ADC.h"http://包含自定義頭文件#include"RfUartDataStruct.h"http://定義消息簇constcId_tSampleApp_ClusterList[SAMPLEAPP_MAX_CLUSTERS]={SAMPLEAPP_FLASH_CLUSTERID,SAMPLEAPP_JOIN_NWK_CLUSTERID,SAMPLEAPP_ONLINE_CLUSTERID,SAMPLEAPP_DATAMSG_CLUSTERID};//定義終節(jié)點描述constSimpleDescriptionFormat_tSampleApp_SimpleDesc={SAMPLEAPP_ENDPOINT,SAMPLEAPP_PROFID,SAMPLEAPP_DEVICEID,SAMPLEAPP_DEVICE_VERSION,SAMPLEAPP_FLAGS,SAMPLEAPP_MAX_CLUSTERS,(cId_t*)SampleApp_ClusterList,SAMPLEAPP_MAX_CLUSTERS,(cId_t*)SampleApp_ClusterList};endPointDesc_tSampleApp_epDesc;//定義有關(guān)變量uint8uint8uint16uint8SampleApp_TaskID;uint8uint8uint16uint8devStates_tSampleApp_NwkState;SampleApp_TransID;SAMPLEAPP_MSG_TIMEOUT_Count=0;//周期性上傳網(wǎng)絡(luò)參數(shù)信息*ieeeAddr;//物理地址externRfUartDataUnion UartReceBuf;//串口接收緩沖區(qū)(用于MT層)RfUartDataUnionUartSendBuf;//串口發(fā)送緩沖區(qū)RfUartDataUnionRfSendBuf;//射頻發(fā)送緩沖區(qū)RfUartDataUnionRfReceBuf;//射頻接收緩沖區(qū)//函數(shù)聲明externvoidRfSendDataFrame(uint8*func,uint8*phyaddr,uint16netaddr,uint8*dat);externuint8CharCmp(uint8*ptr1,uint8*ptr2,uint8len);externuint8RfSendDataFuncP2P(uint16addr,uint8clusterid,uint8*buf,uint8Len);voidSampleApp_MessageMSGCB(afIncomingMSGPacket_t*pckt);uint8SendData(uint16addr,uint8*buf,uint8Leng);uint8SendData_Period(uint16addr,uint8*buf,uint8Leng);voidUartRxComCallBack(void);uint8CheckUartData(uint8*arr,uint8n);voidUartOutNetDis(void);uint8SendDataBroadcast(uint8*buf,uint8Leng);voidsampleApp_DataFrame(Union_DATA*Data);voidSampleApp_MessageMSGCB_Node(afIncomingMSGPacket_t*pkt);uint8Send_Join_In_NWK_Data(uint16addr,uint8*buf,uint8Leng);//公共函數(shù)一:節(jié)點初始化函數(shù)voidSampleApp_Init(uint8task_id){SampleApp_TaskID=task_id;SampleApp_NwkState=DEV_INIT;SampleApp_TransID=0;#ifdefined(HOLD_AUTO_START)ZDOInitDevice(0);#endifSampleApp_epDesc.endPoint=SAMPLEAPP_ENDPOINT;SampleApp_epDesc.task_id=&SampleApp_TaskID;=(SimpleDescriptionFormat_t*)&SampleApp_SimpleDesc;SampleApp_epDesc.latencyReq=noLatencyReqs;afRegister(&SampleApp_epDesc);//Registerforallkeyevents-ThisappwillhandleallkeyeventsRegisterForKeys(SampleApp_TaskID); //注冊按鍵MT_UartRegisterTaskID(SampleApp_TaskID);//注冊串口}//任務(wù)處理函數(shù)uint16SampleApp_ProcessEvent(uint8task_id,uint16events){afIncomingMSGPacket_t*MSGpkt; //定義射頻接收數(shù)據(jù)消息結(jié)構(gòu)體(void)task_id;//Intentionallyunreferencedparameter(故意未弓[用參數(shù))//系統(tǒng)事件處理入口if(events&SYS_EVENT_MSG){MSGpkt=(afIncomingMSGPacket_t*)osal_msg_receive(SampleApp_TaskID);while(MSGpkt){switch(MSGpkt->hdr.event){//處理射頻接收事件caseAF_INCOMING_MSG_CMD:{SampleApp_MessageMSGCB(MSGpkt);break;}//處理建立、發(fā)現(xiàn)、加入網(wǎng)絡(luò)事件caseZDO_STATE_CHANGE:{SampleApp_NwkState=(devStates_t)(MSGpkt->hdr.status);〃如果是協(xié)調(diào)器節(jié)點,則對GPRS進行初始化if((SampleApp_NwkState==DEV_ZB_COORD)){osal_start_timerEx(SampleApp_TaskID,SAMPLEAPP_RUN_EVT,SAMPLEAPP_RUN_TIMEOUT);//啟動超時定時器}//若是終端節(jié)點或者路由器節(jié)點,則轉(zhuǎn)入發(fā)現(xiàn)網(wǎng)絡(luò)和加入網(wǎng)絡(luò)事件elseif((SampleApp_NwkState==DEV_ROUTER)||(SampleApp_NwkState==DEV_END_DEVICE)){P0SEL&=0x00;〃配置P0口為通用I/O口P0DIR1=0xFF;〃配置P0口為輸出口P0=0x00;osal_start_timerEx(SampleApp_TaskID,SampleApp_JOIN_IN_NETWORK_EVT,SAMPLEAPP_MSG_TIMEOUT);}break;}//協(xié)調(diào)器處理串口接收時間caseSPI_INCOMING_ZTOOL_PORT:{#ifdefined(SCITC_Coordinator)UartRxComCallBack();//串口收到一帖數(shù)據(jù)的處理break;#endif}default:break;}osal_msg_deallocate((uint8*)MSGpkt);MSGpkt=(afIncomingMSGPacket_t*)osal_msg_receive(SampleApp_TaskID);}return(eventsASYS_EVENT_MSG);}return(eventsASampleApp_JOIN_IN_NETWORK_EVT);}//終端節(jié)點和路由器周期性上傳入網(wǎng)信息事件處理入口中刪除return(eventsASAMPLEAPP_OnLine_MSG_EVT);}return0;}voidSampleApp_MessageMSGCB(afIncomingMSGPacket_t*pkt){//自定義局部變量#ifdefined(SCITC_EndDevice)uint8func[3];uint8*phyaddr;uint16netaddr;uint8dat[5];uint16fatheraddr;uint8PhyAddrTemp[8]={0*00,0*00,0*00,0*00,0*00,0*00,0*00,0乂00};;//存放默認物理地址uint8NetAddrTemp[2]={0x00,0x00};//存放默認網(wǎng)絡(luò)地址(全0);uint8ret;uint8IsMyMsg=0x00;〃終端節(jié)點判斷是否為自己的RF消息標(biāo)識符#endif〃協(xié)調(diào)器節(jié)點:修改幀頭,轉(zhuǎn)發(fā)數(shù)據(jù)到PC#ifdefSCITC_Coordinatormemset(UartSendBuf.DatArr,0,27);if(pkt->cmd.DataLength<=27){//復(fù)制數(shù)據(jù)到串口發(fā)送變量memcpy(UartSendBuf.DatArr,pkt->cmd.Data,pkt->cmd.DataLength);//修改幀頭UartSendBuf.DatStr.Head[0]='&';UartSendBuf.DatStr.Head[1]='W';UartSendBuf.DatStr.Head[2]='T';UartSendBuf.DatStr.Head[3]='P';}switch(pkt->clusterId){caseSAMPLEAPP_JOIN_NWK_CLUSTERID://如果是加入網(wǎng)絡(luò)消息簇{HalUARTWrite(HAL_UART_PORT_0,UartSendBuf.DatArr,27);//從串口輸出break;}caseSAMPLEAPP_ONLINE_CLUSTERID://如果是周期性上傳的入網(wǎng)消息簇{HalUARTWrite(HAL_UART_PORT_0,UartSendBuf.DatArr,27);//從串口輸出break;}caseSAMPLEAPP_DATAMSG_CLUSTERID://如果是上傳的實時數(shù)據(jù){HalUARTWrite(HAL_UART_PORT_0,UartSendBuf.DatArr,27);//從串口輸出break;}default:break;}#endif//終端節(jié)點:執(zhí)行對交通燈的操作#ifdefined(SCITC_EndDevice)switch(pkt->clusterId){caseSAMPLEAPP_JOIN_NWK_CLUSTERID://如果是加入網(wǎng)絡(luò)消息簇{break;}caseSAMPLEAPP_ONLINE_CLUSTERID://如果是周期性上傳的入網(wǎng)消息簇{break;}caseSAMPLEAPP_DATAMSG_CLUSTERID://如果是上傳的實時數(shù)據(jù){if(pkt->cmd.DataLength<27)//不足一幀{break;}else//將RF接收的數(shù)據(jù)(pkt->cmd.Data)轉(zhuǎn)存到RfReceBufmemcpy(RfReceBuf.DatArr,(uint8*)pkt->cmd.Data,pkt->cmd.DataLength);if(RfReceBuf.DatStr.Head[0]=='&'&&RfReceBuf.DatStr.Head[1]=='W'&&RfReceBuf.DatStr.Head[2]=='S'&&RfReceBuf.DatStr.Head[3]=='N')//幀頭{if(RfReceBuf.DatStr.Tail[0]=='E'&&RfReceBuf.DatStr.Tail[1]=='N'&&RfReceBuf.DatStr.Tail[2]=='D')//幀尾{ret=CharCmp(PhyAddrTemp,RfReceBuf.DatStr.PhyAddr,8);if(ret==0){IsMyMsg=0xFF;//協(xié)調(diào)器以廣播模式下發(fā)數(shù)據(jù)}elseif((NetAddrTemp[0] n==RfReceBuf.DatStr.NetAddr[0])&&(NetAddrTemp[1]==RfReceBuf.DatStr.NetAddr[1])){IsMyMsg=0xFF;//協(xié)調(diào)器以廣播模式下發(fā)數(shù)據(jù)}if(IsMyMsg!=0xFF)//非廣播模式下,判斷是否是本節(jié)點該接收的數(shù)據(jù){phyaddr=NLME_GetExtAddr()

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論