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.

  • Hi and sorry for the late reply.

    1.

    You mustwait unfortunately.

    2.

    What kind of frames are you sending? Can you share some code?

    The time to get new buffer depends on what you are doing in your network.

    3.

    This also depends on what you are doing in your network, some of the things you do might require an acknowledgement before the buffer is released.

    Best regards,

    Andreas

  • 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));

  • 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? 

  • 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.

Related