工具与软件:
关于 Get Group Membership ZCL 命令和响应、ZCL (版本7/8)指出:
第3.6.2.3.4.2节(对收到的影响)
在收到 Get group membership 命令后、每个接收实体都应使用 group mem-
使用 GET 组成员身份响应帧提交信息、如下所示:
如果命令帧的组计数字段值为0、表示组列表字段为空、
该实体应使用该实体所属的所有组标识符进行响应。
如果命令帧的组列表字段至少包含一个实体是其成员的组、则
实体应通过与组列表字段中的组匹配的每个实体组标识符进行响应。
如果组计数不为零、并且命令帧的组列表字段不包含任何组
如果实体是成员、则仅当命令为单播时、该实体才应响应。 响应
应返回零的组计数。
在最后一种情况下、如果客户端向一个或多个组发送 Get group membership 命令、并且接收设备没有与该命令中的组匹配的组、则应发送组数=0的响应。
在这种情况下、当前 ZStack 不发送响应。 相关代码位于`source/ti/Zstack/stack/zcl/zcl_general.c`中:
case COMMAND_GROUPS_GET_GROUP_MEMBERSHIP:
{
grpCnt = *pData++;
// Allocate space for the group list
grpList = zcl_mem_alloc( sizeof( uint16_t ) * APS_MAX_GROUPS );
if ( grpList != NULL )
{
if ( grpCnt == 0 )
{
// Find out all the groups of which the endpoint is a member.
grpRspCnt = aps_FindAllGroupsForEndpoint( pInMsg->msg->endPoint, grpList );
}
else
{
// Find out the groups (in the list) of which the endpoint is a member.
for ( i = 0; i < grpCnt; i++ )
{
group.ID = BUILD_UINT16( pData[0], pData[1] );
pData += 2;
if ( aps_FindGroup( pInMsg->msg->endPoint, group.ID ) )
grpList[grpRspCnt++] = group.ID;
}
}
if ( grpCnt == 0 || grpRspCnt != 0 )
{
zclGeneral_SendGroupGetMembershipResponse( pInMsg->msg->endPoint, &pInMsg->msg->srcAddr,
aps_GroupsRemaingCapacity(), grpRspCnt,
grpList, true, pInMsg->hdr.transSeqNum );
}
zcl_mem_free( grpList );
}
else
{
// Couldn't allocate space for the group list -- send a Default Response command back.
zclDefaultRspCmd_t defaultRspCmd;
defaultRspCmd.commandID = pInMsg->hdr.commandID;
defaultRspCmd.statusCode = ZCL_STATUS_INSUFFICIENT_SPACE;
zcl_SendDefaultRspCmd( pInMsg->msg->endPoint, &(pInMsg->msg->srcAddr),
pInMsg->msg->clusterId, &defaultRspCmd,
ZCL_FRAME_SERVER_CLIENT_DIR, true, 0, pInMsg->hdr.transSeqNum );
}
stat = ZCL_STATUS_CMD_HAS_RSP;
}
break;
可以通过更改以下内容来实现校正4行为:
if ( grpCnt == 0 || grpRspCnt != 0 )
收件人:
if ( grpCnt == 0 || grpRspCnt != 0 || !pInMsg->msg->wasBroadcast )