This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

ZIGBEE SDK ZB_GET_OUT_BUF_DELAYED2 call failed

HI,all

I am a newman for zigbee on NRF52840 with S140 softdevice,

I have two board, one is ZC and another is ZED.

On ZC board, I use ZB_GET_OUT_BUF_DELAYED2 to send data to ZED continuely,about 100 times this method return failed and can not alloc a buf.

after about 3 seconds ZB_GET_OUT_BUF_DELAYED2 can be called successfully.

My question is:

1,when ZB_GET_OUT_BUF_DELAYED2 call failed, is there any method to relase or remalloc buffer?

2,how to reduce the time(about 3 seconds) to get new buf successfully?

3,why need wait for some seconds to get new buf?

wish your help,thanks.

Parents
  • HI,Andreas,

    thanks your reply and help.

    my code to send data is below:

    #define ZB_ZCL_HF_DP_SEND_CMD(buffer, \
    addr, \
    dst_addr_mode, \
    dst_ep, \
    ep, \
    prfl_id, \
    def_resp, \
    cmd_id, \
    cb, \
    cmd_data, \
    cmd_size) \
    { \
    zb_uint8_t* ptr = ZB_ZCL_START_PACKET_REQ(buffer) \
    ZB_ZCL_CONSTRUCT_SPECIFIC_COMMAND_REQ_FRAME_CONTROL(ptr, def_resp) \
    ZB_ZCL_CONSTRUCT_COMMAND_HEADER_REQ(ptr, ZB_ZCL_GET_SEQ_NUM(), cmd_id); \
    ZB_ZCL_PACKET_PUT_DATA_N(ptr, cmd_data, cmd_size); \
    ZB_ZCL_FINISH_PACKET(buffer, ptr) \
    ZB_ZCL_SEND_COMMAND_SHORT(buffer, \
    addr, \
    dst_addr_mode, \
    dst_ep, \
    ep, \
    prfl_id, \
    ZB_ZCL_CLUSTER_ID_HF_DP_ATTR, \
    cb); \
    }

    #define ZB_ZCL_HF_DP_SEND_SWITCH_REQ( \
    buffer, addr, dst_addr_mode, dst_ep, ep, prfl_id, dis_default_resp, cb, cmd_data, cmd_size) \
    ZB_ZCL_HF_DP_SEND_CMD( \
    buffer, \
    addr, \
    dst_addr_mode, \
    dst_ep, \
    ep, \
    prfl_id, \
    dis_default_resp, \
    ZB_ZCL_CMD_HF_DP_SWITCH_ID, \
    cb, \
    cmd_data, \
    cmd_size)

    SwitchData data = {0, 2};
    ZB_ZCL_HF_DP_SEND_SWITCH_REQ(p_buf,
    addr,
    ZB_APS_ADDR_MODE_16_ENDP_PRESENT,
    ep,
    HFDP_GATEWAY_ENDPOINT,
    ZB_AF_HA_PROFILE_ID,
    ZB_ZCL_DISABLE_DEFAULT_RESPONSE,
    NULL,
    &data,
    sizeof(data));

    how to disable acknowledgement? 

Reply
  • HI,Andreas,

    thanks your reply and help.

    my code to send data is below:

    #define ZB_ZCL_HF_DP_SEND_CMD(buffer, \
    addr, \
    dst_addr_mode, \
    dst_ep, \
    ep, \
    prfl_id, \
    def_resp, \
    cmd_id, \
    cb, \
    cmd_data, \
    cmd_size) \
    { \
    zb_uint8_t* ptr = ZB_ZCL_START_PACKET_REQ(buffer) \
    ZB_ZCL_CONSTRUCT_SPECIFIC_COMMAND_REQ_FRAME_CONTROL(ptr, def_resp) \
    ZB_ZCL_CONSTRUCT_COMMAND_HEADER_REQ(ptr, ZB_ZCL_GET_SEQ_NUM(), cmd_id); \
    ZB_ZCL_PACKET_PUT_DATA_N(ptr, cmd_data, cmd_size); \
    ZB_ZCL_FINISH_PACKET(buffer, ptr) \
    ZB_ZCL_SEND_COMMAND_SHORT(buffer, \
    addr, \
    dst_addr_mode, \
    dst_ep, \
    ep, \
    prfl_id, \
    ZB_ZCL_CLUSTER_ID_HF_DP_ATTR, \
    cb); \
    }

    #define ZB_ZCL_HF_DP_SEND_SWITCH_REQ( \
    buffer, addr, dst_addr_mode, dst_ep, ep, prfl_id, dis_default_resp, cb, cmd_data, cmd_size) \
    ZB_ZCL_HF_DP_SEND_CMD( \
    buffer, \
    addr, \
    dst_addr_mode, \
    dst_ep, \
    ep, \
    prfl_id, \
    dis_default_resp, \
    ZB_ZCL_CMD_HF_DP_SWITCH_ID, \
    cb, \
    cmd_data, \
    cmd_size)

    SwitchData data = {0, 2};
    ZB_ZCL_HF_DP_SEND_SWITCH_REQ(p_buf,
    addr,
    ZB_APS_ADDR_MODE_16_ENDP_PRESENT,
    ep,
    HFDP_GATEWAY_ENDPOINT,
    ZB_AF_HA_PROFILE_ID,
    ZB_ZCL_DISABLE_DEFAULT_RESPONSE,
    NULL,
    &data,
    sizeof(data));

    how to disable acknowledgement? 

Children
  • Hi.

    Have you created your own version of the ZB_ZCL_SEND_CMD macro in zb_cl_common.h?

    Have you looked at the multi sensor example? In examples\zigbee\experimental\multi_sensor?

    Best regards,

    Andreas

  • The code of my own version ZB_ZCL_SEND_CMD are here:

    #define ZB_ZCL_HF_DP_SEND_CMD(buffer, \
    addr, \
    dst_addr_mode, \
    dst_ep, \
    ep, \
    prfl_id, \
    def_resp, \
    cmd_id, \
    cb, \
    cmd_data, \
    cmd_size) \
    { \
    zb_uint8_t* ptr = ZB_ZCL_START_PACKET_REQ(buffer) \
    ZB_ZCL_CONSTRUCT_SPECIFIC_COMMAND_REQ_FRAME_CONTROL(ptr, def_resp) \
    ZB_ZCL_CONSTRUCT_COMMAND_HEADER_REQ(ptr, ZB_ZCL_GET_SEQ_NUM(), cmd_id); \
    ZB_ZCL_PACKET_PUT_DATA_N(ptr, cmd_data, cmd_size); \
    ZB_ZCL_FINISH_PACKET(buffer, ptr) \
    ZB_ZCL_SEND_COMMAND_SHORT(buffer, \
    addr, \
    dst_addr_mode, \
    dst_ep, \
    ep, \
    prfl_id, \
    ZB_ZCL_CLUSTER_ID_HF_DP_ATTR, \
    cb); \
    }

    is there any mistake or wrong?

    I compared my code with the example of MULTI_SENSOR, there are almost the same of define ENDPOINT and CLUSTERs only the send data mothed is different. the example use set ATRR VALUE but I use SEND_COMMAND.

  • Hi.

    If you look at the file components\zigbee\cli\zigbee_cli_cmd_generic_cmd.c

    Can you change:

    ZB_ZCL_PACKET_PUT_DATA_N(ptr, cmd_data, cmd_size); \

    To:

    /* Scan argument with payload and put in buffer with command to send */
    for (zb_uint8_t i = 0; i < p_cmd_query->payload_length; i++)
    {
    ZB_ZCL_PACKET_PUT_DATA8(ptr, (p_cmd_query->payload[i]));
    }

    If you want to disable acknowledgement, please remove:

    ZB_ZCL_FINISH_PACKET(buffer, ptr) \

     

    Add this define at the top.:

    #define ZB_ZCL_FINISH_PACKET_NO_APS_ACK(zbbuf, ptr) (void) zb_zcl_finish_and_send_packet_no_ack((zbbuf), (ptr),

    And change:

    ZB_ZCL_FINISH_PACKET(buffer, ptr) \

    to

    ZB_ZCL_FINISH_PACKET_NO_APS_ACK(zbbuf, ptr) \

    Best regards,

    Andreas

Related