组播通信原理
组播通信:在Zigbee网络,模块可以分组来标记,发送的模块如果组号和网络里面标记模块的组号相对应,那么这些模块就可以
拿到这些无线数据包。
组播的特点:
1,分组中的编号是两个字节(即组号是两个字节)
2,组号必须和已经定义了的端点相关联。
即:组都是和模块里已经定义了的端点相关联,如果我们说一个模块标记为组0x01,那么这个模块里面至少有一个定义了的
端点与这个和组(0x01)相关联
3,发送模块必须指明发送给哪个组,哪个端点,簇编号,原则上,只要当接收模块的这三个参数匹配上了,才能拿到和处理这样
一个无线数据包。
4,组标记中,同一个模块下的定义的一个组,可以关联多个可用的端点,同一个端点也可以关联多个组。
代码示例:
#define SAMPLEAPP_FLASH_CLUSTERID 2 //簇编号
#define SAMPLEAPP_FLASH_GROUP 0x0001 //组编号
afAddrType_t SampleApp_Flash_DstAddr; //组播
// Setup for the flash command's destination address - Group 1
SampleApp_Flash_DstAddr.addrMode = (afAddrMode_t)afAddrGroup;//注意这里发送模式为组播
SampleApp_Flash_DstAddr.endPoint = SAMPLEAPP_ENDPOINT;
SampleApp_Flash_DstAddr.addr.shortAddr = SAMPLEAPP_FLASH_GROUP;//注意这里是接收模块的组编号
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 );//绑定
aps_Group_t SampleApp_Group;
SampleApp_Group.ID = 0x0001; //接收模块的组编号
osal_memcpy( SampleApp_Group.name, "Group 1", 7 );
aps_AddGroup( SAMPLEAPP_ENDPOINT, &SampleApp_Group );//把组跟端点关联,一定要端点关联
uint8 SampleApp_TransID = 0; //发送成功的帧条数,由底层负责更新
uint8 buffer[3];
uint16 flashTime = 856;//组播的数据
buffer[0] = (uint8)(SampleAppFlashCounter++);
buffer[1] = LO_UINT16( flashTime );
buffer[2] = HI_UINT16( flashTime );
if ( AF_DataRequest( &SampleApp_Flash_DstAddr,
&SampleApp_epDesc,
SAMPLEAPP_FLASH_CLUSTERID,
3,
buffer,
&SampleApp_TransID,
AF_DISCV_ROUTE,
AF_DEFAULT_RADIUS ) == afStatus_SUCCESS )
{
}
代码很简单,有以下几点需要说明一下:
1,在使用上广播没有什么区别,仅仅是地址模式、地址内容不一样
2,可以调用aps_RemoveGroup方法解除关联。
2,协调器用到了组,要引入#include "aps_groups.h" 头文件。