先看有关通信的结构体或枚举:

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