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

[Zigbee-mesh] How to initiate the route discovery manually?

Hi everyone,

I am making a zigbee mesh with just coordinator and routers only. I intended to have the mesh to cover a very large areas with nodes that can be moved (not frequently). I am using SDK4.1.0, for coordiantor , i uploaded the CLI example inside and for the router  i used the exact same example of lilght bulb with the only change is that i exclude every parts relating to notification led or button.

Tell my if i am wrong but from what i learn, when the nodes send a message to another node, without having the address in the routing table it will initalise the route discovery by (1) sending route request or (2) after some time out when it did not received a MAC ACK from the node it try to send to. My expectation is that i will work like a charm since it is almost the same as the example but it did not. It has a really annoying that even with the router is very far from the coordinator, even with very low LQI and miss a lot of MAC ACKs, it still persistently try to send to the coordinator and not every try to broadcast route requeset. And for the first condition to start a route discovery, when the router send route requests, the coordinator can definitely hear it (i have a sniffer just right by coorfinator side).

So my question is that i want to start the route discovery manually to have better control over the mesh. is there any way i can do that. If not, is there any solution for the route discovery. 

Thank you in advances,

Best regards,

Tu

  • Hi Tu,

    Tu Hoang said:
    the new route is unused because after some time, the router recognized that it could send the packet directly to the coordinator while actually it could not (due to router still receive the link status from coordinator). This makes the link is not maintain and expired after some time due to link asymetry.

     Yes, that seems to be the case. Because of the asymmetry in the coordinator's and router's transmit power, the coordinator is able to send packets to the router, but not the other way around, because the transmit power of the router is too low for the packet to reach the coordinator. Since the router receives link status from the coordinator, it believes the coordinator to be a neighbor, so it tries to send directly. So the solution would be to reduce the transmit power of the coordinator as well, so that it is unable to reach the router.

    Tu Hoang said:
    Is there a way for us to set the "send_via_routing" by ourself ?

    This is a part of the internal stack, which is precompiled, and is not forwarded to the SDK, so this is unfortunately not available in the code.

    Tu Hoang said:
    is there any way i can avoid the problem i currently have with this link symetry?

     If you are just going to test things as you have been doing now, it does not need to be symmetrical. In that case, you just need to make sure that the transmit power of both devices are such that they are unable to send packets to each other. Since the router still receives broadcasted messages from the coordinator, the transmit power of the coordinator is high enough that the router is still in range. Reducing the transmit power of the coordinator sufficiently so that the router is out of range would solve the problem.

    Best regards,

    Marte

  • Hi Marte,

    Thank you very much for your help,

    I understand the problem now, may be i will try to reduce the power of the coordinator sufficiently to be out of range, but to do so, can i measure the RSSI to approximately determine the range. I know there are some tools in NRF connect but it is for bluetooth, zigbee has the same antena so can i check the link symetry by that.

    Once again, thank you and have a good day,

    Best regards,

    Tu

  • Hi Tu,

    You can use the function zb_zdo_get_diag_data() to get RSSI. This will be the last known RSSI from a device with a specified short address. This will give the RSSI in energy level, but you can convert it to dBm with the function nrf_802154_dbm_from_energy_level_calculate().

    zb_uint8_t lqi, rssi;
    int8_t rssi_dbm;
    zb_zdo_get_diag_data(0x0000, &lqi, &rssi);
    rssi_dbm = nrf_802154_dbm_from_energy_level_calculate(rssi);

    Best regards,

    Marte

Related