Zigbee单播、组播、广播网络通信(2012-12-2617:04:39)转载▼标签:z-stackzigbee单播组播广播分类:ZigbeeZigbee网络中进行数据通信主要有三种类型:单播、组播、广播。那这三种方式如何设置呢,在哪里设置呢,还记得之前学习的Zigbee协议栈进行数据发送是调用AF_DataRequest这个函数:afStatus_tAF_DataRequest(afAddrType_t*dstAddr,//目的地址指针endPointDesc_t*srcEP,//发送节点的端点描述符指针uint16cID,//ClusID簇ID号uint16len,//发送数据的长度uint8*buf,//指向存放发送数据的缓冲区指针uint8*transID,//传输序列号,该序列号随着信息的发送而增加uint8options,//发送选项uint8radius//最大传输半径(发送的跳数))参数1:afAddrType_t*dstAddr该参数包含了目的节点的网络地址、端点号及数据传送的模式,如单播、广播或多播等。afAddrType_t是个结构体如下:typedefstruct{union{uint16shortAddr;//用于标识该节点网络地址的变量}addr;afAddrMode_taddrMode;//用于指定数据传送模式,单播、多播还是广播byteendPoint;//端点号}afAddrType_t;//其定义在AF.h中在Zigbee中,数据包可以单点传送(unicast),多点传送(multicast)或者广播传送,所以必须有地址模式参数。一个单点传送数据包只发送给一个设备,多点传送数据包则要传送给一组设备,而广播数据包则要发送给整个网络的所有节点。因此上述结构体中的afAddrMode_taddrMode就是用于指定数据传送模式,是个枚举类型,可以设置为以下几个值,typedefenum{afAddrNotPresent=AddrNotPresent,//表示通过绑定关系指定目的地址afAddr16Bit=Addr16Bit,//单播发送afAddrGroup=AddrGroup,//组播afAddrBroadcast=AddrBroadcast//广播}afAddrMode_t;enum{AddrNotPresent=0,AddrGroup=1,Addr16Bit=2,Addr64Bit=3,AddrBroadcast=15};看到这里知道了通信方式在哪里设置了,那不同的通信模式,我们要怎么设置哪些参数呢?单播:注意:其实单播有两种方式一种是绑定传输my_DstAddr.addrMode=(afAddrMode_t)AddrNotPresent,一种是直接指定目标地址的单播传输,比如协调器就是0x0000。绑定后面再学吧!单播绑定传输:my_DstAddr.addrMode=(afAddrMode_t)Addr16Bit;//单播发送my_DstAddr.endPoint=GENERICAPP_ENDPOINT;//目的端口号my_DstAddr.addr.shortAddr=0;//按照绑定的方式进行单播,不需要指定目标地址,需要先将两个设备绑定,将两个设备绑定后即可通信直接指定目标地址的单播传输:是标准寻址模式,它将数据包发送给一个已经知道网络地址的网络设备,将afAddrMode设置为Addr16Bit并且在数据包中携带目标设备地址。my_DstAddr.addrMode=(afAddrMode_t)Addr16Bit;//单播发送my_DstAddr.endPoint=GENERICAPP_ENDPOINT;//目的端口号my_DstAddr.addr.shortAddr=0x0000;//目标设备网络地址广播:当应用程序需要将数据包发送给网络的每一个设备时,使用这种模式。地址模式设置为AddrBroadcast。目标地址my_DstAddr.addr.shortAddr可以根据需求设置为下面广播地址的一种:NWK_BROADCAST_SHORTADDR_DEVALL(0xFFFF)——数据包将被传送到网络上的所有设备,包括睡眠中的设备。对于睡眠中的设备,数据包将被保留在其父亲节点直到查询到它,或者消息超时(NWK_INDIRECT_MSG_TIMEOUT在f8wConifg.cfg中)。NWK_BROADCAST_SHORTADDR_DEVRXON(0xFFFD)——数据包将被传送到网络上的所有在空闲时打开接收的设备(RXONWHENIDLE),也就是说,除了睡眠中的所有设备。NWK_BROADCAST_SHORTADDR_DEVZCZR(0xFFFC)——数据包发送给所有的路由器,包括协调器。my_DstAddr.addrMode=(afAddrMode_t)AddrBroadcast;//广播发送my_DstAddr.endPoint=GENERICAPP_ENDPOINT;//目的端口号my_DstAddr.addr.shortAddr=0xFFFF;//协调器网络地址组播:当应用程序需要将数据包发送给网络上的一组设备时,使用该模式。地址模式设置为afAddrGroup并且addr.shortAddr设置为组ID。使用组播的方式需要加入特定的组1.首先声明一个组对象aps_Group_tSampleApp_Group;aps_Group_t结构体的定义:typedefstruct{uint16ID;//Uniquetothistableuint8name[APS_GROUP_NAME_LEN];//#defineAPS_GROUP_NAME_LEN16}aps_Group_t;每个组有个特定的ID跟组名,组名存放在name数组中,name数组的第一个元素是组名的长度,第二个元素开始存放组名字符串。2.对SampleApp_Group赋值://Bydefault,alldevicesstartoutinGroup1SampleApp_Group.ID=0x0003;//初始化组IDosal_memcpy(SampleApp_Group.name,Group3,7);//将组名的长度写入name数组的第一个元素位置处3.在本任务里将端点加入到组中:aps_AddGroup(SAMPLEAPP_ENDPOINT,&SampleApp_Group);4.设定通信的目标地址及模式://Setupfortheflashcommand'sdestinationaddress-Group1SampleApp_Flash_DstAddr.addrMode=(afAddrMode_t)afAddrGroup;SampleApp_Flash_DstAddr.endPoint=SAMPLEAPP_ENDPOINT;SampleApp_Flash_DstAddr.addr.shortAddr=SampleApp_Group.ID;通信时候,发送设备的输出cluster设定为接收设备的输入cluster,另外profileID设定相同,即可通信。5.若要把一个设备加入到组中的端点从组中移除,调用aps_RemoveGroup:aps_Group_t*grp;grp=aps_FindGroup(SAMPLEAPP_ENDPOINT,SAMPLEAPP_FLASH_GROUP);if(grp){//Removefromthegroupaps_RemoveGroup(SAMPLEAPP_ENDPOINT,SAMPLEAPP_FLASH_GROUP);}注意组可以用来关联间接寻址。再绑定表中找到的目标地址可能是是单点传送或者是一个组地址。另外,广播发送可以看做是一个组寻址的特例。