




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
實驗三ZigBee協(xié)議實驗【實驗?zāi)康摹苛私鈀igBee2007協(xié)議棧操作系統(tǒng)的工作機制了解ZigBee2007協(xié)議棧應(yīng)用程序框架的工作機制了解ZigBee播送通信的原理掌握在ZigBee網(wǎng)絡(luò)中進行播送通信的方法了解ZigBee組播通信的原理掌握在ZigBee網(wǎng)絡(luò)中進行組播通信的方法【實驗設(shè)備】1、裝有IAR開發(fā)環(huán)境的PC機一臺2、物聯(lián)網(wǎng)開發(fā)設(shè)計平臺所配備的根底實驗套件一套3、下載器一個【實驗要求】1、播送通信實驗要求:在GenericApp應(yīng)用程序框架下,編寫程序,使得協(xié)調(diào)器周期性以播送的形式向終端節(jié)點發(fā)送數(shù)據(jù)“CoordBroadcast〞〔每隔5s播送一次〕,終端節(jié)點收到數(shù)據(jù)后,使開發(fā)板上的LED紅燈狀態(tài)翻轉(zhuǎn)(如果LED原來是亮,那么熄滅LED;如果LED原來是滅的,那么點亮LED),同時向協(xié)調(diào)器發(fā)送字符串“EndDevicereceived!〞,協(xié)調(diào)器收到終端節(jié)點發(fā)回的數(shù)據(jù)后,通過串口輸出到PC機,用戶可以通過串口調(diào)試助手查看該信息。設(shè)備:一個協(xié)調(diào)器,二個終端2、組播通信實驗要求:在GenericApp應(yīng)用程序框架下,編寫程序,使得協(xié)調(diào)器周期性的以組播的形式向路由器發(fā)送數(shù)據(jù)“Group1〞〔每隔5s發(fā)送組播數(shù)據(jù)一次〕,組內(nèi)的路由器收到數(shù)據(jù)后,使開發(fā)板上的紅色LED狀態(tài)翻轉(zhuǎn)(如果LED原來是亮,那么熄滅LED;如果LED原來是滅的,那么點亮LED),同時向協(xié)調(diào)器發(fā)送自己的網(wǎng)絡(luò)短地址和字符串“Routerreceived!〞,協(xié)調(diào)器收到路由器發(fā)回的數(shù)據(jù)后,通過串口輸出到PC機,用戶可以通過串口調(diào)試助手查看該信息。設(shè)備:一個協(xié)調(diào)器,三個路由器,其中兩個參加組,一個不參加組?!緦嶒炘怼?.無線數(shù)據(jù)傳輸模式:組播和播送〔1〕組播:主機之間“一對一組〞的通訊模式,也就是參加了同一個組的主機可以接受到此組內(nèi)的所有數(shù)據(jù),網(wǎng)絡(luò)中的交換機和路由器只向有需求者復(fù)制并轉(zhuǎn)發(fā)其所需數(shù)據(jù)。主機可以向路由器請求參加或退出某個組,網(wǎng)絡(luò)中的路由器和交換機有選擇的復(fù)制并傳輸數(shù)據(jù),即只將組內(nèi)數(shù)據(jù)傳輸給那些參加組的主機。這樣既能一次將數(shù)據(jù)傳輸給多個有需要〔參加組〕的主機,又能保證不影響其他不需要〔未參加組〕的主機的其他通訊。組播afAddrType_t的類型變量afAddrType_tGroup_DstAddr;組播內(nèi)容的結(jié)構(gòu)體:aps_Group_tWEBEE_Group;參加組播參數(shù)的配置:roup_DstAddr.addrMode=(afAddrMode_t)afAddrGroup;Group_DstAddr.endPoint=SAMPLEAPP_ENDPOINT;Group_DstAddr.addr.shortAddr=WEBEE_GROUP;組播:主機之間“一對所有〞的通訊模式,網(wǎng)絡(luò)對其中每一臺主機發(fā)出的信號都進行無條件復(fù)制并轉(zhuǎn)發(fā),所有主機都可以接收到所有信息〔不管你是否需要〕,由于其不用路徑選擇,所以其網(wǎng)絡(luò)本錢可以很低廉。有線電視網(wǎng)就是典型的播送型網(wǎng)絡(luò),我們的電視機實際上是接受到所有頻道的信號,但只將一個頻道的信號復(fù)原成畫面。在數(shù)據(jù)網(wǎng)絡(luò)中也允許播送的存在,但其被限制在二層交換機的局域網(wǎng)范圍內(nèi),禁止播送數(shù)據(jù)穿過路由器,防止播送數(shù)據(jù)影響大面積的主機。播送參數(shù)的配置,代碼如下:SampleApp_Periodic_DstAddr.addrMode=(afAddrMode_t)AddrBroadcast;SampleApp_Periodic_DstAddr.endPoint=SAMPLEAPP_ENDPOINT;SampleApp_Periodic_DstAddr.addr.shortAddr=0xFFFF;2.網(wǎng)絡(luò)管理網(wǎng)路管理主要包括兩個方面的內(nèi)容:〔1〕查詢本節(jié)點有關(guān)的地址信息查詢本節(jié)點的地址信息主要有以下幾個方面:查詢本節(jié)點的網(wǎng)絡(luò)地址,MAC地址,父節(jié)點的網(wǎng)絡(luò)地址以及父節(jié)點的MAC地址等內(nèi)容。當(dāng)然這些內(nèi)容不需要用戶去編寫,在Zigbee協(xié)議棧中已經(jīng)實現(xiàn)了上述功能的函數(shù),用戶只需要熟悉各個函數(shù)的使用方法即可。Zigbee協(xié)議棧實現(xiàn)的網(wǎng)絡(luò)管理函數(shù)如下:Uint16NLME-GetShortAddr(void)該函數(shù)返回該節(jié)點的網(wǎng)絡(luò)地址。bye*NLME-GetExtAddr(void)該函數(shù)返回指向該節(jié)點MAC地址的指針。Uint16NLME-GetCoordShortAddr(void)該函數(shù)返回父節(jié)點的網(wǎng)絡(luò)地址。voidNLME-GetCoordExtShortAddr(byte*buf)該函數(shù)的參數(shù)是指向存放父節(jié)點MAC地址的緩沖區(qū)指針?!?〕查詢網(wǎng)絡(luò)中的其他節(jié)點有關(guān)的地址信息查詢網(wǎng)路中其他節(jié)點有關(guān)的地址信息主要包括:節(jié)點的16位網(wǎng)絡(luò)地址查詢節(jié)點的IEEE地址;節(jié)點的IEEE地址查詢該節(jié)點的網(wǎng)絡(luò)地址?!境绦蛄鞒虉D及程序】開始建立網(wǎng)絡(luò)開始開始建立網(wǎng)絡(luò)開始參加網(wǎng)絡(luò)參加網(wǎng)絡(luò)N收到協(xié)調(diào)器發(fā)送的數(shù)據(jù)?播送發(fā)送數(shù)據(jù)N收到協(xié)調(diào)器發(fā)送的數(shù)據(jù)?播送發(fā)送數(shù)據(jù)Y收到節(jié)點返回的數(shù)據(jù)?NY收到節(jié)點返回的數(shù)據(jù)?將LED狀態(tài)取反Y2.0xFFFF是什么意思?將LED狀態(tài)取反Y2.0xFFFF是什么意思?向協(xié)調(diào)器發(fā)送數(shù)據(jù)串口發(fā)送向協(xié)調(diào)器發(fā)送數(shù)據(jù)串口發(fā)送播送通信實驗協(xié)調(diào)器程序流程圖播送通信實驗路由器程序流程圖#include"OSAL.h"#include"AF.h"#include"ZDApp.h"#include"ZDObject.h"#include"ZDProfile.h"#include<string.h>#include"Coordinator.h"#include"DebugTrace.h"#if!defined(WIN32)//????#include"OnBoard.h"#endif#include"hal_lcd.h"#include"hal_led.h"#include"hal_key.h"#include"hal_uart.h"#include"OSAL_Nv.h"http://使用NV操作函數(shù),必須包含該頭文件#defineSEND_TO_ALL_EVENT0x01//定義發(fā)送事件constcId_tGenericApp_ClusterList[GENERICAPP_MAX_CLUSTERS]={GENERICAPP_CLUSTERID};//簡單設(shè)備描述符〔描述一個ZigBee設(shè)備節(jié)點〕constSimpleDescriptionFormat_tGenericApp_SimpleDesc={GENERICAPP_ENDPOINT,GENERICAPP_PROFID,GENERICAPP_DEVICEID,GENERICAPP_DEVICE_VERSION,GENERICAPP_FLAGS,GENERICAPP_MAX_CLUSTERS,(cId_t*)GenericApp_ClusterList,0,(cId_t*)NULL};endPointDesc_tGenericApp_epDesc;//節(jié)點描述符devStates_tGenericApp_NwkState;//存儲網(wǎng)絡(luò)狀態(tài)的變量byteGenericApp_TaskID;//任務(wù)優(yōu)先級byteGenericApp_TransID;//數(shù)據(jù)發(fā)送序列號。unsignedcharuartbuf[128];//串口接收發(fā)送數(shù)據(jù)緩沖單元voidGenericApp_MessageMSGCB(afIncomingMSGPacket_t*pckt);//消息處理函數(shù)voidGenericApp_SendTheMessage(void);//數(shù)據(jù)發(fā)送函數(shù)//staticvoidrxCB(uint8port,uint8envent);//???????????voidGenericApp_Init(bytetask_id)//任務(wù)初始化函數(shù){GenericApp_TaskID=task_id;//初始化任務(wù)優(yōu)先級〔任務(wù)優(yōu)先級有協(xié)議棧的操作系統(tǒng)OSAL分配〕GenericApp_TransID=0;//發(fā)送數(shù)據(jù)包的序號初始化為0//對節(jié)點描述符進行初始化=GENERICAPP_ENDPOINT;=&GenericApp_TaskID;=(SimpleDescriptionFormat_t*)&GenericApp_SimpleDesc;=noLatencyReqs;afRegister(&GenericApp_epDesc);//afRegister()對節(jié)點的描述符進行注冊。注冊后,才能使用OSAL提供的系統(tǒng)效勞。halUARTCfg_tuartConfig;//該結(jié)構(gòu)體變量是實現(xiàn)串口的配置//串口的初始化=TRUE;=HAL_UART_BR_115200;//波特率=FALSE;//流控制//=rxCB;//填的是回調(diào)函數(shù),數(shù)的指針〔即函數(shù)的地址〕作為參數(shù)傳遞給另一個函數(shù),//其實callBackFunc是一個函數(shù)指針,它的定義為halUARTCBack_tcallBackFunc;//而halUARTCBack_t的定義為typedvoid(*halUARTCBack_t)(uint8port,uint8envent)定義的是一個函數(shù)指針=NULL;//本實驗沒有使用串口的回調(diào)函數(shù)HalUARTOpen(0,&uartConfig);//串口是否翻開}//消息處理函數(shù)UINT16GenericApp_ProcessEvent(bytetask_id,UINT16events){afIncomingMSGPacket_t*MSGpkt;//MSGpkt用于指向接收消息結(jié)構(gòu)體的指針if(events&SYS_EVENT_MSG){MSGpkt=(afIncomingMSGPacket_t*)osal_msg_receive(GenericApp_TaskID);//osal_msg_receive〔〕從消息隊列上接收消息while(MSGpkt){switch(MSGpkt->hdr.event){caseAF_INCOMING_MSG_CMD://接受到新數(shù)據(jù)的消息的ID是AF_INCOMING_MSG_CMD,這個宏是在協(xié)議棧中定義好的值為0x1A//接受到的是新數(shù)據(jù)事件HalLedBlink(HAL_LED_1,0,50,500);//LED2閃爍GenericApp_MessageMSGCB(MSGpkt);//功能是完成對接受數(shù)據(jù)的處理break;caseZDO_STATE_CHANGE://建立網(wǎng)絡(luò)后,設(shè)置事件GenericApp_NwkState=(devStates_t)(MSGpkt->hdr.status);if(GenericApp_NwkState==DEV_ZB_COORD)//把該節(jié)點已初始化為協(xié)調(diào)器,那么執(zhí)行下面的{HalLedBlink(HAL_LED_2,0,50,500);//LED2閃爍osal_start_timerEx(GenericApp_TaskID,SEND_TO_ALL_EVENT,5000);}break;default:break;}osal_msg_deallocate((uint8*)MSGpkt);//接收到的消息處理完后,釋放消息所占的存儲空間MSGpkt=(afIncomingMSGPacket_t*)osal_msg_receive(GenericApp_TaskID);//處理完一個消息后,再從消息隊列里接受消息,然后對其進行相應(yīng)處理,直到所有消息處理完}return(events^SYS_EVENT_MSG);}if(events&SEND_TO_ALL_EVENT)//數(shù)據(jù)發(fā)送事件處理代碼{GenericApp_SendTheMessage();//向終端節(jié)點發(fā)送數(shù)據(jù)函數(shù)osal_start_timerEx(GenericApp_TaskID,SEND_TO_ALL_EVENT,5000);return(events^SEND_TO_ALL_EVENT);}return0;}//協(xié)調(diào)器接受到終端節(jié)點發(fā)送來的數(shù)據(jù)時,調(diào)用下面這個函數(shù),然后把數(shù)據(jù)發(fā)送到PC串口調(diào)試助手voidGenericApp_MessageMSGCB(afIncomingMSGPacket_t*pkt){charbuf[20];unsignedcharbuffer[2]={0x0A,0x0D};switch(pkt->clusterId){caseGENERICAPP_CLUSTERID:osal_memcpy(buf,pkt->cmd.Data,20);HalUARTWrite(0,buf,20);HalUARTWrite(0,buffer,2);}}voidGenericApp_SendTheMessage(void){unsignedchar*theMessageData="Coordinatorsend!";afAddrType_tmy_DstAddr;my_DstAddr.addrMode=(afAddrMode_t)AddrBroadcast;my_DstAddr.endPoint=GENERICAPP_ENDPOINT;my_DstAddr.addr.shortAddr=0xFFFF;AF_DataRequest(&my_DstAddr,&GenericApp_epDesc,GENERICAPP_CLUSTERID,\osal_strlen(theMessageData)+1,theMessageData,\&GenericApp_TransID,AF_DISCV_ROUTE,AF_DEFAULT_RADIUS);}#include"OSAL.h"#include"AF.h"#include"ZDApp.h"#include"ZDObject.h"#include"ZDProfile.h"#include<string.h>#include"Coordinator.h"#include"DebugTrace.h"#if!defined(WIN32)#include"OnBoard.h"#endif#include"hal_lcd.h"#include"hal_led.h"#include"hal_key.h"#include"hal_uart.h"#include"Sensor.h"#defineSEND_DATA_EVENT0x01//發(fā)送事件idconstcId_tGenericApp_ClusterList[GENERICAPP_MAX_CLUSTERS]={GENERICAPP_CLUSTERID};//初始化端口描述符constSimpleDescriptionFormat_tGenericApp_SimpleDesc={GENERICAPP_ENDPOINT,GENERICAPP_PROFID,GENERICAPP_DEVICEID,GENERICAPP_DEVICE_VERSION,GENERICAPP_FLAGS,0,(cId_t*)NULL,GENERICAPP_MAX_CLUSTERS,(cId_t*)GenericApp_ClusterList};endPointDesc_tGenericApp_epDesc;//節(jié)點描述符byteGenericApp_TaskID;//任務(wù)優(yōu)先級byteGenericApp_TransID;//數(shù)據(jù)發(fā)送序列號devStates_tGenericApp_NwkState;//保存節(jié)點狀態(tài)voidGenericApp_MessageMSGCB(afIncomingMSGPacket_t*pckt);//消息處理函數(shù)的聲明voidGenericApp_SendTheMessage(void);//數(shù)據(jù)發(fā)送函數(shù)的聲明//任務(wù)初始化函數(shù)voidGenericApp_Init(bytetask_id){GenericApp_TaskID=task_id;//初始化任務(wù)優(yōu)先級GenericApp_NwkState=DEV_INIT;//初始化為DEV_INIT,表節(jié)點沒有連接到ZigBee網(wǎng)絡(luò)GenericApp_TransID=0;//發(fā)送數(shù)據(jù)包的序列號初始化為0//對節(jié)點描述符進行初始化GenericApp_epDesc.endPoint=GENERICAPP_ENDPOINT;=&GenericApp_TaskID;GenericApp_epDesc.simpleDesc=(SimpleDescriptionFormat_t*)&GenericApp_SimpleDesc;GenericApp_epDesc.latencyReq=noLatencyReqs;//afRegister()函數(shù)將節(jié)點描述符進行注冊,注冊后才可以使用OSAL提供的系統(tǒng)效勞afRegister(&GenericApp_epDesc);}//消息處理函數(shù)UINT16GenericApp_ProcessEvent(bytetask_id,UINT16events){afIncomingMSGPacket_t*MSGpkt;if(events&SYS_EVENT_MSG){MSGpkt=(afIncomingMSGPacket_t*)osal_msg_receive(GenericApp_TaskID);while(MSGpkt){switch(MSGpkt->hdr.event){caseAF_INCOMING_MSG_CMD:GenericApp_MessageMSGCB(MSGpkt);break;default:break;}osal_msg_deallocate((uint8*)MSGpkt);MSGpkt=(afIncomingMSGPacket_t*)osal_msg_receive(GenericApp_TaskID);}return(events^SYS_EVENT_MSG);}return0;}voidGenericApp_MessageMSGCB(afIncomingMSGPacket_t*pkt){char*recvbuf;switch(pkt->clusterId){caseGENERICAPP_CLUSTERID:HalLedBlink(HAL_LED_1,0,50,500);//LED2閃爍osal_memcpy(recvbuf,pkt->cmd.Data,osal_strlen("Coordinatorsend!")+1);if(osal_memcmp(recvbuf,"Coordinatorsend!",osal_strlen("Coordinatorsend!")+1)){HalLedBlink(HAL_LED_2,0,50,500);//LED2閃爍GenericApp_SendTheMessage();}else{//other;}break;}}voidGenericApp_SendTheMessage(void){unsignedchar*theMessageData="EndDevicereceived!";//存放發(fā)送數(shù)據(jù)afAddrType_tmy_DstAddr;my_DstAddr.addrMode=(afAddrMode_t)Addr16Bit;//數(shù)據(jù)發(fā)送模式:可選單播、播送、多播方式這里選Addr16Bit表單播my_DstAddr.endPoint=GENERICAPP_ENDPOINT;//初始化端口函my_DstAddr.addr.shortAddr=0x0000;//標(biāo)志目的地址節(jié)點的網(wǎng)絡(luò)地址這里是協(xié)調(diào)器的地址//下面是數(shù)據(jù)發(fā)送AF_DataRequest(&my_DstAddr,&GenericApp_epDesc,GENERICAPP_CLUSTERID,\osal_strlen(theMessageData)+1,theMessageData,&GenericApp_TransID,AF_DISCV_ROUTE,AF_DEFAULT_RADIUS);//HalLedSet(HAL_LED_2,HAL_LED_MODE_TOGGLE);}開始開始開始開始參加網(wǎng)絡(luò)建立網(wǎng)絡(luò)參加網(wǎng)絡(luò)建立網(wǎng)絡(luò)N收到協(xié)調(diào)器發(fā)送的數(shù)據(jù)?組播發(fā)送數(shù)據(jù)N收到協(xié)調(diào)器發(fā)送的數(shù)據(jù)?組播發(fā)送數(shù)據(jù)Y收到節(jié)點返回的數(shù)據(jù)?NY收到節(jié)點返回的數(shù)據(jù)?將LED狀態(tài)取反Y2.0xFFFF是什么意思?將LED狀態(tài)取反Y2.0xFFFF是什么意思?向協(xié)調(diào)器發(fā)送數(shù)據(jù)串口發(fā)送向協(xié)調(diào)器發(fā)送數(shù)據(jù)串口發(fā)送組播通信實驗協(xié)調(diào)器程序流程圖組播通信實驗路由器程序流程圖#include"OSAL.h"#include"AF.h"#include"ZDApp.h"#include"ZDObject.h"#include"ZDProfile.h"#include<string.h>#include"Coordinator.h"#include"DebugTrace.h"#if!defined(WIN32)#include"OnBoard.h"#endif#include"hal_lcd.h"#include"hal_led.h"#include"hal_key.h"#include"hal_uart.h"#include"OSAL_Nv.h"http://使用NV操作函數(shù),必須包含該頭文件#include"aps_groups.h"http://使用參加組函數(shù)aps_AddGroup()函數(shù),需要包含頭文件。#defineSEND_TO_ALL_EVENT0x01//定義發(fā)送事件constcId_tGenericApp_ClusterList[GENERICAPP_MAX_CLUSTERS]={GENERICAPP_CLUSTERID};//簡單設(shè)備描述符〔描述一個ZigBee設(shè)備節(jié)點〕constSimpleDescriptionFormat_tGenericApp_SimpleDesc={GENERICAPP_ENDPOINT,GENERICAPP_PROFID,GENERICAPP_DEVICEID,GENERICAPP_DEVICE_VERSION,GENERICAPP_FLAGS,GENERICAPP_MAX_CLUSTERS,(cId_t*)GenericApp_ClusterList,0,(cId_t*)NULL};aps_Group_tGenericApp_Group;//定義一個組endPointDesc_tGenericApp_epDesc;//節(jié)點描述符devStates_tGenericApp_NwkState;//存儲網(wǎng)絡(luò)狀態(tài)的變量byteGenericApp_TaskID;//任務(wù)優(yōu)先級byteGenericApp_TransID;//數(shù)據(jù)發(fā)送序列號。unsignedcharuartbuf[128];//串口接收發(fā)送數(shù)據(jù)緩沖單元voidGenericApp_MessageMSGCB(afIncomingMSGPacket_t*pckt);//消息處理函數(shù)voidGenericApp_SendTheMessage(void);//數(shù)據(jù)發(fā)送函數(shù)voidGenericApp_Init(bytetask_id)//任務(wù)初始化函數(shù){GenericApp_TaskID=task_id;//初始化任務(wù)優(yōu)先級〔任務(wù)優(yōu)先級有協(xié)議棧的操作系統(tǒng)OSAL分配〕GenericApp_TransID=0;//發(fā)送數(shù)據(jù)包的序號初始化為0//對節(jié)點描述符進行初始化=GENERICAPP_ENDPOINT;=&GenericApp_TaskID;=(SimpleDescriptionFormat_t*)&GenericApp_SimpleDesc;=noLatencyReqs;afRegister(&GenericApp_epDesc);//afRegister()對節(jié)點的描述符進行注冊。注冊后,才能使用OSAL提供的系統(tǒng)效勞。halUARTCfg_tuartConfig;//該結(jié)構(gòu)體變量是實現(xiàn)串口的配置//串口的初始化=TRUE;=HAL_UART_BR_115200;//波特率=FALSE;//流控制//=rxCB;//填的是回調(diào)函數(shù),數(shù)的指針〔即函數(shù)的地址〕作為參數(shù)傳遞給另一個函數(shù),//其實callBackFunc是一個函數(shù)指針,它的定義為halUARTCBack_tcallBackFunc;//而halUARTCBack_t的定義為typedvoid(*halUARTCBack_t)(uint8port,uint8envent)定義的是一個函數(shù)指針=NULL;//本實驗沒有使用串口的回調(diào)函數(shù)HalUARTOpen(0,&uartConfig);//串口是否翻開GenericApp_Group.ID=0x0001;//初始化組號GenericApp_G[0]=6;//組名的長度osal_memcpy(&(GenericApp_G[1]),"Group1",6);//組名的寫入}//消息處理函數(shù)UINT16GenericApp_ProcessEvent(bytetask_id,UINT16events){afIncomingMSGPacket_t*MSGpkt;//MSGpkt用于指向接收消息結(jié)構(gòu)體的指針if(events&SYS_EVENT_MSG){MSGpkt=(afIncomingMSGPacket_t*)osal_msg_receive(GenericApp_TaskID);//osal_msg_receive〔〕從消息隊列上接收消息while(MSGpkt){switch(MSGpkt->hdr.event){caseAF_INCOMING_MSG_CMD://接受到新數(shù)據(jù)的消息的ID是AF_INCOMING_MSG_CMD,這個宏是在協(xié)議棧中定義好的值為0x1A//接受到的是新數(shù)據(jù)事件HalLedBlink(HAL_LED_1,0,50,500);//LED2閃爍GenericApp_MessageMSGCB(MSGpkt);//功能是完成對接受數(shù)據(jù)的處理break;caseZDO_STATE_CHANGE://建立網(wǎng)絡(luò)后,設(shè)置事件if(GenericApp_NwkState==DEV_ZB_COORD)//把該節(jié)點已初始化為協(xié)調(diào)器,那么執(zhí)行下面的{HalLedBlink(HAL_LED_2,0,50,500);//LED2閃爍aps_AddGroup(GENERICAPP_ENDPOINT,&GenericApp_Group);//建立網(wǎng)路后,參加組。osal_start_timerEx(GenericApp_TaskID,SEND_TO_ALL_EVENT,5000);}break;default:break;}osal_msg_deallocate((uint8*)MSGpkt);//接收到的消息處理完后,釋放消息所占的存儲空間MSGpkt=(afIncomingMSGPacket_t*)osal_msg_receive(GenericApp_TaskID);//處理完一個消息后,再從消息隊列里接受消息,然后對其進行相應(yīng)處理,直到所有消息處理完}return(events^SYS_EVENT_MSG);}if(events&SEND_TO_ALL_EVENT)//數(shù)據(jù)發(fā)送事件處理代碼{GenericApp_SendTheMessage();//向終端節(jié)點發(fā)送數(shù)據(jù)函數(shù)osal_start_timerEx(GenericApp_TaskID,SEND_TO_ALL_EVENT,5000);return(events^SEND_TO_ALL_EVENT);}return0;}//協(xié)調(diào)器接受到終端節(jié)點發(fā)送來的數(shù)據(jù)時,調(diào)用下面這個函數(shù),然后把數(shù)據(jù)發(fā)送到PC串口調(diào)試助手voidGenericApp_MessageMSGCB(afIncomingMSGPacket_t*pkt){charbuf[20];unsignedcharbuffer[2]={0x0A,0x0D};switch(pkt->clusterId){caseGENERICAPP_CLUSTERID:osal_memcpy(buf,pkt->cmd.Data,20);HalUARTWrite(0,buf,20);HalUARTWrite(0,buffer,2);}}voidGenericApp_SendTheMessage(void){unsignedchar*theMessageData="Coordinatorsend!";afAddrType_tmy_DstAddr;//my_DstAddr.addrMode=(afAddrMode_t)AddrBroadcast;my_DstAddr.addrMode=(afAddrMode_t)AddrGroup;//填的是組播my_DstAddr.endPoint=GENERICAPP_ENDPOINT;//my_DstAddr.addr.shortAddr=0xFFFF;my_DstAddr.addr.shortAddr=GenericApp_Group.ID;//網(wǎng)絡(luò)地址填的是組IDAF_DataRequest(&my_DstAddr,&GenericApp_epDesc,GENERICAPP_CLUSTERID,\osal_strlen(theMessageData)+1,theMessageData,\&GenericApp_TransID,AF_DISCV_ROUTE,AF_DEFAULT_RADIUS);}#include"OSAL.h"#include"AF.h"#include"ZDApp.h"#include"ZDObject.h"#include"ZDProfile.h"#include<string.h>#include"Coordinator.h"#include"DebugTrace.h"#if!defined(WIN32)#include"OnBoard.h"#endif#include"hal_lcd.h"#include"hal_led.h"#include"hal_key.h"#include"hal_uart.h"#include"Sensor.h"#include"aps_groups.h"http://使用aps_AddGroup()函數(shù),需要包含這個頭文件#defineSEND_DATA_EVENT0x01//發(fā)送事件idconstcId_tGenericApp_ClusterList[GENERICAPP_MAX_CLUSTERS]={GENERICAPP_CLUSTERID};//初始化端口描述符constSimpleDescriptionFormat_tGenericApp_SimpleDesc={GENERICAPP_ENDPOINT,GENERICAPP_PROFID,GENERICAPP_DEVICEID,GENERICAPP_DEVICE_VERSION,GENERICAPP_FLAGS,0,(cId_t*)NULL,GENERICAPP_MAX_CLUSTERS,(cId_t*)GenericApp_ClusterList};endPointDesc_tGenericApp_epDesc;//節(jié)點描述符byteGenericApp_TaskID;//任務(wù)優(yōu)先級byteGenericApp_TransID;//數(shù)據(jù)發(fā)送序列號devStates_tGenericApp_NwkState;//保存節(jié)點狀態(tài)aps_Group_tGenericApp_Group;//定義一個組的變量voidGenericApp_MessageMSGCB(afIncomingMSGPacket_t*pckt);//消息處理函數(shù)的聲明voidGenericApp_SendTheMessage(void);//數(shù)據(jù)發(fā)送函數(shù)的聲明//任務(wù)初始化函數(shù)voidGenericApp_Init(bytetask_id){GenericApp_TaskID=task_id;//初始化任務(wù)優(yōu)先級GenericApp_NwkState=DEV_INIT;//初始化為DEV_INIT,表節(jié)點沒有連接到ZigBee網(wǎng)絡(luò)GenericApp_TransID=0;//發(fā)送數(shù)據(jù)包的序列號初始化為0//對節(jié)點描述符進行初始化GenericApp_epDesc.endPoint=GENERICAPP_ENDPOINT;=&GenericApp_TaskID;GenericApp_epDesc.simpleDesc=(SimpleDescriptionFormat_t*)&GenericApp_SimpleDesc;GenericApp_epDesc.latencyReq=noLatencyReqs;//afRegister()函數(shù)將節(jié)點描述符進行注冊,注冊后才可以使用OSAL提供的系統(tǒng)效勞afRegister(&GenericApp_epDesc);GenericApp_Group.ID=0x0001;//組號初始化GenericApp_G[0]=6;osal_memcpy(&(GenericApp_G[1]),"Group1",6);//組名}//消息處理函數(shù)UINT16GenericApp_ProcessEvent(bytetask_id,UINT16events){afIncomingMSGPacket_t*MSGpkt;if(events&SYS_EVENT_MSG){MSGpkt=(afIncomingMSGPacket_t*)osal_msg_receive(GenericApp_TaskID);while(MSGpkt){switch(MSGpkt->hdr.event){caseAF_INCOMING_MSG_CMD:GenericApp_MessageMSGCB(MSGpkt);break;caseZDO_STATE_CHANGE://參加網(wǎng)絡(luò)后,參加族中GenericApp_NwkState=(devStates_t)(MSGpkt->hdr.status);//讀取節(jié)點的設(shè)備類型//if(GenericApp_NwkState==DEV_END_DEVICE)if(GenericApp_NwkState==DEV_ROUTER){aps_AddGroup(GENERICAPP_ENDPOINT,&GenericApp_Group);//參加組中//當(dāng)中斷節(jié)點參加網(wǎng)絡(luò)后使用osal_set_envent()函數(shù)設(shè)置SEND_DATA_EVENT事件,當(dāng)事件發(fā)生時,執(zhí)行事件處理函數(shù)//osal_set_event(GenericApp_TaskID,SEND_DATA_EVENT);//GenericApp_SendTheMessage();//終端節(jié)點類型,執(zhí)行無線數(shù)據(jù)發(fā)送}break;default:break;}osal_msg_deallocate((uint8*)MSGpkt);MSGpkt=(afIncomingMSGPacket_t*)osal_msg_receive(GenericApp_TaskID);}return(events^SYS_EVENT_MSG);}return0;}voidGenericApp_MessageMSGCB(afIncomingMSGPacket_t*pkt){char*recvbuf;switch(pkt->clusterId){caseGENERICAPP_CLUSTERID:HalLedBlink(HAL_LED_1,0,50,500);//LED2閃爍osal_memcpy(recvbuf,pkt->cmd.Data,osal_strlen("Coordinatorsend!")+1);if(osal_memcmp(recvbuf,"Coordinatorsend!",osal_strlen("Coordinatorsend!")+1)){HalLedBlink(HAL_LED_2,0,50,500);//LED2閃爍GenericApp_SendTheMessage();}else{//other;}break;}}voidGenericApp_SendTheMessage(void){unsignedchar*theMessageData="Routerreceived!";//存放發(fā)送數(shù)據(jù)afAddrType_tmy_DstAddr;my_DstAddr.addrMode=(afAddrMode_t)Addr16Bit;//數(shù)據(jù)發(fā)送模式:可選單播、播送、多播方式這里選Addr16Bit表單播my_DstAddr.endPoint=GENERICAPP_ENDPOINT;//初始化端口函my_DstAddr.addr.shortAddr=0x0000;//標(biāo)志目的地址節(jié)點的網(wǎng)絡(luò)地址這里是協(xié)調(diào)器的地址//下面是數(shù)據(jù)發(fā)送AF_DataRequest(&my_DstAddr,&GenericApp_epDesc,GENERICAPP_CLUSTERID,\osal_strlen(theMessageData)+1,theMessageData,&GenericApp_TransID,AF_DISCV_ROUTE,AF_DEFAULT_RADIUS);//HalLedSet(HAL_LED_2,HAL_LED_MODE_TOGGLE);}【實驗步驟】1.播送:當(dāng)應(yīng)用程序需要將數(shù)據(jù)包發(fā)送給網(wǎng)絡(luò)的每一個設(shè)備時,使用這種模式。地址模式設(shè)置為AddrBroadcast。目標(biāo)地址
my_DstAddr.addr.shortAddr可以根據(jù)需求設(shè)置為下面播送地址的一種:
NWK_BROADCAST_SHORTADDR_DEVALL(0xFFFF)——數(shù)據(jù)包將被傳送到網(wǎng)絡(luò)上的所有設(shè)備,包括睡眠中的設(shè)備。對于睡眠中的設(shè)備,數(shù)據(jù)包將被保存在其父親節(jié)點直到查詢到它,或者消息超時(NWK_INDIRECT_MSG_TIMEOUTf8wConifg.cfg
中)。
NWK_BROADCAST_SHORTADDR_DEVRXON(0xFFFD)——數(shù)據(jù)包將被傳送到網(wǎng)絡(luò)上的所有在空閑時翻開接收的設(shè)備(RXONWHENIDLE),也就是說,除了睡眠中的所有設(shè)備。
NWK_BROADCAST_SHORTADDR_DEVZCZR(0xFFFC)——數(shù)據(jù)包發(fā)送給所有的路由器,包括協(xié)調(diào)器。
my_DstAddr.addrMode=(afAddrMode_t)AddrBroadcast;//播送發(fā)送
my_DstAddr.endPoint=GENERICAPP_ENDPOINT;
//目的端口號
my_DstAddr.addr.shortAddr=0xFFFF;
//協(xié)調(diào)器網(wǎng)絡(luò)地址
2.組播:當(dāng)應(yīng)用程序需要將數(shù)據(jù)包發(fā)送給網(wǎng)絡(luò)上的一組設(shè)備時,使用該模式。地址模式設(shè)置為afAddrGroup
并且addr.shortAddr
設(shè)置為組ID。使用組播的方式需要參加特定的組〔1〕首先聲明一個組對象aps_Group_t
SampleApp_Group;
aps_Group_t結(jié)構(gòu)體的定義:
typedef
struct
{
uint16
ID;
//
Unique
to
this
table
uint8
name[APS_GROUP_NAME_LEN];
//
#define
APS_GROUP_NAME_LEN
16
}
aps_Group_t;
每個組有個特定的ID跟組名,組名存放在name數(shù)組中,name數(shù)組的
溫馨提示
- 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)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度施工員資格考試全真模擬考試試題及答案(共三套)
- 健康衛(wèi)生知識培訓(xùn)課件
- 年度目標(biāo)達成工作計劃與目標(biāo)分解
- 山東省臨沂市費縣2024-2025學(xué)年七年級上學(xué)期期末生物學(xué)試題(含答案)
- 地理信息系統(tǒng)應(yīng)用與實踐練習(xí)題
- 魯濱遜漂流記的故事內(nèi)涵分析
- 箱包來料加工購銷合同
- 個人技術(shù)培訓(xùn)協(xié)議簽訂指南
- 人員流動統(tǒng)計表員工離職、入職3個
- 美發(fā)美甲服務(wù)合同
- 中學(xué)家長學(xué)校工作方案(10篇)
- 高考地理二輪復(fù)習(xí)【知識精研】大氣運動規(guī)律-大氣受熱過程與氣溫
- 日內(nèi)交易策略(TBQ版)
- 2025年新執(zhí)業(yè)醫(yī)師定期考核真題庫附參考答案
- 部編版九年級道德與法治上冊《第二課創(chuàng)新驅(qū)動發(fā)展》同步測試題(附答案)
- 充電樁投放合同范本
- 天津2025年天津市天賓服務(wù)中心招聘13人筆試歷年參考題庫附帶答案詳解
- 2025-2030年地質(zhì)數(shù)據(jù)定制化服務(wù)行業(yè)深度調(diào)研及發(fā)展戰(zhàn)略咨詢報告
- 鐵路信號基礎(chǔ)(第四版) 課件 第一章 信號繼電器
- 氯化車間安全操作規(guī)程(2篇)
- 2024年電力交易員(高級工)職業(yè)鑒定理論考試題庫(單選題、多選題、判斷題)
評論
0/150
提交評論