ZigBee MAC地址通訊原理
阿新 • • 發佈:2019-01-07
先看有關通訊的結構體或列舉:
//ZigBee在傳送資料的時候,有以下同種地址模式 typedef enum { afAddrNotPresent = AddrNotPresent,//以繫結的方式傳送資料 afAddr16Bit = Addr16Bit,//指定地址單點傳送(Unicast) 16位網路地址 afAddr64Bit = Addr64Bit,//以64位MAC地址傳送 afAddrGroup = AddrGroup,//組播 afAddrBroadcast = AddrBroadcast//廣播到所有網路 } afAddrMode_t; { union { uint16 shortAddr; //16位網路地址 ZLongAddr_t extAddr; //64位IEEE地址 } addr; afAddrMode_t addrMode; //傳送模式 afAddrMode_t是一個列舉型別模式引數 byte endPoint; //指定的端點號 端點241—254保留端點 範圍 1-240 uint16 panId; // used for the INTER_PAN feature } afAddrType_t; //目的地址結構體變數(含端點)
當我們指定了傳送模式為MAC地址時,我們在指定目標結構時,需要指定:ZLongAddr_t。
程式碼示例:
#define SAMPLEAPP_ENDPOINT 20 //定義端點編號 uint8 SampleApp_TransID = 0; uint8 destMac = {0x0F,0x55,0x16,0x20,0x07,0x00,0x4B,0x12};//目標MAC地址 afAddrType_t SampleApp_Periodic_DstAddr; //廣播 SampleApp_Periodic_DstAddr.addrMode = (afAddrMode_t)afAddr64Bit; //地址模式為64位MAC地址 SampleApp_Periodic_DstAddr.endPoint = SAMPLEAPP_ENDPOINT;//端點 //SampleApp_Periodic_DstAddr.addr.shortAddr = 0xFFFF;//表示目標接收模組是網路裡面的所有節點 memcpy(SampleApp_Periodic_DstAddr.addr.extAddr,destMac,8);//注意這裡是用MAC地址傳送 endPointDesc_t SampleApp_epDesc; SampleApp_epDesc.endPoint = SAMPLEAPP_ENDPOINT;//模組的端點 SampleApp_epDesc.task_id = &SampleApp_TaskID;//指明資料由接收方的哪一個任務來處理 SampleApp_epDesc.simpleDesc = (SimpleDescriptionFormat_t *)&SampleApp_SimpleDesc; SampleApp_epDesc.latencyReq = noLatencyReqs; afRegister( &SampleApp_epDesc );//繫結 uint8 SampleAppPeriodicCounter = 0;//傳送的資料 //開始傳送 AF_DataRequest( &SampleApp_Periodic_DstAddr, //目標地址 &SampleApp_epDesc,//endPoint SAMPLEAPP_PERIODIC_CLUSTERID,//簇,即指明訊息要發往SAMPLEAPP_ENDPOINT(房間)的SAMPLEAPP_PERIODIC_CLUSTERID(房間裡面的具體的某個人) 1,//資料長度 (uint8*)&SampleAppPeriodicCounter,//傳送的資料 &SampleApp_TransID,//成功傳送的幀數,這裡要傳地址,底層傳送成功以後,底層會修改這個值 AF_DISCV_ROUTE, AF_DEFAULT_RADIUS );
注意:
在設定目標結構體時,我們指定了extAddr和afAddr64Bit。
以MAC地址傳送的本質:在每一個ZigBee無線模組,在底層裡面都會記錄周邊節點的網路地址、MAC地址,即地址管理器。
當以MAC地址傳送時,底層會向地址管理器查詢看是否存在,如果存在取出來網路地址,則用網路地址傳送。
如果底層管理器沒有這個MAC地址(距離很遠的話,地址管理器可能就沒對應的MAC地址)。
針對如果以mac地址傳送時,如果距離較遠,我們可以分成兩步來處理:
1,可以先發一包資料給目標模組,然後啟動一個延時事件。
2,在延時事件處理函式中,再將真正的資料發出去。
這樣做的原理是:
首先給目標模組傳送一個資訊包出去,讓協調器模組把自己的網路地址回覆給我們的模組,我們的模組在底層會拿到
MAC地址後將其存入地址管理器中。