ZigBee radio channel change

Hello,

We developed with nRF5240 using nRF5 SDK as zigbee coordinator and I have some questions about channel change mechanism:

  1. By choosing 'coordinator' as network role at startup, is this automatically also the network channel manager as explained in Annex E of Zigbee specification https://zigbeealliance.org/wp-content/uploads/2019/11/docs-05-3474-21-0csg-zigbee-specification.pdf ?
  2. When a high value of transmit failures is detected, is channel scan done? Is channel changed?
  3. Do you manage the reception of Mgmt_NWK_Update_notify? Which actions are performed?
  4. In Zigbee spec about transmit failures, there is written: "the network manager would report to the local application using Mgmt_NWK_Update_notify and the application can force a channel change using the Mgmt_NWK_Update_req.". Do you ever notify application about this through Zigbee signal handler or any callback? Do you implemented a function that I can use to send Mgmt_NWK_Update_req to force channel change?

I've read another question about the same topic:  https://devzone.nordicsemi.com/f/nordic-q-a/94366/zigbee-radio-channel-selection-and-change-during-run-time/398143 
But I couldn't find the answers.

Best regards.

Laura

Parents
  • Hi Laura,

    By choosing 'coordinator' as network role at startup, is this automatically also the network channel manager as explained in Annex E of Zigbee specification https://zigbeealliance.org/wp-content/uploads/2019/11/docs-05-3474-21-0csg-zigbee-specification.pdf ?

    Yes, the coordinator will be the network manager. 

    When a high value of transmit failures is detected, is channel scan done? Is channel changed?

    This is correct. Both routers and coordinators will track transmit failures. If the number of transmit failures is too high, then the coordinator will perform energy scans on the different channels. The network manager (coordinator) can then decide to change channel.

    Do you manage the reception of Mgmt_NWK_Update_notify? Which actions are performed?

    This is handled internally by the stack. I am not sure exactly which actions the network manager performs in the ZBOSS stack, since there are no strict specifications on how a network manager must handle this, but I will ask the development team.

    In Zigbee spec about transmit failures, there is written: "the network manager would report to the local application using Mgmt_NWK_Update_notify and the application can force a channel change using the Mgmt_NWK_Update_req.". Do you ever notify application about this through Zigbee signal handler or any callback? Do you implemented a function that I can use to send Mgmt_NWK_Update_req to force channel change?

    All of this is handled internally by the stack, and there is no signal sent to the signal handler about this. However, you can manually send a Mgmt_NWK_Update_req with zb_zdo_mgmt_nwk_update_req(). If you set ScanDuration to 0xfe then the Mgmt_NWK_Update_req will be a request to change channel.

    Best regards,

    Marte

  • Hello Marte,

    thank you for the reply.

    Regarding  zb_zdo_mgmt_nwk_update_req function, is it enough to call it in order to notify devices about the channel change and also to change channel? Take into account that I'm developing a Zigbee coordinator device.

    If that function isn't enough, is there another function to change channel? I've tried to use nrf_802154_channel_set function but channel didn't change, as I could see from a radio sniffer. Please consider that I'm trying to change channel at run time.

    Best regards

    Laura

  • Hi Laura,

    Please let me know if you still have issues with the channel change after disabling Mgmt_NWK_Update_notify Slight smile

    Best regards,
    Marte

  • Hello Marte,

    I'm not sure if it is working because I left my setup running during the night and I saw that Nordic changed channel and that routers remained in previous channel. I don't have logs. I'll keep this monitored.

    In the meanwhile, do you have any explanations for this? Devices in my setup are the same one listed above.

    Thank you 

    Laura

  • Hi Laura,

    It could be something else making the device initiate channel change, but it is difficult to say what without a sniffer log.

    Best regards,
    Marte

  • Hello Marte,

    I have one last question about channel change, is it fine to use zb_set_channel_mask to change channel mask at runtime?

    The idea is to:

    • set a channel mask that allows current channel and new channel
    • move to new channel as per our previous discussion
    • set a channel mask that allows only the new channel

    Do you see any drawback? Except what we already wrote about devices not receiving the command to change channel because powered off for instance.

    Best,

    Laura

  • Hi Laura,

    I would not recommend changing the channel mask after the Zigbee stack has started. This might cause conflicting channels with the 802.15.4 radio since changing the Zigbee channel mask after the stack has started does not affect the 802.15.4 channel. So, for example, you might end up with a Zigbee channel mask that does not include the actual channel the 802.15.4 radio is operating on.

    However, if you are careful and know what you are doing it should be possible. In addition to zb_set_channel_mask() you should also call zb_set_bdb_primary_channel_set(). And make sure that the current 802.15.4 channel is part of the channel mask. You can get the 802.15.4 channel with nrf_802154_channel_get().

    Best regards,
    Marte

Reply
  • Hi Laura,

    I would not recommend changing the channel mask after the Zigbee stack has started. This might cause conflicting channels with the 802.15.4 radio since changing the Zigbee channel mask after the stack has started does not affect the 802.15.4 channel. So, for example, you might end up with a Zigbee channel mask that does not include the actual channel the 802.15.4 radio is operating on.

    However, if you are careful and know what you are doing it should be possible. In addition to zb_set_channel_mask() you should also call zb_set_bdb_primary_channel_set(). And make sure that the current 802.15.4 channel is part of the channel mask. You can get the 802.15.4 channel with nrf_802154_channel_get().

    Best regards,
    Marte

Children
No Data
Related