11 ZigBee協(xié)議棧實(shí)驗(yàn):廣播與單播實(shí)驗(yàn)_第1頁(yè)
11 ZigBee協(xié)議棧實(shí)驗(yàn):廣播與單播實(shí)驗(yàn)_第2頁(yè)
11 ZigBee協(xié)議棧實(shí)驗(yàn):廣播與單播實(shí)驗(yàn)_第3頁(yè)
11 ZigBee協(xié)議棧實(shí)驗(yàn):廣播與單播實(shí)驗(yàn)_第4頁(yè)
11 ZigBee協(xié)議棧實(shí)驗(yàn):廣播與單播實(shí)驗(yàn)_第5頁(yè)
已閱讀5頁(yè),還剩15頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

ZigBee協(xié)議棧實(shí)驗(yàn):廣播與單播實(shí)驗(yàn)主講:張老師一、實(shí)驗(yàn)原理二、重點(diǎn)代碼解析三、實(shí)驗(yàn)結(jié)果驗(yàn)證標(biāo)題四、數(shù)據(jù)接收一、實(shí)驗(yàn)原理——基礎(chǔ)知識(shí)儲(chǔ)備Zigbee網(wǎng)絡(luò)中進(jìn)行數(shù)據(jù)通信主要有三種類型:廣播、單播、組播。一、實(shí)驗(yàn)原理——通信方式的協(xié)議棧實(shí)現(xiàn)參數(shù)1:afAddrType_t*dstAddr該參數(shù)包含了目的節(jié)點(diǎn)的網(wǎng)絡(luò)地址、端點(diǎn)號(hào)及數(shù)據(jù)傳送的模式,如單播、廣播或多播等。typedefstruct

{

Union

{

uint16shortAddr;

//用于標(biāo)識(shí)該節(jié)點(diǎn)網(wǎng)絡(luò)地址的變量

}addr;afAddrMode_taddrMode;

//用于指定數(shù)據(jù)傳送模式,單播、多播還是廣播

byteendPoint;

//端點(diǎn)號(hào)

}afAddrType_t;

//

其定義在AF.h中afAddrType_t是個(gè)結(jié)構(gòu)體如下:一、實(shí)驗(yàn)原理——通信方式的協(xié)議棧實(shí)現(xiàn)

ZigBee協(xié)議棧將數(shù)據(jù)通信過程高度抽象,使用一個(gè)函數(shù)完成數(shù)據(jù)的發(fā)送,以不同的參數(shù)來選擇數(shù)據(jù)發(fā)送方式(廣播、組播還是單播)。afStatus_tAF_DataRequest(afAddrType_t*dstAddr,//目的地址指針endPointDesc_t*srcEP,

//發(fā)送節(jié)點(diǎn)的端點(diǎn)描述符指針uint16cID,

//ClusID簇ID號(hào)uint16len,

//發(fā)送數(shù)據(jù)的長(zhǎng)度uint8*buf,

//指向存放發(fā)送數(shù)據(jù)的緩沖區(qū)指針uint8*transID,//傳輸序列號(hào),該序列號(hào)隨著信息的發(fā)送而增加

uint8options,//發(fā)送選項(xiàng)uint8radius

//最大傳輸半徑(發(fā)送的跳數(shù))

)ZigBee協(xié)議棧中數(shù)據(jù)發(fā)送函數(shù)原型如下:一、實(shí)驗(yàn)原理——通信方式的協(xié)議棧實(shí)現(xiàn)

上述結(jié)構(gòu)體中的afAddrMode_taddrMode就是用于指定數(shù)據(jù)傳送模式,是個(gè)枚舉類型,可以設(shè)置為以下幾個(gè)值。typedefenum{

afAddrNotPresent=AddrNotPresent,

//表示通過綁定關(guān)系指定目的地址

afAddr16Bit=Addr16Bit,

//單播發(fā)送

afAddrGroup=AddrGroup,

//組播

afAddrBroadcast=AddrBroadcast//廣播}afAddrMode_t;Enum{

AddrNotPresent=0,

AddrGroup=1,

Addr16Bit=2,

Addr64Bit=3,

AddrBroadcast=15};一、實(shí)驗(yàn)原理——單播注意,其實(shí)單播有兩種方式一種是綁定傳輸,一種是目標(biāo)地址的單播傳輸。my_DstAddr.addrMode=(afAddrMode_t)AddrNotPresent,一種是直接指定目標(biāo)地址的單播傳輸,比如協(xié)調(diào)器就是0x0000。①單播綁定傳輸my_DstAddr.addrMode=(afAddrMode_t)Addr16Bit;

//單播發(fā)送my_DstAddr.endPoint=GENERICAPP_ENDPOINT;

//目的端口號(hào)my_DstAddr.addr.shortAddr=0;

//按照綁定的方式進(jìn)行單播,不需要指定目標(biāo)地址,需要先將兩個(gè)設(shè)備綁定,將兩個(gè)設(shè)備綁定后即可通信②直接指定目標(biāo)地址的單播傳輸:是標(biāo)準(zhǔn)尋址模式,它將數(shù)據(jù)包發(fā)送給一個(gè)已經(jīng)知道網(wǎng)絡(luò)地址的網(wǎng)絡(luò)設(shè)備,將afAddrMode設(shè)置為Addr16Bit并且在數(shù)據(jù)包中攜帶目標(biāo)設(shè)備地址。my_DstAddr.addrMode=(afAddrMode_t)Addr16Bit;

//單播發(fā)送my_DstAddr.endPoint=GENERICAPP_ENDPOINT;

//目的端口號(hào)my_DstAddr.addr.shortAddr=0x0000;

//目標(biāo)設(shè)備網(wǎng)絡(luò)地址一、實(shí)驗(yàn)原理——廣播當(dāng)應(yīng)用程序需要將數(shù)據(jù)包發(fā)送給網(wǎng)絡(luò)的每一個(gè)設(shè)備時(shí),使用這種模式。地址模式設(shè)置為AddrBroadcast。目標(biāo)地址my_DstAddr.addr.shortAddr可以根據(jù)需求設(shè)置為下面廣播地址的一種。NWK_BROADCAST_SHORTADDR_DEVALL(0xFFFF)——數(shù)據(jù)包將被傳送到網(wǎng)絡(luò)上的所有設(shè)備,包括睡眠中的設(shè)備。對(duì)于睡眠中的設(shè)備,數(shù)據(jù)包將被保留在其父親節(jié)點(diǎn)直到查詢到它,或者消息超時(shí)(NWK_INDIRECT_MSG_TIMEOUT在f8wConifg.cfg中)。NWK_BROADCAST_SHORTADDR_DEVRXON(0xFFFD)——數(shù)據(jù)包將被傳送到網(wǎng)絡(luò)上的所有在空閑時(shí)打開接收的設(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;

//目的端口號(hào)my_DstAddr.addr.shortAddr=0xFFFF;

//協(xié)調(diào)器網(wǎng)絡(luò)地址一、實(shí)驗(yàn)原理——實(shí)驗(yàn)效果及原理圖

實(shí)驗(yàn)效果預(yù)設(shè)為:協(xié)調(diào)器周期性以廣播的形式向終端節(jié)點(diǎn)發(fā)送數(shù)據(jù),終端節(jié)點(diǎn)收到數(shù)據(jù)后,使開發(fā)板上的LED狀態(tài)翻轉(zhuǎn),同時(shí)向協(xié)調(diào)器發(fā)送字符串“EndDevicereceived!”,協(xié)調(diào)器收到終端節(jié)點(diǎn)發(fā)回的數(shù)據(jù)后,通過串口輸出到PC機(jī),用戶可以通過串口調(diào)試助手查看該信息。一、實(shí)驗(yàn)原理——協(xié)調(diào)器工作流程協(xié)調(diào)器周期性以廣播的形式向終端節(jié)點(diǎn)發(fā)送數(shù)據(jù),如何實(shí)現(xiàn)周期性地發(fā)送數(shù)據(jù)呢?這里又需要用定時(shí)函數(shù)osal_start-timcrEx0,定時(shí)5s,定時(shí)時(shí)間達(dá)到后,向終端節(jié)點(diǎn)發(fā)送數(shù)據(jù),發(fā)送完數(shù)據(jù)再定時(shí)5s,這樣就實(shí)現(xiàn)了周期性地發(fā)送數(shù)據(jù)。一、實(shí)驗(yàn)原理——終端節(jié)點(diǎn)工作流程終端節(jié)點(diǎn)上電后,會(huì)進(jìn)行硬件電路的初始化,然后搜索是否有ZigBee無線網(wǎng)絡(luò),如果有ZigBee無線網(wǎng)絡(luò)再自動(dòng)加入(這是最簡(jiǎn)單的情況,當(dāng)然可以控制節(jié)點(diǎn)加入網(wǎng)絡(luò)時(shí)要符合編譯時(shí)確定的網(wǎng)絡(luò)號(hào)等),然后判斷是否收到協(xié)調(diào)器發(fā)送的數(shù)據(jù),若收到,則將LED狀態(tài)取反,然后發(fā)送數(shù)據(jù)到協(xié)調(diào)器,否則繼續(xù)等待接收數(shù)據(jù)。二、重點(diǎn)代碼解析--協(xié)調(diào)器程序設(shè)計(jì)if(events&SEND_TO_ALL_EVENT)//數(shù)據(jù)發(fā)送事件處理{GenericApp_SendTheMessage();osal_start_timerEx(GenericApp_TaskID,SEND_TO_ALL_EVENT,5000);return(events^SEND_TO_ALL_EVENT);}

當(dāng)網(wǎng)絡(luò)狀態(tài)發(fā)生變化時(shí),啟動(dòng)定時(shí)器定時(shí)5S,定時(shí)時(shí)間到達(dá)后,設(shè)置SEND_TO_ALL_EVENT事件,在SEND_TO_ALL_EVENT事件處理函數(shù)中,調(diào)用發(fā)送數(shù)據(jù)函數(shù)GenericApp_SendTheMessage(),發(fā)送完數(shù)據(jù)后,再次啟動(dòng)定時(shí)器,定時(shí)5S……二、重點(diǎn)代碼解析--協(xié)調(diào)器程序設(shè)計(jì)if(events&SEND_TO_ALL_EVENT)//數(shù)據(jù)發(fā)送事件處理{GenericApp_SendTheMessage();osal_start_timerEx(GenericApp_TaskID,SEND_TO_ALL_EVENT,5000);return(events^SEND_TO_ALL_EVENT);}

當(dāng)網(wǎng)絡(luò)狀態(tài)發(fā)生變化時(shí),啟動(dòng)定時(shí)器定時(shí)5S,定時(shí)時(shí)間到達(dá)后,設(shè)置SEND_TO_ALL_EVENT事件,在SEND_TO_ALL_EVENT事件處理函數(shù)中,調(diào)用發(fā)送數(shù)據(jù)函數(shù)GenericApp_SendTheMessage(),發(fā)送完數(shù)據(jù)后,再次啟動(dòng)定時(shí)器,定時(shí)5S……二、重點(diǎn)代碼解析--協(xié)調(diào)器程序設(shè)計(jì)voidGenericApp_MessageMSGCB(afIncomingMSGPacket_t*pkt){unsignedcharbuf[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);break;}}當(dāng)收到終端節(jié)點(diǎn)發(fā)回的數(shù)據(jù)后,讀取該數(shù)據(jù),然后發(fā)送到串口。二、重點(diǎn)代碼解析--協(xié)調(diào)器程序設(shè)計(jì)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);}使用廣播方式發(fā)送數(shù)據(jù),注意,此時(shí)發(fā)送模式是廣播,如下代碼所示:my_DstAddr.addrMode=(afAddrMode_t)AddrBroadcast;相應(yīng)的網(wǎng)絡(luò)地址可以設(shè)為0xFFFF,如下代碼所示:my_DstAddr.addr.shortAddr=0xFFFF;二、重點(diǎn)代碼解析—終端節(jié)點(diǎn)程序設(shè)計(jì)voidGenericApp_MessageMSGCB(afIncomingMSGPacket_t*pkt){char*recvbuf;unsignedcharbuffer[2]={0x0A,0x0D};switch(pkt->clusterId){caseGENERICAPP_CLUSTERID:osal_memcpy(recvbuf,pkt->cmd.Data,osal_strlen("Coordinatorsend!")+1);if(osal_memcmp(recvbuf,"Coordinatorsend!",osal_strlen("Coordinatorsend!")+1)){HalUARTWrite(0,recvbuf,18);

HalUARTWrite(0,buffer,2);GenericApp_SendTheMessage();}}}上述代碼是對(duì)接收到的數(shù)據(jù)進(jìn)行處理,當(dāng)正確接收到協(xié)調(diào)器發(fā)送的字符串"Coordinatorsend!"時(shí),調(diào)用函數(shù)GenericApp_SendTheMessage()發(fā)送返回消息。二、重點(diǎn)代碼解析—終端節(jié)點(diǎn)程序設(shè)計(jì)voidGenericApp_SendTheMessage(void){unsignedchar*theMessageData="EndDevicereceived!";afAddrType_tmy_DstAddr;my_DstAddr.addrMode=(afAddrMode_t)Addr16Bit;my_DstAddr.endPoint=GENERICAPP_ENDPOINT;my_Dst

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論