先看有关通信的结构体或枚举:
//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地址后将其存入地址管理器中。