请问上报的dp数据长度超过64byte的时候该怎么上传? 分包?如何分?

Zigbee 子设备开发


tts
Posts: 16

TLSR8258_TuyaOS-3.11.1 tuyaos_serial_demo 在上报开关的循环定时数据(dp id =209)时,数据长度超过64 byte,请问如何分包上报?需要增加哪些设置?

tal_zigbee_start_send_multiple_packet_handle(0x0000, CLUSTER_PRIVATE_TUYA_CLUSTER_ID, 0, 0,
data_len, data, data_len, &tts_file);
TAL_PR_HEXDUMP_NOTICE("tts_report", data, data_len);

Code: Select all

     tts_report 68: 00 2b d1 00 00 3e 00 0a 01 00 04 41 04 7d 00 01 00 02 03 00 04 41 04 7d 00 01 00 01 05 00 04 41 04 7d 00 01 00 01 07 00 04 42 04 7e 00 01 00 01 09 00 04 42 04 7e 00 01 00 01 0b 00 04 80 04 bc 
     00 01 00 02
shiliang
Posts: 68

Re: 请问上报的dp数据长度超过64byte的时候该怎么上传? 分包?如何分?

您好,

需要以下两个函数:

发送调用函数如下:
/**

  • @brief start send multiple packet handle
  • @note Interface for start a multiple packet sending
    *
  • @param[in] addr: device addr
  • @param[in] cluster: cluster id
  • @param[in] type: file type
  • @param[in] cmd: file cmd
  • @param[in] total_size: total size
  • @param[in] data: data
  • @param[in] len: data len
  • @param[out] file_id: file id
    *
  • @return true: success, false: fail
    /
    TAL_ZIGBEE_TRANSFER_EXTERN BOOL_T tal_zigbee_start_send_multiple_packet_handle(UINT16_T addr,UINT16_T cluster,UINT8_T type,UINT8_T cmd,UINT32_T total_size,UINT8_T
    data,UINT16_T len,UINT16_T *file_id);

发送结果使用如下函数:
bool_t file_send_transfer_end_callback(UINT16_T addr,UINT32_T file_id, bool_t result,UINT8_T *buf,UINT16_T len)
{
tal_zigbee_transfer_debug("file_id %x send result:%x buf ptr:%x\r\n",file_id,result,buf);
if(buf){
tal_free(buf);
buf = NULL;
}
__inner_file_send_buf = NULL;
return true;
}

shiliang
Posts: 68

Re: 请问上报的dp数据长度超过64byte的时候该怎么上传? 分包?如何分?

请确保使用的SDK版本大于等于3.11.0

tts
Posts: 16

Re: 请问上报的dp数据长度超过64byte的时候该怎么上传? 分包?如何分?

@param[in] addr: device addr
@param[in] cluster: cluster id
@param[in] type: file type
@param[in] cmd: file cmd
@param[in] total_size: total size
@param[in] data: data
@param[in] len: data len
@param[out] file_id: file id

请问这些参数如何填写?

data 数据结构是否跟不分包的数据一致吗?

Code: Select all

    
    buf[0] = seq_num >> 8;
    buf[1] = seq_num & 0xff;
    buf[2] = 209;//dp_id;
    buf[3] = 0;//dp_type;
    buf[4] = 0;
    buf[5] = 68;//dp_len;
    buf[6] = dpdata0;
     buf[7] = dpdata1;
      buf[8] = dpdata2;
      .....
shiliang
Posts: 68

Re: 请问上报的dp数据长度超过64byte的时候该怎么上传? 分包?如何分?

是的,data数据即想要填充的payload数据

tts
Posts: 16

Re: 请问上报的dp数据长度超过64byte的时候该怎么上传? 分包?如何分?

@param[in] addr: device addr
@param[in] cluster: cluster id
@param[in] type: file type
@param[in] cmd: file cmd

@param[out] file_id: file id

请问主动上报和回复下发的时候这些参数分别怎么填写呢作用是什么?

shiliang
Posts: 68

Re: 请问上报的dp数据长度超过64byte的时候该怎么上传? 分包?如何分?

对于下发的回复或者上报:
@param[in] addr: device addr
一般下发源是网关,上报也是网关,地址固定0x0000;

@param[in] cluster: cluster id
是接收到的下发dp 数据里包含的cluster id信息,如果dp数据通过TAL_MSG_RET_E tal_zcl_specific_msg_recv_callback(TAL_ZCL_MSG_T *msg)下发,则cluster id即为msg->cluster

@param[in] type: file type
fild type字段为命令类型,0代表global,1代表specific to cluster,如果dp数据通过TAL_MSG_RET_E tal_zcl_specific_msg_recv_callback(TAL_ZCL_MSG_T *msg)下发,则fild type固定为1

@param[in] cmd: file cmd
fild cmd字段为命令字,如果dp数据通过TAL_MSG_RET_E tal_zcl_specific_msg_recv_callback(TAL_ZCL_MSG_T *msg)下发,命令字为msg->command

@param[out] file_id: file id
fild id为发送时sdk返回给应用的id数据,需应用记录,以便和发送结果中返回的id做对比判断是否发送成功

tts
Posts: 16

Re: 请问上报的dp数据长度超过64byte的时候该怎么上传? 分包?如何分?

VOID_T air_mcu_DP_report_cmd_send(UINT8_T *data,
UINT8_T data_len,
TAL_SEND_RESULT_CB result)
{
TAL_ZG_SEND_DATA_T send_data;

Code: Select all

if ((NULL == data) || (data_len > MAX_ZIGBEE_PAYLOAD_SIZE))
{
    if (data_len > MAX_ZIGBEE_PAYLOAD_SIZE)
    {
        tal_zigbee_start_send_multiple_packet_handle(0x0000, CLUSTER_PRIVATE_TUYA_CLUSTER_ID, 1, 0, data_len, data, data_len, &tts_file);
        TAL_PR_HEXDUMP_NOTICE("multiple_packet", data, data_len);
        TAL_PR_NOTICE("tts_file %d", tts_file);
        tts_file++;
    }
    return;
}

tal_system_memset(&send_data, 0, sizeof(TAL_ZG_SEND_DATA_T));
insert_private_command_send_buffer(SERIAL_PROTOCOL_DATA_REPORT, &send_data);

send_data.zcl_id = data[2];

tal_system_memcpy(send_data.data.private.data, data, data_len);
send_data.data.private.len = data_len;
//  tal_zg_clear_send_data(ZG_CLEAR_ALL_ZCL_ID, &send_data.zcl_id);
if (NULL != result)
{
    tal_zg_send_data(&send_data, result, TAL_SEND_DATA_TIMEOUT);
}
else
{
    tal_zg_send_data(&send_data, NULL, TAL_SEND_DATA_TIMEOUT);
}

}

multiple_packet 68:
00 5c d1 00 00 3e 00 0a 01 00 02 8c 02 c8 00 01 00 01 03 00 02 8c 02 c8 00 01 00 01 05 00 02 8c 02 c8 00 01 00 01 07 00 02 8d 02 c9 00 01 00 01 09 00 02 8d 02 c9 00 01 00 01 0b 00 02 8d 02 c9 00 02 00 01
没有上报成功
1、请帮忙看看这个参数有没有填对
2、然后那个会掉也没有触发,是需要在那里注册和初始化吗?

tts
Posts: 16

Re: 请问上报的dp数据长度超过64byte的时候该怎么上传? 分包?如何分?

搞错了

Last edited by tts on 2025年 Jul 11日 09:05, edited 1 time in total.
shiliang
Posts: 68

Re: 请问上报的dp数据长度超过64byte的时候该怎么上传? 分包?如何分?

您好:

请问是否调用如下接口:
VOID_T tal_zigbee_local_auto_func_enable(VOID_T);

如果有调用,router设备默认会初始化分包功能。

如果没有调用上述接口可按照如下步骤初始化:

1.判断SDK内部是否初始化tal_inner_get_file_transfer_func_enable();

2.使能分包功能tal_zigbee_file_transfer_init();

3.tal_zigbee_file_transfer_config(TRUE,TRUE,TRUE,TRUE,TRUE);

Post Reply