1. 程式人生 > >ZigBee MAC地址通訊原理

ZigBee MAC地址通訊原理

先看有關通訊的結構體或列舉:

//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地址後將其存入地址管理器中。