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.

[参考译文] LP-CC2652RB:无法设置多个端点集群的自动报告-#;属性

Guru**** 2465890 points
Other Parts Discussed in Thread: SYSCONFIG, Z-STACK, UNIFLASH, LP-CC2652RB

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

https://e2e.ti.com/support/wireless-connectivity/zigbee-thread-group/zigbee-and-thread/f/zigbee-thread-forum/1169911/lp-cc2652rb-could-not-setup-automatic-reporting-of-multiple-endpoints-clusters-attributes

器件型号:LP-CC2652RB
Thread 中讨论的其他器件:SysConfigZ-stackUNIFLASH

早上好。

我正在开发一 个定制路由器(基于 ZR_genericapp)固件、用作多端点智能插头

根据 Ryan 的提示和 关于 多个端点的黄杰文章、我成功地设置了8个 "智能插头"类型的端点(使用计量和开/关集群)、其属性和回调(测试正常)。

现在、我尝试为8个端点的两个群集配置 OnOff 和 CurrentSummationDelivered 属性的报告。

我在 ZNP 协调器上使用 Zigbee2Mqtt 软件、通过前端、我可以成功发送配置报告消息。 但我一直处于某种存储器限制、我尝试解释一下:

如果我仅配置4个端点、则会正确报告每个属性、并且在前端总共可以看到8条报告属性消息(4条 OnOff 消息和4条 CurrentSummationDelivered 消息)。

如果我配置了4个以上的端点、则该报告仅适用于最后一个端点属性。

我发现我必须对 Stack/bdb/bdb_interface.h 中的某些定义执行操作:

//您的作业:根据您的应用程序设置此值
//任何中注册的可报告属性使用的最大字节数
//应用端点(模拟属性)

BDBREPORTING_MAX_ANALOG_ATTR_SIZE 8 -我怀疑我必须使其至少为64 (8 (CurrentSummationDelivered 属性)乘以8字节(uint64)))、但支持的最大值为8、我缺少什么?

//您的作业:根据您的应用程序设置此值
//任何端点中具有可报告属性的群集的最大数量
//(例如 2个具有具有可报告属性的同一群集的端点计为2、
//无论群集中可报告的属性的数量如何)

BDB_MAX_CLUSTERENDPOINTS_REPORTING 16 (8个端点乘以2个具有可报告属性的群集)默认值为5。

在这种情况下、在协调器配置报告消息后、模块仅报告一次最后4-5个端点的属性(非常规)、然后冻结。

我还将绑定表大小增加到了16,默认值为4。

请您提供任何建议、我们将不胜感激。

提前感谢您。

Roberto

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

    您好、Roberto、

    感谢您的详细描述。   BDBREPORTING_MAX_ANALOG_ATTR_SIZE 是单个模拟属性的最大字节大小、因此根据属性的需求、大小应为4或8。  根据  您的应用说明、将 BDB_MAX_CLUSTERENDPOINTS_REPORTING 设置为16似乎是正确的、我假设您增加了 SysConfig -> Z-Stack -> Advanced -> Max Table Size -> Binding Table Size?  

    否则、您似乎已经考虑了重要的定义。  您可以将其提高到超过预期 要求的水平、以确定这是否会改变行为。  您能否调试 zr_genericapp 以发现其冻结的原因?  

    您可以尝试 增加非易失性存储器分配 、尽管我认为这不是问题。  在重新编程新设置之前、您是否确保完成器件擦除或恢复出厂设置(即删除所有 NV 存储器)?  

    如果删除了一个可报告属性群集,那么是否所有八个终结点都报告了另一个群集属性?  这可能需要有关如何在应用程序中设置群集/属性和端点的更多详细信息。

    此致、
    Ryan

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

    你好、Ryan。 再次感谢您的支持

    是的、我已将 SysConfig 中的绑定表大小增加到16、但这似乎还不够。

    然后、我将 BDBREPORTING_MAX_ANALOG_ATTR_SIZE 设置为8 (因为 CurrentSummationDelivered 属性是 uint64_t)、并将 BDB_MAX_CLUSTERENDPOINTS_REPORTING 设置为16 (因为8个端点中的每个端点都有2个具有可报告属性的群集)。

    我还将非易失性存储器从2页增加到3页。 没有区别。

    现在、我只能尝试调试 ZStack 线程、但我认为这可能不是很容易。
    我可以尝试搜索哪些其他信息?

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

    是否可以尝试将绑定表大小和  BDB_MAX_CLUSTERENDPOINTS_REPORTING 分别增大到32?   在重新编程新设置之前、您是否确保完成器件擦除或恢复出厂设置(即删除所有 NV 存储器)?  如果删除了一个可报告属性群集,那么是否所有八个终结点都报告了另一个群集属性?  您对在我的系统上重新创建此行为有什么建议吗?

    此致、
    Ryan

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

    我将 BDB_MAX_CLUSTERENDPOINTS_REPORTING 和绑定表大小增加到了32。

    我通常使用 launchpad 的 btn2 + RESET 在不同的重新闪存之间擦除 NV 存储器、现在我还在 Uniflash 软件中执行完全闪存擦除以确保无误。

    当前的报告情况,在协调员发送的所有16条“配置报告”消息之后,是定期接收相同的部分模式,如下所示:

    您可以看到、我的器件缺少端点2和1、但这不是常规的、有时情况更糟、并且随机丢失了更多端点。

    一段时间后、在这种情况下、6分钟后、它将完全停止发送报告和响应命令("切换"命令和读取属性尝试会导致超时)。 此外、我通常用于离开网络的 btn2不再工作。

    -如果我尝试仅为要报告的每个端点配置一个属性群集(例如,只有"OnOff"属性而不是"CurrentSummationDelivered"),则协调器只发送8条"配置报告"消息,现在我可以通过每个端点正确接收8条单一属性, 不会发生崩溃、并且"离开"按钮正在工作。 如果我仅删除'OnOff'并设置'CurrentSummationDelivered'的报告,也会发生同样的情况。

    如果您想在 LP-CC2652RB 电路板上重现此问题、请使用我的电路板。 我想您只需按照 黄根文的文章 制作8个端点即可。 我可以在这里共享克隆8次的共享 zclGenericApp_Attrs (zclGenericApp_Attrs_2、zclGenericApp_Attrs_3等)。 和为8个端点共享的 zclGenericApp_SimpleDesc。 此外,我还共享了 zclGenericApp_Init()函数,该函数仍处于实验阶段,我将尝试使端点生成过程中的任何数字,但这可能是另一个问题。

    static void zclGenericApp_Init( void )
    {
      ///////////// Add the led ////////////////
      LED_Params ledParams;
      LED_Params_init(&ledParams);
      gRedLedHandle = LED_open(CONFIG_LED_RED, &ledParams);
      //////////////////////////////////////////////
    
      ////////////// Add my timer ////////////////
      Timer_Params_init(&myTimerParams);
      myTimerParams.periodUnits = Timer_PERIOD_US;
      myTimerParams.period = 1e3;
      myTimerParams.timerMode  = Timer_CONTINUOUS_CALLBACK;
      myTimerParams.timerCallback = myTimerCallbackFunction;
      myTimerHandle = Timer_open(CONFIG_TIMER_0, &myTimerParams);
    
      if (myTimerHandle == NULL) {
          // Timer_open() failed
          while (1);
      }
    
      if (Timer_start(myTimerHandle) == Timer_STATUS_ERROR) {
          // Timer_start() failed
          while (1);
      }
      //////////////////////////////////////////////
    
      ////////////// Add Meter Inputs /////////////
      GPIO_setCallback(CONFIG_GPIO_PULSEIN_MET_1, MeterPulseInCallback);
      GPIO_enableInt(CONFIG_GPIO_PULSEIN_MET_1);
      //////////////////////////////////////////////
    
      // Set destination address to indirect
      zclGenericApp_DstAddr.addrMode = (afAddrMode_t)AddrNotPresent;
      zclGenericApp_DstAddr.endPoint = 0;
      zclGenericApp_DstAddr.addr.shortAddr = 0;
    
      Initialize_UI();
    
      for (uint8_t endId = 1; endId <= ENDPOINTS_NUMBER; endId++) {
          //Register Endpoints
          zclGenericAppEpDesc[endId-1].endPoint = endId;
          zclGenericApp_SimpleDesc.EndPoint = endId;
          zclGenericAppEpDesc[endId-1].simpleDesc = &zclGenericApp_SimpleDesc;
    
          if (!zclport_registerEndpoint(appServiceTaskId, &zclGenericAppEpDesc[endId-1])) {
              // Failed to register endpoint
              LED_setOn(gRedLedHandle, LED_BRIGHTNESS_MAX);
          }
    
          // Register the ZCL General Cluster Library callback functions
          if (zclGeneral_RegisterCmdCallbacks( endId, &zclGenericApp_CmdCallbacks ) != SUCCESS) {
              // Failed to allocate callbacks
              LED_setOn(gRedLedHandle, LED_BRIGHTNESS_MAX);
          }
    
          if (zclSE_RegisterCmdCallbacks( endId, &zclGenericApp_SECmdCallbacks ) != SUCCESS) {
              // Failed to allocate callbacks
              LED_setOn(gRedLedHandle, LED_BRIGHTNESS_MAX);
          }
    
          // Register the application's attribute list
          zclGenericApp_ResetAttributesToDefaultValues();
    
          switch (endId)
          {
          case 1:
              if (zcl_registerAttrList(endId, zclGenericApp_NumAttributes, zclGenericApp_Attrs) != SUCCESS) {
                // Failed to register attributes list
                LED_setOn(gRedLedHandle, LED_BRIGHTNESS_MAX);
              };
            break;
          case 2:
              if (zcl_registerAttrList(endId, zclGenericApp_NumAttributes, zclGenericApp_Attrs_2) != SUCCESS) {
                // Failed to register attributes list
                LED_setOn(gRedLedHandle, LED_BRIGHTNESS_MAX);
              };
            break;
          case 3:
              if (zcl_registerAttrList(endId, zclGenericApp_NumAttributes, zclGenericApp_Attrs_3) != SUCCESS) {
                // Failed to register attributes list
                LED_setOn(gRedLedHandle, LED_BRIGHTNESS_MAX);
              };
            break;
          case 4:
              if (zcl_registerAttrList(endId, zclGenericApp_NumAttributes, zclGenericApp_Attrs_4) != SUCCESS) {
                // Failed to register attributes list
                LED_setOn(gRedLedHandle, LED_BRIGHTNESS_MAX);
              };
            break;
          case 5:
              if (zcl_registerAttrList(endId, zclGenericApp_NumAttributes, zclGenericApp_Attrs_5) != SUCCESS) {
                // Failed to register attributes list
                LED_setOn(gRedLedHandle, LED_BRIGHTNESS_MAX);
              };
            break;
          case 6:
              if (zcl_registerAttrList(endId, zclGenericApp_NumAttributes, zclGenericApp_Attrs_6) != SUCCESS) {
                // Failed to register attributes list
                LED_setOn(gRedLedHandle, LED_BRIGHTNESS_MAX);
              };
            break;
          case 7:
              if (zcl_registerAttrList(endId, zclGenericApp_NumAttributes, zclGenericApp_Attrs_7) != SUCCESS) {
                // Failed to register attributes list
                LED_setOn(gRedLedHandle, LED_BRIGHTNESS_MAX);
              };
            break;
          case 8:
              if (zcl_registerAttrList(endId, zclGenericApp_NumAttributes, zclGenericApp_Attrs_8) != SUCCESS) {
                // Failed to register attributes list
                LED_setOn(gRedLedHandle, LED_BRIGHTNESS_MAX);
              };
            break;
          default:
            break;
          }
    
            // TODO find a better way like this
            //       if (zcl_registerAttrList(endId, zclGenericApp_NumAttributes, zclGenericApp_Attrs_Array[endId]) != SUCCESS) {
            //           // Failed to register attributes list
            //           LED_setOn(gRedLedHandle, LED_BRIGHTNESS_MAX);
            //       };
    
          // Register the Application to receive the unprocessed Foundation command/response messages
          if (!zclport_registerZclHandleExternal(endId, zclGenericApp_ProcessIncomingMsg)) {
              // Failed to register the application
              LED_setOn(gRedLedHandle, LED_BRIGHTNESS_MAX);
          };
      }
    
    #if !defined (DISABLE_GREENPOWER_BASIC_PROXY) && (ZG_BUILD_RTR_TYPE)
      gp_endpointInit(appServiceTaskId);
    #endif
    
      //Write the bdb initialization parameters
      zclGenericApp_initParameters();
    
      //Setup ZDO callbacks
      SetupZStackCallbacks();
    
    for (uint8_t endId = 1; endId <= ENDPOINTS_NUMBER; endId++) {
    
        #ifdef ZCL_DISCOVER
          // Register the application's command list
          zcl_registerCmdList( endId, zclCmdsArraySize, zclGenericApp_Cmds );
        #endif
    
         #ifdef ZCL_DIAGNOSTIC
           // Register the application's callback function to read/write attribute data.
           // This is only required when the attribute data format is unknown to ZCL.
           zcl_registerReadWriteCB( endId, zclDiagnostic_ReadWriteAttrCB, NULL );
    
           if ( zclDiagnostic_InitStats() == ZSuccess )
           {
             // Here the user could start the timer to save Diagnostics to NV
           }
         #endif
    
    }

    CONST zclAttrRec_t zclGenericApp_Attrs[] =
    {
      // *** General Basic Cluster Attributes ***
      {
        ZCL_CLUSTER_ID_GENERAL_BASIC,             // Cluster IDs - defined in the foundation (ie. zcl.h)
        {  // Attribute record
          ATTRID_BASIC_HW_VERSION,            // Attribute ID - Found in Cluster Library header (ie. zcl_general.h)
          ZCL_DATATYPE_UINT8,                 // Data Type - found in zcl.h
          ACCESS_CONTROL_READ,                // Variable access control - found in zcl.h
          (void *)&zclGenericApp_HWRevision  // Pointer to attribute variable
        }
      },
      {
        ZCL_CLUSTER_ID_GENERAL_BASIC,
        { // Attribute record
          ATTRID_BASIC_ZCL_VERSION,
          ZCL_DATATYPE_UINT8,
          ACCESS_CONTROL_READ,
          (void *)&zclGenericApp_ZCLVersion
        }
      },
      {
        ZCL_CLUSTER_ID_GENERAL_BASIC,
        { // Attribute record
          ATTRID_BASIC_MANUFACTURER_NAME,
          ZCL_DATATYPE_CHAR_STR,
          ACCESS_CONTROL_READ,
          (void *)zclGenericApp_ManufacturerName
        }
      },
      {
        ZCL_CLUSTER_ID_GENERAL_BASIC,
        { // Attribute record
          ATTRID_BASIC_MODEL_IDENTIFIER,
          ZCL_DATATYPE_CHAR_STR,
          ACCESS_CONTROL_READ,
          (void *)zclGenericApp_ModelName
        }
      },
      {
        ZCL_CLUSTER_ID_GENERAL_BASIC,
        { // Attribute record
          ATTRID_BASIC_POWER_SOURCE,
          ZCL_DATATYPE_ENUM8,
          ACCESS_CONTROL_READ,
          (void *)&zclGenericApp_PowerSource
        }
      },
      {
        ZCL_CLUSTER_ID_GENERAL_BASIC,
        { // Attribute record
          ATTRID_BASIC_PHYSICAL_ENVIRONMENT,
          ZCL_DATATYPE_ENUM8,
          (ACCESS_CONTROL_READ | ACCESS_CONTROL_WRITE),
          (void *)&zclGenericApp_PhysicalEnvironment
        }
      },
      {
        ZCL_CLUSTER_ID_GENERAL_BASIC,
        {  // Attribute record
          ATTRID_CLUSTER_REVISION,
          ZCL_DATATYPE_UINT16,
          ACCESS_CONTROL_READ,
          (void *)&zclGenericApp_basic_clusterRevision
        }
      },
    
    #ifdef ZCL_IDENTIFY
      // *** Identify Cluster Attribute ***
      {
        ZCL_CLUSTER_ID_GENERAL_IDENTIFY,
        { // Attribute record
          ATTRID_IDENTIFY_IDENTIFY_TIME,
          ZCL_DATATYPE_UINT16,
          (ACCESS_CONTROL_READ | ACCESS_CONTROL_WRITE),
          (void *)&zclGenericApp_IdentifyTime
        }
      },
    
      {
        ZCL_CLUSTER_ID_GENERAL_IDENTIFY,
        {  // Attribute record
          ATTRID_CLUSTER_REVISION,
          ZCL_DATATYPE_UINT16,
          ACCESS_CONTROL_READ,
          (void *)&zclGenericApp_identify_clusterRevision
        }
      },
    #endif
    
    //////////////////////////////////// ADDED ATTRIBUTES /////////////
    #ifdef ZCL_SE_METERING_SERVER
      // *** Smart Energy Metering Server Cluster Attributes ***
      {
       ZCL_CLUSTER_ID_SE_METERING,
        { // Attribute record
          ATTRID_SE_METERING_CURR_SUMM_DLVD,
          ZCL_DATATYPE_UINT48,
    //      ACCESS_CONTROL_READ, // Set attribute reportable manually
          ACCESS_CONTROL_READ | ACCESS_CONTROL_WRITE | ACCESS_REPORTABLE,
          (void *)&zclGenericApp_CurrentSummationDelivered[0]
        }
      },
      {
       ZCL_CLUSTER_ID_SE_METERING,
        { // Attribute record
          ATTRID_SE_METERING_STATUS,
          ZCL_DATATYPE_BITMAP8,
          ACCESS_CONTROL_READ,
          (void *)&zclGenericApp_Metering_Status[0]
        }
      },
      {
       ZCL_CLUSTER_ID_SE_METERING,
        { // Attribute record
          ATTRID_SE_METERING_UOM,
          ZCL_DATATYPE_ENUM8,
          ACCESS_CONTROL_READ,
          (void *)&zclGenericApp_UnitofMeasure[0]
        }
      },
      {
       ZCL_CLUSTER_ID_SE_METERING,
        { // Attribute record
          ATTRID_SE_METERING_SUMM_FMTG,
          ZCL_DATATYPE_BITMAP8,
          ACCESS_CONTROL_READ,
          (void *)&zclGenericApp_SummationFormatting[0]
        }
      },
      {
       ZCL_CLUSTER_ID_SE_METERING,
        { // Attribute record
          ATTRID_SE_METERING_DEVICE_TYPE,
          ZCL_DATATYPE_BITMAP8,
          ACCESS_CONTROL_READ,
          (void *)&zclGenericApp_MeteringDeviceType[0]
        }
      },
      {
       ZCL_CLUSTER_ID_SE_METERING,
        {  // Attribute record
          ATTRID_CLUSTER_REVISION,
          ZCL_DATATYPE_UINT16,
          ACCESS_CONTROL_READ,
          (void *)&zclGenericApp_metering_clusterRevision
        }
      },
    #endif // ZCL_SE_METERING_SERVER
    #ifdef ZCL_ON_OFF
      // *** On/Off Cluster Attributes ***
      {
        ZCL_CLUSTER_ID_GENERAL_ON_OFF,
        { // Attribute record
          ATTRID_ON_OFF_ON_OFF,
          ZCL_DATATYPE_BOOLEAN,
          ACCESS_CONTROL_READ | ACCESS_REPORTABLE | ACCESS_CONTROL_WRITE,
          (void *)&zclGenericApp_OnOff[0]
        }
      },
      {
        ZCL_CLUSTER_ID_GENERAL_ON_OFF,
        {  // Attribute record
          ATTRID_CLUSTER_REVISION,
          ZCL_DATATYPE_UINT16,
          ACCESS_CONTROL_READ,
          (void *)&zclGenericApp_onoff_clusterRevision
        }
      },
    #endif // ZCL_ON_OFF
    ///////////////////////////////////////////////////////////////////
    
    };
    SimpleDescriptionFormat_t zclGenericApp_SimpleDesc =
    {
      GENERICAPP_ENDPOINT,                  //  int Endpoint;
      ZCL_HA_PROFILE_ID,                     //  uint16_t AppProfId;
      ZCL_DEVICEID_SMART_PLUG,              //  uint16_t AppDeviceId;
      GENERICAPP_DEVICE_VERSION,            //  int   AppDevVer:4;
      GENERICAPP_FLAGS,                     //  int   AppFlags:4;
      ZCLGENERICAPP_MAX_INCLUSTERS,         //  byte  AppNumInClusters;
      (cId_t *)zclGenericApp_InClusterList, //  byte *pAppInClusterList;
      ZCLGENERICAPP_MAX_OUTCLUSTERS,        //  byte  AppNumInClusters;
      (cId_t *)zclGenericApp_OutClusterList //  byte *pAppInClusterList;
    };

    我知道它可能不是那么有趣。 但我认为我正确地遵循了所有的指导和提示,所以这种行为和冻结的前景并不好。

    此外、我希望不相关的详细信息、在 zclGenericApp_Attrs 中、我设置了 Attribute CurrentSummationDelivered 可报告和可写入设置了访问控制标志:ACCESS_CONTRAL_READ | ACCESS_CONTRAL_WRITE | ACCESS_REportable。 默认情况下、它仅可读取、仅具有 ACCESS_CONTRAL_READ。

    非常感谢您的任何建议。

    祝你度过美好的一天!

    Roberto

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

    感谢您提供所有这些信息。  根据您对崩溃行为的描述、这似乎是内存泄漏。  如果仅报告一个属性时不发生这种情况、则必须由每个端点的多个属性报告引起。  奇怪的是、在减少端点数量时不会出现该行为。  它们是否都在排队等待同时发送?  您应该考虑增加 NWK_globals.c 内的 NWK_MAX_DATAABUFS_*,最好是这些端点属性报告可以交错。  您是否有此行为的监听器日志?  我 需要一些时间才能复制和进一步调查这种行为。  将  CurrentSummationDelivered 设置 为 ACCESS_REportable 不是 ZCL 7规范建议的设置、但它不应影响 Z-Stack 操作。

    此致、
    Ryan

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

    早上好、Ryan。 再次感谢您的建议。

    我尝试增加这些缓冲器限制、如下所示:

    // Maximums for the data buffer queue
    // #define NWK_MAX_DATABUFS_WAITING    8     // Waiting to be sent to MAC
    // #define NWK_MAX_DATABUFS_SCHEDULED  5     // Timed messages to be sent
    // #define NWK_MAX_DATABUFS_CONFIRMED  5     // Held after MAC confirms
    // #define NWK_MAX_DATABUFS_TOTAL      12    // Total number of buffers
    
    #define NWK_MAX_DATABUFS_WAITING    (8*4)     // Waiting to be sent to MAC
    #define NWK_MAX_DATABUFS_SCHEDULED  (5*4)     // Timed messages to be sent
    #define NWK_MAX_DATABUFS_CONFIRMED  (5*4)     // Held after MAC confirms
    #define NWK_MAX_DATABUFS_TOTAL      (12*4)    // Total number of buffers

    没有区别。

    然后我尝试从协调器前端逐一发送报告配置消息、它似乎一直运行正常、直到最多有8个可报告属性(如果4个端点有8个不同的端点、每个端点有2个可报告属性则无关紧要)、 当我尝试添加其他可报告属性而不是8时、似乎开始冻结并丢失消息。

    现在、我无法及时生成交错报告、似乎芯片会自动尝试同时报告所有报告、无论我之前发送给它的报告配置消息的时间如何、 您还记得是否有相关设置吗? 我试图搜索但没有成功。

    现在我没有设置任何监听器、这里还有一些其他 LaunchPad、我知道可以使用其中一个来实现这一目的、 但我避免了这种情况、因为乍一看、它似乎对我的需求没有帮助(我在文档中看到了一些 Wireshark 屏幕截图、毕竟、您只能在那里看到低级 Zigbee 消息、没有任何类型的解码、也许其他地方还会有更多解码)。 我将尝试设置监听器并发布日志。

    您是否还记得 CCS 是否在调试模式下提供某种存储器使用情况监视器、这对于确定问题何时开始存在非常有用? 或者、在调试 ZStack 线程以搜索关键点时、您有什么建议吗? 对我来说,似乎是在一个海草堆中搜寻一根针。

    Roberto

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

    您好、Roberto、

    感谢您尝试这些新定义,您是否还可以尝试从 Stack/Config/f8wrouter.opts 中增加 MAC_CFG_TX*?  

    属性报告基于单个计时器、因此很难错开报告、但您可以为不同的端点/群集配置不同的 maxReportInt、以便它们以不同的间隔进行报告。

    请参阅 《Z-Stack 用户指南》的调试部分。

    此致、
    Ryan

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

    你好、Ryan。 早上好。

    我尝试增加这些限制、如下所示:

    -DMAC_CFG_TX_DATA_MAX=(5*3)
    -DMAC_CFG_TX_MAX=(8*3)
    -DMAC_CFG_RX_MAX=(5*3)

    没有区别。

    然后、我最终成功地区分了两类群集属性(开/关为7、CurrentSummationDelivered 为13)的 maxReportInt 参数、这使我能够从设备中完美地获得所有报告。 因此、我们可以确认、如果将 maxReportInt 设置为5和10、则问题会在同时调度任务时发生、如果发生周期冲突、问题也会再次出现。

    这可能是一个非常有用的功能、但现在我的疑问尚未完成、我们的项目包含一条使用2652P 模块的 N 个路由器直线(N 可能至少30到200个)(目前我正在 RB Launchpad 上进行开发)。

    自动属性报告方式是否比轮询方式更方便? 跳数的数量与数量级相同、下面是两种配置之间的比较(x =器件、y =获取每个节点计量的最小跳数):

    但现在我担心报告的同时可能会出现过多的报告。 协议是否足够智能、以避免错过报告、因为有如此多的设备计划在数分钟内报告其属性? 或者、我可以简单地同时轮询其中的每一个、以确保正确吗?

    我可能会在另一个主题中继续讨论这些问题和其他问题。 感谢 Ryan 为我们提供了所有非常有用和随时可用的支持!

    祝你度过美好的一天!

    Roberto

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

    我很高兴听到更改报告间隔可以提高您的系统性能。  我将与软件研发团队核实同时将多条消息排队到输出缓冲区的限制。

    选择轮询还是报告是开发人员根据其应用需求做出的决定。  仍可通过将 maxInterval 设置为 BDBREPORTING_NOPERIODIC 并在 BDBREPORTING_Nolimit 处启用报告、以便仅在使用 Zstackapi_BdbRepedAttrValueReq ()时报告值

    RX 缓冲器的数量和 SimpleLink 器件一次处理多个传入数据包的能力也存在限制、因此需要实施可靠的报告交错方法。  跳数也与强大的 Zigbee 网状网络有关、通常包含不超过250个 ZR 和 Zed 器件、这些器件的分区范围最多约为10个跳。  SWRA650中提供了一个 Z-Stack 大型网络性能示例。  您将需要确定如何确保30跳的节点能够可靠地到达其目的地。

    此致、
    Ryan