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

Zigbee Coordinator only allows One Router to connect

Hi,

Here's my setup:

Custom board built with nRF52840

nRF5_SDK_for_Thread_and_Zigbee_v4

Segger Embedded Studio for ARM v3.52

I have built a Zigbee Coordinator and a Zigbee Router using your cli_agent_router example. I can get ONE Router to connect to the Coordinator. But that's it. When I attempt to connect a second Router, it fails in my zboss_signal_handler() at ZB_BDB_SIGNAL_DEVICE_FIRST_START

void zboss_signal_handler(zb_bufid_t bufid)
{
    zb_zdo_app_signal_hdr_t      * p_sg_p         = NULL;
    zb_zdo_app_signal_type_t       sig            = zb_get_app_signal(bufid, &p_sg_p);
    zb_ret_t                       status         = ZB_GET_APP_SIGNAL_STATUS(bufid);
    zb_ret_t                       ret_code       = RET_OK;
    zb_bool_t                      comm_status    = ZB_TRUE;

    switch (sig)
    {
        case ZB_ZDO_SIGNAL_PRODUCTION_CONFIG_READY:
            // At this point Zigbee stack attempted to load production configuration from NVRAM.
            // This step is performed each time the stack is initialized.
            //
            // Note: if it is necessary for a device to have a valid production configuration to operate (e.g. due to legal reasons),
            //       the application should implement the customized logic for this signal (e.g. assert on the signal status code).
            //
            if (status != RET_OK)
            {
                logit("zboss_signal_handler: ZB Production config is not present or invalid");
            }
            break;

        case ZB_ZDO_SIGNAL_SKIP_STARTUP:
            // At this point Zigbee stack:
            //  - Initialized the scheduler.
            //  - Initialized and read NVRAM configuration.
            //  - Initialized all stack-related global variables.
            //
            // Next step: perform BDB initialization procedure (see BDB specification section 7.1).
            //
            logit("Zigbee stack initialized");
            comm_status = bdb_start_top_level_commissioning(ZB_BDB_INITIALIZATION);
            break;

        case ZB_BDB_SIGNAL_DEVICE_FIRST_START:
            // At this point Zigbee stack is ready to operate and the BDB initialization procedure has finished.
            // There is no network configuration stored inside NVRAM.
            //
            // Next step:
            //  - If the device implements Zigbee router or Zigbee end device,
            //    perform network steering for a node not on a network (see BDB specification section 8.3).
            //  - If the device implements Zigbee coordinator,
            //    perform network formation (see BDB specification section 8.4).
            //
            if (status == RET_OK)
            {
                logit("zboss_signal_handler: ZB Device started fro the first time - Start network steering");
                comm_status = bdb_start_top_level_commissioning(ZB_BDB_NETWORK_STEERING);
            }
            else
            {
                logit("zboss_signal_handler: ZB Failed to initialize Zigbee stack - Status [%d] retry after 1 second", status);
                ret_code = ZB_SCHEDULE_APP_ALARM((zb_callback_t)bdb_start_top_level_commissioning, ZB_BDB_NETWORK_STEERING, ZB_TIME_ONE_SECOND);
            }
            break;

        case ZB_BDB_SIGNAL_DEVICE_REBOOT:
            // At this point Zigbee stack is ready to operate and the BDB initialization procedure has finished.
            // There is network configuration stored inside NVRAM, so the device will try to rejoin.
            //
            // Next step: if the device implement Zigbee router or end device, and the initialization has failed,
            //            perform network steering for a node on a network (see BDB specification section 8.2).
            //
            if (status == RET_OK)
            {
                zb_ext_pan_id_t extended_pan_id;
                char ieee_addr_buf[17] = {0};
                int  addr_len;

                zb_get_extended_pan_id(extended_pan_id);
                addr_len = ieee_addr_to_str(ieee_addr_buf, sizeof(ieee_addr_buf), extended_pan_id);
                if (addr_len < 0)
                {
                    strcpy(ieee_addr_buf, "unknown");
                } else if(!ZB_IS_64BIT_ADDR_ZERO(extended_pan_id)) {
                    sprintf(&m_meshNode.zigbeePanIdCurrent[0], "%s,%04hx", NRF_LOG_PUSH(ieee_addr_buf), ZB_PIBCACHE_PAN_ID());
                }

                logit("zboss_signal_handler: ZB Joined network successfully on reboot signal - Extended PAN ID [%s] PAN ID [0x%04hx]", NRF_LOG_PUSH(ieee_addr_buf), ZB_PIBCACHE_PAN_ID());
            }
            else
            {
                NRF_LOG_INFO("zboss_signal_handler: ZB Unable to join the network - start network steering");
                comm_status = bdb_start_top_level_commissioning(ZB_BDB_NETWORK_STEERING);
            }
            break;

        case ZB_BDB_SIGNAL_STEERING:
            // At this point the Zigbee stack has finished network steering procedure.
            // The device may have rejoined the network, which is indicated by signal's status code.
            //
            // Next step:
            //  - If the device implements Zigbee router and the steering is not successful,
            //    retry joining Zigbee network by starting network steering after 1 second.
            //  - It is not expected to finish network steering with error status if the device implements Zigbee coordinator (see BDB specification section 8.2).
            //
            if (status == RET_OK)
            {
                zb_ext_pan_id_t extended_pan_id;
                char ieee_addr_buf[17] = {0};
                int  addr_len;

                zb_get_extended_pan_id(extended_pan_id);
                addr_len = ieee_addr_to_str(ieee_addr_buf, sizeof(ieee_addr_buf), extended_pan_id);
                if (addr_len < 0)
                {
                    strcpy(ieee_addr_buf, "unknown");
                } else if(!ZB_IS_64BIT_ADDR_ZERO(extended_pan_id)) {
                    sprintf(&m_meshNode.zigbeePanIdCurrent[0], "%s,%04hx", NRF_LOG_PUSH(ieee_addr_buf), ZB_PIBCACHE_PAN_ID());
                }

                logit("zboss_signal_handler: ZB Joined network successfully - Extended PAN ID [%s] PAN ID [0x%04hx]", NRF_LOG_PUSH(ieee_addr_buf), ZB_PIBCACHE_PAN_ID());

                // Send WHO AM I data to the Coordinator (gateway)
                start_zigbee_whoami_timer();
            }
            else
            {
                logit("zboss_signal_handler: ZB Restart network steering after 1 second (status: %d)", status);
                ret_code = ZB_SCHEDULE_APP_ALARM((zb_callback_t)bdb_start_top_level_commissioning, ZB_BDB_NETWORK_STEERING, ZB_TIME_ONE_SECOND);
            }
            break;

        case ZB_ZDO_SIGNAL_LEAVE:
            // This signal is generated when the device itself has left the network by sending leave command.
            //
            // Note: this signal will be generated if the device tries to join legacy Zigbee network and the TCLK
            //       exchange cannot be completed. In such situation, the ZB_BDB_NETWORK_STEERING signal will be generated
            //       afterwards, so this case may be left unimplemented.
            //
            if (status == RET_OK)
            {
                zb_zdo_signal_leave_params_t * p_leave_params;
                p_leave_params = ZB_ZDO_SIGNAL_GET_PARAMS(p_sg_p, zb_zdo_signal_leave_params_t);
                logit("zboss_signal_handler: ZB Network left - Leave type [%d]", p_leave_params->leave_type);

                // FIX: attempt to rejoin
                //zb_retry_join(p_leave_params->leave_type);
            }
            else
            {
                logit("zboss_signal_handler: ZB Unable to leave network - Status [%d]", status);
            }
            break;

        case ZB_ZDO_SIGNAL_LEAVE_INDICATION:
            // This signal is generated on the parent to indicate, that one of its child nodes left the network.
            //
            {
                zb_zdo_signal_leave_indication_params_t * leave_params = ZB_ZDO_SIGNAL_GET_PARAMS(&sig, zb_zdo_signal_leave_indication_params_t);
                zb_uint16_t short_addr = zb_address_short_by_ieee(leave_params->device_addr);
                logit("zboss_signal_handler: ZB Signal Leave - short address [%hx]", short_addr);
            }
            break;

        case ZB_ZDO_SIGNAL_DEVICE_UPDATE:
            // This signal notifies the Zigbee Trust center (usually implemented on the coordinator node)
            // or parent router application once a device joined, rejoined, or left the network.
            //
            // For more information see table 4.14 of the Zigbee Specification (R21).
            //
            {
                zb_zdo_signal_device_update_params_t * p_update_params = ZB_ZDO_SIGNAL_GET_PARAMS(p_sg_p, zb_zdo_signal_device_update_params_t);

                // FIX: Should I forward this information onto the Coordinator (gateway)?
                logit("zboss_update_handler: ZB Device update received - short address [%hx] Status [%d]", p_update_params->short_addr, p_update_params->status);
            }
            break;

        case ZB_ZDO_SIGNAL_DEVICE_ANNCE:
            // This signal is generated when a Device Announcement command is received by the device.
            // Such packet is generated whenever a node joins or rejoins the network, so this signal may be used to track the number of devices.
            //
            // Note: since the Device Announcement command is sent to the broadcast address, this method may miss some devices.
            //       The complete knowledge about nodes has only the coordinator.
            //
            // Note: it may happen, that a device broadcasts the Device Announcement command and is removed by the coordinator afterwards,
            //       due to security policy (lack of TCLK exchange).
            //
            {
                zb_zdo_signal_device_annce_params_t * dev_annce_params = ZB_ZDO_SIGNAL_GET_PARAMS(&sig, zb_zdo_signal_device_annce_params_t);
                logit("zboss_signal_handler: ZB New device commissioned or rejoined - short address [%hx]", dev_annce_params->device_short_addr);
            }
            break;

        case ZB_ZDO_SIGNAL_DEVICE_AUTHORIZED:
            // This signal notifies the Zigbee Trust center application (usually implemented on the coordinator node)
            // about authorization of a new device in the network.
            //
            // For Zigbee 3.0 (and newer) devices this signal is generated if:
            //  - TCKL exchange procedure was successful
            //  - TCKL exchange procedure timed out
            //
            // If the coordinator allows for legacy devices to join the network (enabled by zb_bdb_set_legacy_device_support(1) API call),
            // this signal is generated:
            //  - If the parent router generates Update Device command and the joining device does not perform TCLK exchange within timeout.
            //  - If the TCLK exchange is successful.
            //
            {
                zb_zdo_signal_device_authorized_params_t * p_authorize_params;
                p_authorize_params = ZB_ZDO_SIGNAL_GET_PARAMS(p_sg_p, zb_zdo_signal_device_authorized_params_t);
                logit("zboss_signal_handler: ZB Device authorization - short address [%04hx] authorization type [%d] status [%d]",
                   p_authorize_params->short_addr, p_authorize_params->authorization_type, p_authorize_params->authorization_status);
            }
            break;

        case ZB_NWK_SIGNAL_NO_ACTIVE_LINKS_LEFT:
            // This signal informs the application that all links to other routers has expired.
            // In such situation, the node can communicate only with its children.
            //
            // Example reasons of signal generation:
            //  - The device was brought too far from the rest of the network.
            //  - There was a power cut and the whole network suddenly disappeared.
            //
            // Note: This signal is not generated for the coordinator node, since it may operate alone
            //       in the network.
            //
            logit("zboss_signal_handler: ZB Parent is unreachable");
            break;

        default:
            // Unimplemented signal. For more information see: zb_zdo_app_signal_type_e and zb_ret_e
            logit("zboss_signal_handler: ZB Unimplemented signal [%d] Status [%d]", sig, status);
            break;
    }

    if (bufid)
    {
        zb_buf_free(bufid);
    }
}

It returns "zboss_signal_handler: ZB Failed to initialize Zigbee stack - Status [-1] retry after 3 seconds". It then continues to fail in the ZB_BDB_SIGNAL_STEERING event. Note, this only happens for the second Router to attach to the Coordinator.

Attached is a Wireshark Zigbee trace of the second Router attempting to connect.

NotConnecting.pcapng

Thanks in advance for any help!

John

Parents Reply Children
No Data
Related