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.

[参考译文] CC2530:向报告添加 INT24后,UINT48报告错误

Guru**** 2539500 points


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

https://e2e.ti.com/support/wireless-connectivity/zigbee-thread-group/zigbee-and-thread/f/zigbee-thread-forum/1075994/cc2530-uint48-reporting-wrong-after-adding-an-int24-to-reportables

部件号:CC2530
“线程:测试”中讨论的其它部件

使用读取属性时,响应正常:

命令:读取属性响应(0x01)
状态记录,提示:500
属性:客户端:功能通知标志/服务器:提供的当前汇总(0x0000)
状态:成功(0x00)
数据类型:48位无符号整数(0x25)
Uint48:500 (0x00000000000001f4)

但是,当报告相同的属性以及入口温度时,“随机”数据将从第5个字节向上添加:

命令:报告属性(0x0a)
属性字段,Int24:2358
属性:入口温度(0x0017)
数据类型:24位签名整数(0x2a)
国际电话:2358
属性字段,提示:179869684
属性:客户端:功能通知标志/服务器:提供的当前汇总(0x0000)
数据类型:48位无符号整数(0x25)
Uint48:179869684 (0x00000004000001f4)

短时间内的其他唯一无效值包括:

Uint48:179869684 (0x00000004000001f4)
Uint48:390842024436 (0x0000005b000001f4)
Uint48:880468296180 (0x000000cd000001f4)
Uint48:93458488361460 (0x00005500000001f4)
Uint48:94227287507444 (0x000055b3000001f4)
Uint48:94373316395508 (0x000055d5000001f4)
Uint48:94386201297396 (0x000055d8000001f4)

我检查了48位值所在的数据存储器(在属性定义中指向),它始终正确显示“500”值。

在将入口温度添加到报告中之前,报告的该值为正常值。  我想,BDB 报告代码中存在问题。


ZCL_cluster_ID_SE_计 量,//群集 ID -在基础(即 zcl.h)中定义-智能能源(SE)群集
{//属性记录
ATTRID_SE_计 量_CURR_SUMM_DLVD,// 0x0000
ZCL_datatype_UINT48,
ACCESS_CONTACT_READ | ACCESS_REPORTable,
(void *)测量信息。Wh_meter
}
},

ZCL_cluster_ID_SE_计 量,
{//属性记录
ATTRID_SE_计 量_进口温度,// 0x0017
ZCL_datatype _INT24,//字符串足够 int24,但在 ZCL 中也是如此
ACCESS_CONTACT_READ | ACCESS_REPORTable,
(void *)内含温度(&I)
}
},

此外,以下代码将放置在适当的位置以通知更改:

UINT8状态= bdb_RepChangedAttrValue()
APP_EndPoint,
ZCL_cluster_ID_SE_计 量,
ATTRID_SE_计 量_INVE_TEMP
);

UINT8状态= bdb_RepChangedAttrValue()
APP_EndPoint
ZCL_cluster_ID_SE_计 量,
ATTRID_SE_计 量_INST_DMD
);

它们在初始化过程中设置:

BDB_RepAddAttrCfgRecordDefaultToList (app_endpoint,ZCL_cluster_ID_SE_godgy,ATTRID_SE_goding_INST_DMD,REP_INTERVAL_60s,REP_INTERVAL_5M, 报告更改1);
BDB_RepAddAttrCfgRecordDefaultToList (app_endpoint,ZCL_cluster_ID_SE_goding_ATTRID_SE_goding_Curr_SUMM_DLVD,REP_INTERVAL_60s,REP_INTERVAL_5M, 报告 Change50);
BDB_RepAddAttrCfgRecordDefaultToList (app_endpoint,ZCL_cluster_ID_SE_goding_Matgering,ATTRID_SE_Meting_Inlet _TEMP,REP_INTERVAL_60s,REP_INTERVAL_5M, 报告 Change50);

您对此有何建议?

我在最新的 ZStack 3.0.2中安装了补丁程序。

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

    你好,马里奥,

    要清楚一点,您是否已应用了 已知问题的#22并修复了 E2E 帖子?  在   从 bdb_RepReport 调用 zcl_StackSendReportCmd 之前,是否可以进行调试以确定 pReportCmd 的值?  如果此值与预期的相同,请提供属性报告的嗅探器日志。  如果这也是正确的结构,那么在 zclParseInReportCmd 期间,目的地对其进行解析的方式存在问题,此时 需要调试 reportCmd。

    此致,
    瑞安

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

    感谢您的反馈。

    1.我使用了一个比较工具来比较#22和所用的 ov bdb_RepReport 版本:完全相同的代码。

    2.使用 Wireshark 解码:

    带有已解码 ASCI 的嗅探器日志-密钥位于.log 文件中:

    e2e.ti.com/.../bdb_5F00_reportIssue.zip

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

    这可能只是 因为 BDBREPORTING_MAX_ANSION_ATTR_SIZE=4。

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

    感谢您确认报告设备上存在此问题。  问题当然可能是 由 BDBREPORTING_MAX_ANSION_ATTR_SIZE 引起的,您可以从 bdb_interface.h 更改该值并进行进一步测试。  请确保 每个属性的 reportableChange50大小都是正确的。

    此致,
    瑞安

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

    我将  BDBREPORTING_MAX_ANSION_ATTR_SIZE 更改为6,这不是常见的情况,“可导出 Change50”不再定义,因为它取决于此值。  我还必须在库中添加一个案例。

    我已经跑了20分钟或更长时间,似乎表现更好,但我还没有收到双重报告。

    由于这些变化,我想进口温度没有再检测到可报告的变化,这仅仅是对按预期报告的消耗量的变化。

    我预计这种耳炎会得到解决,当我得到一份具有正确值的双报告时,我会考虑这一点。

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

    我看到的报告不正确(我的日志筛选器无法正常工作)。

    我目前正在更详细地调查此问题,并发现堆栈中可能存在缓冲区溢出以及优化。

    这可以用来检测 BDBREPORTING_MAX_ANSION_ATTR_SIZE 不正确。

    如果该常量正确,那么从理论上讲,memcpy 无法对内存内容进行砖化,因为需要将报告配置中的类型设置为属性类型。

    可能已经进行了检查(至少使用调试设置),验证可报告属性是否在限制范围内。

    --- a/Components/stack/bdb/bdb_Reporting.c
    +++ b/Components/stack/bdb/bdb_Reporting.c
    @@ -559,7 +560,8 @@ uint8 bdb_ProcessInConfigReportCmd( zclIncomingMsg_t *pInMsg )
                   confchanged = BDBREPORTING_TRUE;^M
                   bdb_reportingAttrCfgRecordsArray[atrrCfgRecordIndex].minReportInt = bdb_reportingAttrCfgRecordsArray[atrrCfgRecordIndex].defaultMinReportInt;^M
                   bdb_reportingAttrCfgRecordsArray[atrrCfgRecordIndex].maxReportInt = bdb_reportingAttrCfgRecordsArray[atrrCfgRecordIndex].defaultMaxReportInt;^M
    -              osal_memset( bdb_reportingAttrCfgRecordsArray[atrrCfgRecordIndex].reportableChange, 0x00, BDBREPORTING_MAX_ANALOG_ATTR_SIZE );^M
    +              //YNA: Next in is useless, the memcpy replaces the content^M
    +              //osal_memset( bdb_reportingAttrCfgRecordsArray[atrrCfgRecordIndex].reportableChange, 0x00, BDBREPORTING_MAX_ANALOG_ATTR_SIZE );^M
                   osal_memcpy( bdb_reportingAttrCfgRecordsArray[atrrCfgRecordIndex].reportableChange, bdb_reportingAttrCfgRecordsArray[atrrCfgRecordIndex].defaultReportableChange, BDBREPORTING_MAX_ANALOG_ATTR_SIZE );^M
                   status = ZCL_STATUS_SUCCESS;  ^M
                 }^M
    @@ -570,10 +572,11 @@ uint8 bdb_ProcessInConfigReportCmd( zclIncomingMsg_t *pInMsg )
                   bdb_reportingAttrCfgRecordsArray[atrrCfgRecordIndex].minReportInt = reportRec->minReportInt;^M
                   bdb_reportingAttrCfgRecordsArray[atrrCfgRecordIndex].maxReportInt = reportRec->maxReportInt;^M
                   // For attributes of 'discrete' data types this field is omitted^M
    -              if ( zclAnalogDataType( reportRec->dataType ) )^M
    +              uint8_t len = zclAnalogDataType( reportRec->dataType );^M
    +              if ( len )^M
                   {^M
                     osal_memset( bdb_reportingAttrCfgRecordsArray[atrrCfgRecordIndex].reportableChange, 0x00, BDBREPORTING_MAX_ANALOG_ATTR_SIZE );^M
    -                osal_memcpy( bdb_reportingAttrCfgRecordsArray[atrrCfgRecordIndex].reportableChange, reportRec->reportableChange, zclGetDataTypeLength( reportRec->dataType ) );^M
    +                osal_memcpy( bdb_reportingAttrCfgRecordsArray[atrrCfgRecordIndex].reportableChange, reportRec->reportableChange, (len<=BDBREPORTING_MAX_ANALOG_ATTR_SIZE?len:BDBREPORTING_MAX_ANALOG_ATTR_SIZE));^M
                   }^M
                   status = ZCL_STATUS_SUCCESS;             ^M
                 }^M

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

    感谢您提供建议的优化。

    此致,
    瑞安

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

    我发现了为什么我没有收到任何属性报告- attr_size 的更改对 NV 存储有不同的要求,当我处于调试模式保留 NV 存储时,所有报告相关的 NV 存储操作都失败。

    遗憾的是,堆栈中没有恢复,当最大报告属性大小增加时,OTA 更新也会出现问题。