We have a Zigbee Pro system that has roaming, Reduced Function (RFD) end devices. These devices are low power, battery powered devices that sleep most of the time with Data Requests to the router occurring about every 15 seconds.
To prevent filling the association table on any one router device in the system, we have a mechanism that helps us know when we haven't had a Data Request from one of these devices in a while.
When we haven't heart from one of them in a while, we use NLME_LeaveReq() to kick it out of our list of associations, silently.
Occasionally, for reasons we don't completely understand, we start hearing data requests from one that we no longer have an association with. We'd like to make the system more robust against this sort of thing. To do that, we attempted to use NLME_DirectJoinRequestWithAddr() to add the end device back in.
When we have one that needs to be added back in, we only have the short address. It's not clear how this function should be called when we don't have an extended address. We attempted to use this as below:
ZLongAddr_t extAddr={0};
ZStatus_t zStatus;
zStatus = NLME_DirectJoinRequestWithAddr(extAddr, knownShortAddr, CAPINFO_DEVICETYPE_RFD);
The problem is that this worked only for the first value of knownShortAddr. Subsequent calls to it did not return Zsuccess.
Is this function buggy? What is it doing in there, perhaps matching the extAddr value we passed against something in the association table? What is the correct way to use this to force an association back into the table?