ZigBee的通信方式分为:组播、单播、广播、MAC地址通信、绑定
ZigBee绑定
1,绑定是ZigBee一种基本通信方式,具体绑定通信又分为三种模式,这里只拿源绑定来说明。
单播的时候需要指明如下参数:
发送模块的网络地址
发送模块的发送端点
接收模块的网络地址
接收模块的接收端点
接收模块的接收簇
MAC地址通信的时候需要指明如下参数:
发送模块的MAC地址
发送模块的发送端点
接收模块的网络地址
接收模块的接收端点
接收模块的接收簇
以MAC地址通信的时候,在发送这前底层会在发送模块查询地址管理器,看是否存在这个MAC地址,然后将MAC地址替代为网络短地址。
源绑定:
发送模块的网络地址
发送模块的发送端点
接收模块的网络地址
接收模块的接收端点
接收模块的接收簇
对源绑定来说,发送模块必须要知道接收模块(被绑定模块)的网络地址和MAC地址、接收方的端点、接收的簇
在发送模块会调用一个函数,这个函数会创建一个结构体(绑定表),结构体含有的信息:MAC地址、发送模块的发送端点、
接收模块的接收端点、接收模块的MAC地址、接收模块的接收簇,还要确保地址管理器中有接收模块的MAC地址和网络短地址。
如果发送模块的绑定表建立成功,则意味着发送模块和接收模块建立了绑定关系。
绑定的时候要绑定的信息有:接收模块的接收端点、接收模块的接收簇、发送模块的发送端点、本模块的网络地址,不指定接收
模块的地址信息。
发送的时候,底层会分两步:
1,查绑定表
2,绑定表存在,查地址表,发送
注意:所有绑定工作都是在发送模块"一厢情愿"建立的,与接收模块没有任何关系
#define SAMPLEAPP_ENDPOINT 20 //定义端点编号
uint8 SampleApp_TransID = 0;
uint8 destMac = {0x0F,0x55,0x16,0x20,0x07,0x00,0x4B,0x12};//目标MAC地址
zAddrType_t destination;
destination.addrMode = afAddr64Bit;//地址模式
memcpy(destination.addr.extAddr,destMac,8);//MAC 地址
//创建绑定表,与接收模块建立绑定关系
APSME_BindRequest(SAMPLEAPP_ENDPOINT,SAMPLEAPP_PERIODIC_CLUSTERID,destination,SAMPLEAPP_ENDPOINT);
/*
ZStatus_t APSME_BindRequest( byte SrcEndpInt,//源端点
uint16 ClusterId, //接收模块的簇
zAddrType_t *DstAddr, //目的地址
byte DstEndpInt);//目标端点
//调用这个函数以后,不会发送任何无线数据包,只是在本地建立了一张绑定表(所有工作都是在本地完成)
*/
//携带模块的MAC地址广播出去,网络里面所有的节点都会收到,底层会判断这个MAC地址和自己的MAC地址是不是一样,
//如果一样,就会回复一个无线数据包给我们的发送模块,发送模块就会知道目标MAC地址对应的网线短地址。
afAddrType_t SampleApp_Periodic_DstAddr; //广播
SampleApp_Periodic_DstAddr.addrMode = (afAddrMode_t)afAddrNotPresent; //表明以绑定的方式发送
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 );
//调用AF_DataRequest的时候,底层会查询绑定表,然后查询地址管理表找到对应的网络短地址。