This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CC2652R7:Get Group Membership 命令的错误行为

Guru**** 2455560 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/zigbee-thread-group/zigbee-and-thread/f/zigbee-thread-forum/1438213/cc2652r7-incorrect-behavior-of-get-group-membership-command

器件型号:CC2652R7

工具与软件:

关于 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 )

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    感谢您问这个问题。

    我会在5个工作日内对其进行调查并提供更新。

    谢谢!
    Toby

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    经过进一步调查、 这似乎与组集群 ZCL 规范的解释相关的小问题。

    您建议的解决方法对我来说合理、感谢您的分享。 我将向我们的 rnd 团队提交一个 TT、以进行进一步调查。

    谢谢!
    Toby