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.

[参考译文] CC2652P:通过 Zstackapi_BdbRepChangedAttrValueReq()报告冻结器件

Guru**** 2465890 points
Other Parts Discussed in Thread: CC2652P

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

https://e2e.ti.com/support/wireless-connectivity/zigbee-thread-group/zigbee-and-thread/f/zigbee-thread-forum/1183514/cc2652p-reporting-with-zstackapi_bdbrepchangedattrvaluereq-freezing-the-device

器件型号:CC2652P

早上好、我正在尝试制作我的定制 CC2652P 器件(基于 ZR_genericapp 和 zed_genericapp)、以报告简单传感器端点的 AnalogInput 群集的"preseValue"属性、该属性位于器件内部的其他智能插头端点旁边。

我的器件连接到 Zigbee2Mqtt 实例、在该实例中、我开发了正确的自定义转换器以支持 ONOFF 和计量集群属性(不使用报告、只轮询和驱动)。

从 Z2M 前端来看,如果我发送的配置报告消息的最小报告间隔不为零(如图所示),则该报告工作正常。

但这不是我的应用的理想方案、在该方案中、我仅在更改属性时报告该属性。

几次前,Ryan 告诉我,使用图中的将最小和最大间隔设置为 NOPERIODIC 和 Nolimit (我在 bdb_interface.h 中看到都为零),只会在 Zstackapi_BdbRepedAttrValueReq ()触发时启用报告。

因此、我在 zcl_genericapp.c 任务中创建了一个周期性例程、该例程每5秒调用以下函数、以一个新的'RFID'值更新 preseValue 属性(我将使用该属性向我的服务器发送一个新的 RFID 标签、是)

void zclGenericApp_updateRFIDPresentValueAttribute(uint32_t rfid)
{

    rfid_presentValue = rfid;

#ifdef BDB_REPORTING
        zstack_bdbRepChangedAttrValueReq_t Req;

        Req.attrID = ATTRID_IOV_BASIC_PRESENT_VALUE;
        Req.cluster = ZCL_CLUSTER_ID_GENERAL_ANALOG_INPUT_BASIC;
        Req.endpoint = RFID_ENDPOINT;

        Zstackapi_bdbRepChangedAttrValueReq(appServiceTaskId, &Req);
#endif
}

问题是 Zstackapi_BdbRepChangedAttrValueReq 冻结了我的器件。

这仅在我从 Z2M 前端发送了配置报告消息后发生、如果我从未发送过该消息、而使报告处于禁用状态、则该函数仅通过而不报告任何内容、但不冻结。

我已经尝试调试该函数,现在我可以说它卡在"msgStatus = OsalPort_msgSend( stackServiceTaskId,(uint8_t*) pMsg );"

zstackapi.c.的第140行

如何继续?

衷心感谢您的帮助、我将不胜感激。

祝您愉快

Roberto

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

    尊敬的 Roberto:

    您的 zcl_genericapp.c 应用程序是否使用 了 Zstackapi_BdbRepAddAttrCfgRecordDefaultToListReq 为可报告属性记录添加默认配置值?此函数和 bdb_ProcessInConfigReportCmd 是否成功返回?  是否说明 Zstackapi_BdbRepedAttrValueReq API 无法输入 bdb_RepChangedAttrValue (后跟 bdb_RepReport)以进行进一步调试?  当您在 sendReqDefaultRsp 内部结束时、什么是调用栈?

    此致、
    Ryan

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

    您好、Ryan、谢谢。

    我没有调用 Zstackapi_bdbRepAddAttrCfgRecordDefaultToListReq、如果我从 Z2M 前端发送一条带有正确参数的显式配置报告消息、这对我不会有用。 正确吗?

    我在例程中单独调用了 Zstackapi_BdbRepedChangedAttrValueReq 并冻结了器件、它进入 sendReqDefaultRsp、 然后、OsalPort_msgSend、在这一点上、由于某种原因调试非常困难(调试指针跳转不是线性跳转、在反汇编过程中完成)、因此我知道它从未将该消息发送到 bdb 任务。

    所以... 我将优化级别从 z 更改为0、它运行良好、调试过程按预期进行、OsalPort_msgSend 成功返回。 我再次检查了它、它返回到 z、它再次冻结、现在我不打算考虑它。

    现在、我不想从 Z2M 前端页面手动发送配置报告、所以(如果我足够理解)我需要使用 Zstackapi_BdbRepAddAttrCfgDefaultRecordToListReq 向自己发送配置报告消息到 ZStack 任务、这是真的吗?

    如果是这样,我将在 zclGenericApp_Init()中以这种方式使用它。

        //Make the attribute reportable
        uint8_t repChange[] = {0,0,0,0};
        OsalPort_memcpy(Req.reportableChange, repChange, BDBREPORTING_MAX_ANALOG_ATTR_SIZE /*4*/);
        Req.attrID = ATTRID_IOV_BASIC_PRESENT_VALUE;
        Req.cluster = ZCL_CLUSTER_ID_GENERAL_ANALOG_INPUT_BASIC;
        Req.endpoint = RFID_ENDPOINT;
        Req.maxReportInt = BDBREPORTING_NOPERIODIC;
        Req.minReportInt = BDBREPORTING_NOLIMIT;
    
        if (Zstackapi_bdbRepAddAttrCfgRecordDefaultToListReq(appServiceTaskId, &Req) != zstack_ZStatusValues_ZSuccess) {
            // Failed to make the attribute reportable
            LED_setOn(gRedLedHandle, LED_BRIGHTNESS_MAX);
        }

    并且它成功返回、但调用 Zstackapi_BdbRepedAttrValueReq 时仍然不发送报告。 在我再次从 Zigbee2Mqtt 实例发送显式配置报告消息之前、在这种情况下、它最终开始发送它们。

    我已经在包含 bdb_ProcessInConfigReportCmd 的 processBdbProcessInConfigReportReq 中放置了一个断点、正如我预期在 Zstackapi_BdbRepAddAttrCfgDefaultRecordToListReq 将消息成功发送到 ZStack 任务之后将该消息输入的那样。

    我缺少什么?

    编辑:

    Zstackapi_BdbRepAddAttrCfgRecordDefaultToListReq 向进入的 ZStack 任务发送消息

    进入的 processBdbRepAddAttrCfgRecordDefaultToListReq

    BDB_RepAddAttrCfgRecordDefaultToList

    最后一个函数成功返回、但在 Z2M 发出显式配置报告之前、仍然不发送报告

    编辑2:

    调试调用不起作用的 Zstackapi_BdbRepChangedAttrValueReq、我看到它在 bdb_RepChangedAttrValue 中退出

      if( bdb_reportingClusterEndpointArray[indexClusterEndpoint].consolidatedMaxReportInt == BDBREPORTING_REPORTOFF )
      {
        //reporting if off for this cluster
        return ZSuccess;
      }

    整合的 MaxReportInt 为0xFFF... 但是在 Zstackapi_BdbRepAddAttrCfgRecordDefaultToListReq 请求中、我的 maxInterval 为0

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

    如果从 zigbee2mqtt 前端发送配置报告消息,则不必调用 Zstackapi_BdbRepAddAttrCfgDefaultRecordToListReq。  只有  当集群/属性正确绑定到前端的端点时、使用 Zstackapi_BdbRepAddAttrCfgRecordDefaultToListReq 才有效。  从 zigbee2mqtt 配置报告消息成功,因为它们提供了目标端点。  因此、您需要在传感器上执行绑定请求、以使属性报告生效、否则将不会启用报告。

    此致、
    Ryan

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

    好的、谢谢、您能不能指出需要进行 zigbee2mqtt 端配置的正确绑定请求 API 来执行此操作吗? 我正在查看 此文档 、但我不清楚如何创建从我的设备到协调器的绑定

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

    正确 的监视和测试 API 为 ZDO_BUST_REQ (ZNP)、对于 Z-Stack API (应用级)、它 为 Zstackapi_ZdoBindReq。  这将需要目标器件的 NWK 地址、源端点和 IEEE 地址、目标端点和 IEEE 地址以及群集 ID。  Zigbee2MQTT 有 一个论坛 、您可以通过其软件与之联系以获取进一步支持。  

    此致、
    Ryan

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

    感谢 Ryan、几分钟前我使用 Z2M 自定义转换器配置的"配置"部分解决了这个问题、以便在配对后立即向器件发送正确的配置报告消息和绑定。

    现在、检测到 RFID 标签、器件会发送一个属性报告、Z2M 将其转换为包含以下字段的 MQTT 消息:{...、"RFID":3.9265504009152834e-40}。

    这当然不是最干净的解决方案,忽略了 preseValue 属性具有浮点类型这一事实。

    您对更好的群集属性有什么建议吗?在该属性中、我可以传递我的 RFID 代码以将其通知服务器?

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

    这将取决于属性的数据类型以及 Zigbee2MQTT 如何处理来自每个属性的消息。  我建议联系 Zigbee2MQTT 开发人员以获得进一步帮助。

    此致、
    Ryan