[紧急求助] ZTU设备端上传数据失败

Zigbee 子设备开发


linshc
Posts: 33

描述:使用的SDK版本为TuyaOS-TLSR8258_3.7.1。我们使用ZTU开发了一款灯控产品,并已经大批量部署并长时间运行以查看稳定性。在最近的使用用,出现了如下问题:
1.设备在使用过程中,发现有几个设备出现了,数据没上报的情况。即我下发了开灯的指令,设备也进行了开灯动作,但看云端日志没有上报的记录。正常情况下是有上报记录的
2.因为设备已经部署,所以不能通过串口捕捉log.我们把设备发送失败的原因,在tal_zg_send_data()的callback函数中做了判断并记录到了flash中。最近读取了几个设备的失败原因,发现都是由于SEND_ST_MEMORY_ERR, ///< Send failed due to memory error这个错误导致的,是由于内存泄漏的原因吗?我在工程中,没有使用过malloc相关的函数。
3.使用tal_system_get_free_heap_size()获取到的剩余内存和第2条中内存错误中的内存,是一个意思吗?我在本地测试,控制了一遍设备,发现剩余内存没有变化。

huanghuan
Posts: 202

Re: [紧急求助] ZTU设备端上传数据失败

1.你好,如果是内存泄漏问题,那么出现问题后开关控制 report均会因为malloc fail导致发送失败,请确认是否是出现问题后控制均无report
2.针对这个问题,你可以选择开大 heap size,route默认是12K

Code: Select all

#define APP_HEAP_SIZE 12*1024
STATIC UINT8_T gs_heap[APP_HEAP_SIZE];
VOID_T tkl_memory_cfg(UINT8_T **out_buff, UINT32_T *out_buff_len)
{
    *out_buff = gs_heap;
    *out_buff_len = APP_HEAP_SIZE;
}

3.我们发布的开发框架以demo形式挂测和控制 1w次左右,长运没有出现过上述问题
4.可能是你注册的endpoint及attr较多导致的buf开销较大
5.建议升级到 3.8.0以上开发框架版本,在3.8.0以上开发框架,我们优化了sdk所消耗的buf开销

linshc
Posts: 33

Re: [紧急求助] ZTU设备端上传数据失败

1.是的,出现问题后,不管是开关控制,还是控制亮度。都会出现无report的问题
2.我可以开大点,继续长期测试一下。您说的route默认的内存大小,是用于发送数据开销的吗?还是整个系统的?我本地使用tal_system_get_free_heap_size()获取到的剩余内存为6308,进行开关或亮度调节的动作后,这个内存值,并没有发生变化。

还有1点,我的工程是在tuyaos_demo_zg_light2例程上更改的。里面没有这一段,是否只有添加上就可以?

Code: Select all

#define APP_HEAP_SIZE 8*1024
STATIC UINT8_T gs_heap[APP_HEAP_SIZE];
VOID_T tkl_memory_cfg(UINT8_T **out_buff, UINT32_T *out_buff_len)
{
    *out_buff = gs_heap;
    *out_buff_len = APP_HEAP_SIZE;
}

4.是的。我注册了两个endpoint,attr除了例程中的几个外,还添加了自定义的attr,请问一下是否都需要使用到?因为我们的产品是1个设备控制4盏灯。

Code: Select all

// server cluster
const TAL_CLUSTER_T app_server_cluster_list[] = {
    DEF_CLUSTER_IDENTIFY_CLUSTER_ID(identify_attr_list)
        DEF_CLUSTER_GROUPS_CLUSTER_ID(group_attr_list)
            DEF_CLUSTER_SCENES_CLUSTER_ID(scene_attr_list)
                DEF_CLUSTER_ON_OFF_CLUSTER_ID(onoff_attr_list)
                    DEF_CLUSTER_LEVEL_CONTROL_CLUSTER_ID(level_attr_list)
                        DEF_CLUSTER_PRIVATE_CLUSTER_ID(private_attr_list)
                            DEF_CLUSTER_ZLL_COMMISSIONING_CLUSTER_ID(zll_attr_list)};

#define SERVER_CLUSTER_NUM GET_ARRAY_LEN(app_server_cluster_list)
                   
TAL_ENDPOINT_T dev_endpoint_desc[] = { {1, ZHA_PROFILE_ID, ZG_DEVICE_ID_DIMMABLE_LIGHT, SERVER_CLUSTER_NUM, (TAL_CLUSTER_T *)&app_server_cluster_list[0], 0, NULL}, //ZG_DEVICE_ID_DIMMER_SWITCH {2, ZHA_PROFILE_ID, ZG_DEVICE_ID_DIMMABLE_LIGHT, SERVER_CLUSTER_NUM, (TAL_CLUSTER_T *)&app_server_cluster_list[0], 0, NULL}, //ZG_DEVICE_ID_DIMMER_SWITCH };

5.升级到3.8.0,适配我现在的工程吗?需要进行改动吗?

huanghuan
Posts: 202

Re: [紧急求助] ZTU设备端上传数据失败

1.heap_size() 底层也会有用到,包括接收处理的一部分,同时应用write attr,send data等也会使用这部分buf。
2.3.8.0向前兼容之前的版本,可以进行ota,不需要进行其余改动,将你改动及添加的文件移到到 3.8.0开发框架下编辑运行即可。

linshc
Posts: 33

Re: [紧急求助] ZTU设备端上传数据失败

对于开大点内存,我的工程是在tuyaos_demo_zg_light2例程上更改的。里面没有这一段,是否只有添加上就可以?

Code: Select all

#define APP_HEAP_SIZE 8*1024
STATIC UINT8_T gs_heap[APP_HEAP_SIZE];
VOID_T tkl_memory_cfg(UINT8_T **out_buff, UINT32_T *out_buff_len)
{
    *out_buff = gs_heap;
    *out_buff_len = APP_HEAP_SIZE;
}
huanghuan
Posts: 202

Re: [紧急求助] ZTU设备端上传数据失败

1.是的,APP_HEAP_SIZE 这个宏你可以开大些,你定义这个函数即可,你定义的函数会覆盖sdk内部默认的值。
2.如果你开的过大,超过了ram上限,编译会报错。开的过大,也会导致局部变量使用变小,建议可以先开大1K,2K左右

huanghuan
Posts: 202

Re: [紧急求助] ZTU设备端上传数据失败

1.你注册的cluster及attr是根据你的需求定义的,如果你不使用zll,dp透传等功能,可以去掉,zll和private cluster的注册。

huanghuan
Posts: 202

Re: [紧急求助] ZTU设备端上传数据失败

还有一个点,我确认下,出现没有report的时候,上下电是否就恢复了?

linshc
Posts: 33

Re: [紧急求助] ZTU设备端上传数据失败

1.好的,我先更改下内存大小,和callback中错误处理的方式,再测试看一下。
2.新版的SDK3.8.0已经在申请了
3.是的,出现没有report的时候,上下电就恢复了

linshc
Posts: 33

Re: [紧急求助] ZTU设备端上传数据失败

有个问题想请教一下,我有个DP点是每隔一段时间上报1次数据。如果由于网络原因,发生了SEND_ST_ERR, ///< Transmission failed due to network failure这个错误。但该DP点还会继续上报,发送的参数为QOS_1.长此以往会不会导致发送队列FULL,让后堆栈内存不够?

Post Reply