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.

[参考译文] CC2652RSIP:使用绿色电源器件进行调试

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

https://e2e.ti.com/support/wireless-connectivity/zigbee-thread-group/zigbee-and-thread/f/zigbee-thread-forum/1319334/cc2652rsip-commissioning-with-a-green-power-device

器件型号:CC2652RSIP

我有一个与绿色电源设备配对的问题。 我的器件用作接收器。 在测试中、我使用了 zc_Thermoster_Sink_CC26X2R1_LAUNCHXL_tirtos_ccs 示例与绿色功率器件进行通信。

显然、 首先我能够  介绍 gpd_temperaturesensor_CC26X2R1_LAUNCHXL_tirtos_ccs 示例。

但当我尝试使用真正的绿色电源设备时、帧会从堆栈中丢弃。  gp_SecurityOperationSink 函数返回"GP_SEC_RSP_DROP_FRAME"(第1060行- gp_sink.c)。

传感器发送的封装是0xE3 (通道请求)、但我可以看到这种封装未 在该部分代码中处理。

器件向受电方发送 GP 通道请求、从 GP 通道配置等待并使用 GP 调试进行响应。

我尝试 使用另一个接收器件来连接 Wireshark 捕获、但没有成功。

谢谢。

 

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

    尊敬的 Christiane:

    您的 Zigbee 行为是否与 此 E2E 主题有任何相似之处?  请提供您正在使用的特定 SimpleLink F2 SDK 版本。  您能否准确调试导致  GP_SEC_RSP_DROP_FRAME 返回的 if 语句条件?

          if(((cmd.options.securityKeyRequest == TRUE) &&
          (gpDataInd->RxAfterTx == FALSE)) ||
          (cmd.options.securityKeyRequest == TRUE) &&
          (cmd.extOptions.securityLevel == GP_SECURITY_LVL_NO_SEC))
          {
            return GP_SEC_RSP_DROP_FRAME;
          }

    您可以通过将文件直接拖/放到答复框中、单击 Insert -> Image/Video/file 或提供指向联机文件共享服务的链接、来附加 Wireshark 捕获。  我还建议您查看   Z-Stack 用户指南中的"绿色电源应用概述"部分

    此致、
    瑞安

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

    早上好、Ryan、

    感谢您的快速回复。
    是的、我认为这正是问题所在。

    我曾使用过 SDK 3.40和7.10、我可以看到两个 SDK 都具有相同的行为。

    确切的流程如下:

    文件行840:案例 zstackmsg_Cmdids_GP_SECURITY_REQ

    文件 gp_common.c 第937行:gp_processSecRecMsg  

                    第703行: GP_SecReq

    文件 gp_sink.c:第913行: gp_SecurityOperationSink、  

                第943行:状态= ZInvalidParameter

                第1006行: 此 if 为真

                第1060行:返回 GP_SEC_RSP_DROP_FRAME

    不幸的是、我无法附加捕获、当我尝试拖放文件时、没有任何反应。 我将文件发送到了

    再次感谢。

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

    请注意、TI 以 GP 接收设备应用程序为例、因此此特性的应用层完全可用、并且开发人员可以对其进行修改以达到最终产品要求。

    考虑到这一点、请使用 CCS 调试器内的表达式视图 来确定 gpDataInd、cmd 和 gpsSecurityLevel 的内容。  拥有这些 语句将帮助您进一步确定为什么"line 1006 if statement"中的语句都不会返回 GP_SEC_RSP_PASS_UFFE。  然后、您可以添加一个定制的 else if 语句传递到 GP_CHANNEL_REQ_COMMAND_ID。

    由于您有一个正在工作的第三方接收器和 GP 器件系统、以及一个正在工作的 zc_Thermoster_Sink_CC26X2R1 和  GPD_temperaturensor_CC26X2R1示例设置、因此应该能够进一步分析 Wireshark 日志、以复制您的 zc_Thermoster_Sink_CC26X2R1的第三方接收器操作 

     即使您能够在框架未被丢弃的情况下越过 gp_SecurityOperationSink,Gp_Gp z4517bingNotificationCommandCB 是否从未进入?

    此致、
    瑞安

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

    您好、Ryan、

    很抱歉这么晚才回复。

    我超过了  gp_SecurityOperationSink 而不丢弃帧、现在 按照您的建议以 GP_SEC_RSP_PASS_UFFE 退出。 但  无论如何都不会进入 z45i Gp_Gp ingNotificationCommandCB。

    谢谢。
    克里斯蒂安·贝伦策尔·皮艾亚

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

    遵循 zclSampleThermostat_processIncomingMsgInd -> zcl_ProcessMessageMSG Gp_Hdl -> zegin Gp_Hdl SpecificCommands -> zocomp Gp_Process BasicCombo -> Case 通知、以确定为何 pfnGpcommitingNotificationCmd 不被称为或不会导致 zclcb Gp_Gp。

    此致、
    瑞安

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

    您好、Ryan、

    感谢您的回复。

    因为 zclSampleThermostat_processZStackMsg 永远不会收到 pMsg->HDR.event = zstackmsg_CMDDS_AF_INcoming_MSG_IND 。

    谢谢。

    克里斯蒂安·贝伦策尔·皮艾亚

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

    现在、您已经确认接收到您感兴趣的数据包、可以添加必要的应用程序代码、以便  使用 zcl_SendCommand 将 GP_CHANNEL_CCONFIG_COMMAND_ID 发回一个 GP_CHANNEL_COMMAND?  您应该能够 从 gp_SecurityOperationSink 看到 gpDataInd->GPDCmmdID ,并从那里执行您需要的操作。  参考资料 Gp_Gp z452/annelRequestProcess。

    此致、
    瑞安

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

    您好、Ryan、

    感谢您的回复和建议。

    我尝试执行您所说的操作、但我在 Wireshark 中看不到我的包。

    我包含以下代码:

    if(gp_SecRsp->Status == GP_SEC_RSP_PASS_UNPROCESSED)
    {
        gp_DataInd_t *gpDataInd = NULL;
        gpDataInd = gp_DataIndGet(gp_SecReq->dGPStubHandle);
    
        if(gpDataInd->GPDCmmdID == GP_CHANNEL_REQ_COMMAND_ID)
        {
            afAddrType_t dstAddr;
            gpResponseCmd_t cmd;
    
            cmd.options = gpDataInd->appID;
            cmd.tempMasterShortAddr = _NIB.nwkDevAddress;
    
            if(GP_PAIRING_OPT_IS_APPLICATION_ID_GPD(gpDataInd->appID))
            {
                cmd.gpdSrcId = gpDataInd->SrcId;
            }
            else if(GP_PAIRING_OPT_IS_APPLICATION_ID_IEEE(gpDataInd->appID))
            {
                zcl_memcpy(cmd.gpdIEEE, gp_SecReq->gpdID.id.gpdExtAddr, Z_EXTADDR_LEN);
                cmd.ep = gp_SecReq->EndPoint;
            }
    
            cmd.cmdId = GP_CHANNEL_CCONFIG_COMMAND_ID;
            cmd.tempMasterChannel = _NIB.nwkLogicalChannel & 0x0F;
            cmd.payloadLen = sizeof(gpdChannelConfiguration_t);
            cmd.cmdPayload = zcl_mem_alloc(cmd.payloadLen);
    
            if (cmd.cmdPayload)
            {
                dstAddr.addr.shortAddr = _NIB.nwkDevAddress;
    
                dstAddr.addrMode = afAddr16Bit;
                dstAddr.endPoint = GREEN_POWER_INTERNAL_ENDPOINT;
    
                (*(gpdChannelConfiguration_t*)cmd.cmdPayload).operationalChannel = _NIB.nwkLogicalChannel - 11;
                (*(gpdChannelConfiguration_t*)cmd.cmdPayload).basic = TRUE;
                (*(gpdChannelConfiguration_t*)cmd.cmdPayload).reserved = 0;
    
                zclGp_SendGpResponseCommand(&dstAddr, &cmd);
                zcl_mem_free(cmd.cmdPayload);
            }
        }
    }

    在 gp_common.c 文件的803行中。

    你有什么建议吗? 我做错了什么?

    谢谢。

    克里斯蒂安·贝伦策尔·皮艾亚

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

    您好、Cristiane:

    请将断点放置在 zoci Gp_Send padsiResponse Command 和 zcl_SendCommand 中,以确保代码执行到达这些函数。  然后、检查每个数据包的参数以确认被格式化的数据包具有正确的信息。  例如 、_NIB.nwkDevAddress 应该是本地器件的短地址、而我认为您希望 dstAddr.addr.shortAddr 是目标 GP 器件的短地址。

    此致、
    瑞安

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

    您好、Ryan、

    非常感谢您的建议。

    好消息是、现在我可以在 Wireshark 上看到我的数据包了。

    坏消息是、如您所见、我的数据包出错了、它不是我预期的通道配置。

    我的代码:

       if(gp_SecRsp->Status == GP_SEC_RSP_PASS_UNPROCESSED)
       {
           gp_DataInd_t *gpDataInd = NULL;
           gpDataInd = gp_DataIndGet(gp_SecReq->dGPStubHandle);
    
           if(gpDataInd->GPDCmmdID == GP_CHANNEL_REQ_COMMAND_ID)
           {
               afAddrType_t dstAddr;
               gpResponseCmd_t cmd;
    
               if(GP_PAIRING_OPT_IS_APPLICATION_ID_GPD(gpDataInd->appID))
               {
                   cmd.gpdSrcId = gpDataInd->SrcId;
               }
               else if(GP_PAIRING_OPT_IS_APPLICATION_ID_IEEE(gpDataInd->appID))
               {
                   zcl_memcpy(cmd.gpdIEEE, gp_SecReq->gpdID.id.gpdExtAddr, Z_EXTADDR_LEN);
                   cmd.ep = gp_SecReq->EndPoint;
               }
    
               cmd.options = gpDataInd->appID;
               cmd.tempMasterShortAddr = gpDataInd->srcAddr.addr.shortAddr;
               cmd.tempMasterChannel = _NIB.nwkLogicalChannel & 0x0F;
    
               dstAddr.addr.shortAddr = gpDataInd->srcAddr.addr.shortAddr;
               dstAddr.addrMode = afAddr16Bit;
               dstAddr.endPoint = GREEN_POWER_INTERNAL_ENDPOINT;
    
               //command frame
               cmd.cmdId = GP_CHANNEL_CCONFIG_COMMAND_ID;
               cmd.payloadLen = sizeof(gpdChannelConfiguration_t);
               cmd.cmdPayload = zcl_mem_alloc( cmd.payloadLen );
    
               if (cmd.cmdPayload)
               {
                   (*(gpdChannelConfiguration_t*)cmd.cmdPayload).operationalChannel = _NIB.nwkLogicalChannel - 11;
                   (*(gpdChannelConfiguration_t*)cmd.cmdPayload).basic = TRUE;
                   (*(gpdChannelConfiguration_t*)cmd.cmdPayload).reserved = 0;
    
                   zclGp_SendGpResponseCommand(&dstAddr, &cmd);
                   zcl_mem_free(cmd.cmdPayload);
               }
           }
       }

    谢谢。

    克里斯蒂安·贝伦策尔·皮艾亚

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

    这似乎是一些进展。  请提供监听器日志。  此数据包与运行设置版本有何区别?  您已突出显示 NWK 层帧类型、但这不转换为 ZGP 命令。  您还可以将此数据包与其他 GP 命令数据包(列于 gp_common.h 中)进行比较、以确定差异。  此数据包是否使用了正确的安全密钥、您是否能够解密数据负载内容?

    此致、
    瑞安

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

    e2e.ti.com/.../7271.test1.zip

    您好、Ryan、

    当我尝试将文件作为捕获文件附加时,我收到了一条错误消息,因为这是我将扩展名更改为.zip。

    要查看捕获,请   再次将扩展名更改为捕获。

    谢谢。

    克里斯蒂安·贝伦策尔·皮艾亚

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

    谢谢、您是否还可以提供 Zigbee NWK 密钥(在监听通道的同时将常规 Zigbee 器件加入网络、或从 ZC/ZR 的 NV 信息)。  为什么您的监听器日志中没有发送至少链接状态更新的 ZC (短地址0x0000)?  您是否还能提供相同的工作/完整设置监听器日志?

    此致、
    瑞安

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

    e2e.ti.com/.../green_5F00_power_5F00_0x49.zip
    您好、Ryan、

    在附加的中、当通信正常时、您将找到带有传感器和其他接收器的捕获(请记住 将 扩展更 改为捕获 )。

    关于 ZigBee NWK 密钥、目前我正在使用示例中提供的默认密钥。

    谢谢。

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

    谢谢 Cristiane、

    现在、我实际上可以观察到正确的通道配置数据包、接下来我可以了解到 ZC/ZR 恒温器接收器不支持这种类型的 Zigbee 绿色电源数据包、因为这些项目不使用双边通信。  因此  、您需要在现有示例的基础上进行扩展、方法是参考绿色电源器件项目(例如 GPD_SWITCH)的 GreenPowerUnsecureDataFrameCommand Gp_Send。  您应该使用  工作设置的监听器日志 来 相应地正确填充 gpdfREQ_t 字段。

    为了便于了解、在构建网络时、ZC 在运行时随机化示例中的默认 Zigbee NWK 密钥。  因此、如果不提供其他信息、就无法获取特定网络的 Zigbee NWK 密钥。

    此致、
    瑞安

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

    早上好、Ryan。

    根据您的建议、现在我能够发送正确的数据包并接收来自传感器的调试。 谢谢你。

    但我觉得我发现了一个问题。

    当我收到调试软件包时、在 gp_sink.c 函数 gp_processCommissing 中 、len 变量仅增加一次 、但复制的数据较大、导致内存溢出、如所附视频中所示。

    我认为问题在于此部分:

    当长度增加时、以下语句:

    if ((pcommitingCmdPayload->options.securityKeyRequest == true)&&(pCommissingCmdPayload->extOptions.gpdKeyPresent == false))

    与复制数据的零件不同:

    if (!pcommitingCmdPayload->extOptions.gpdKeyPresent | pcommitingCmdPayload->options.securityKeyRequest == true)  

    导致数据被复制、但之前未分配内存区域(如您所见、len=1)。

    SDK 7.10中存在相同的行为。

    再次感谢您。

     e2e.ti.com/.../gp_5F00_sink_5F00_overflow.mp4

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

    您好、Cristiane:

    感谢您提供最新的调查结果。   这些结果并不是预期的、因为长度应该大于1。  您能否 在 gp_parseCommisioningCmd 调用之前和之后提供 pCommissingCmdPayload 的内容?  我将考虑使用我的可用硬件重现此行为的方法。  请注意、将"Project Properties"->"CCS Build"->"Arm Compiler"->"Optimization Level"设置为 "off"可以帮助您的分步调试更加线性。

    此致、
    瑞安

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

    您好、Ryan、

    并连接。

    谢谢。

    克里斯蒂安·贝伦策尔·皮艾亚

    e2e.ti.com/.../pCommissioningCmdPayload_5F00_hex.mp4

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

    您好、Cristiane:

    一切看起来都是正确的。   您能否概述 您预期的行为以及您看到的行为?  调试回复是否未发送或是否存在格式错误?

    此致、
    瑞安

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

    您好、Ryan、

    问题在于下一个 malloc (gp_sink.c 行1382) 由于内存溢出而耗尽堆内存、您可以在视频中看到。

    e2e.ti.com/.../OsalPort_5F00_msgAllocate_5F00_heap_5F00_overflow.mp4

    我还希望缩短调试窗口。 我试图使用"per_test_set_finding_1_min"的定义 ,并试图减少这个值 ppgcommitingWindow ,但我认为实际值是在其他地方定义的 ,因为使用的时间是由这个函数设置的: NLME_GetRemainingPermitJoiningDuration();  
    如何缩短调试窗口?

    谢谢。

    克里斯蒂安·贝伦策尔·皮艾亚

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

    谢谢 Cristiane。  这种行为超出了默认的 TI 示例操作范围、因此我再次鼓励您根据需要修改暴露的 GP 层、以解决该问题。  为了进一步调试、我将尝试在末端复制此行为、但此时不能作出任何承诺。

    GP 调试时间应取决于 ppgCommissingWindow。  您能否在 gp_commitingModeInd 内设置断点并查看 hasTime/Time 参数?  然后、 对于相同的 UI_SetGPPPCommissioningMode、您可以遵循此操作。

    此致、
    瑞安

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

    您好、Ryan、

    感谢您的建议、我将控制这一点 、我将再次收到我的调查结果。

    我有(抱歉)另一个疑问。

    我可以使用一个传感器完成程序、即调试并成功接收温度数据。

    但使用另一个传感器、我无法完成该过程。

    我的问题是:  

    我是否可以使用多个传感器执行调试程序并一次接收温度数据?  

    再次感谢、

    克里斯蒂安·贝伦策尔·皮艾亚

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

    我正在向 Zigbee 软件开发人员询问这方面的相关信息。  只是为了清楚起见、如果传感器是最早加入的传感器、可以对其进行调试吗?  只有第二个器件尝试调试哪一个失败了?  您是否具有尝试加入的第二个器件的监听器日志、来自 ZC GP 存根的响应与第一个不同?

    此致、
    瑞安

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

    您好、Ryan、

    在此捕获中、我使用2个传感器:0x03470049和0x03470050 。  

    传感器以49结束时、调试程序之前已执行、我可以成功接收温度数据。

     如您所见、在传感器以50结束时、调试过程会成功开始、但不会结束。 我无法接收温度数据。

    请记住、当我尝试附加 pcapng 文件时、我收到一条错误消息、因此该文件包含一个扩展的.zip。

    再次感谢、

    克里斯蒂安·贝伦策尔·皮艾亚

    e2e.ti.com/.../green_5F00_power_5F00_50_5F00_fail.zip

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

    传感器49和50似乎都在发送温度数据、但 ZC 在其应用中仅观察来自49的报告?  如果您使用 50传感器而不是49传感器重新开始测试、ZC 是否会观察50的温度报告、而不是49的?

    此致、
    瑞安

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

    是的、两个传感器都在发送温度数据、但 ZC 仅报告49。

    我尝试做这个测试、但50似乎从未完成该过程。

    在我所有的测试中、对于传感器50、测试过程 在调试回复中结束、您可以在监听器捕获中看到。

    再次感谢、

    克里斯蒂安·贝伦策尔·皮艾亚

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

    这两种不同类型的传感器吗?  我本希望任一传感器在与出厂复位 ZC GP 接收器单独使用时都具有相同的行为。  在适用的情况下、调试数据包显示相同。  我只在监听器日志中看到50条调试回复、而不是49条、因此很难比较这两者。  对于来自 ZC GP 接收器的回复、似乎没有内在的错误。

    在我自己的测试中、我能够确认默认的 ZC GP 受电方示例可以支持多个 GP 器件。  遗憾的是、TI 的 GP 器件示例不支持安全级别 或调试模式、因此难以从末端进一步调试您的行为。

    此致、
    瑞安

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

    早上好、Ryan、

    不、传感器的类型相同。 我在代码中进行了一些更改、现在我可以连接多个传感器。

    非常感谢您的帮助。

    克里斯蒂安·贝伦策尔·皮艾亚