I'm running a robustness test on my network, feeding in 1000 messages from a USB interface on the coordinator (2531 USB dongle) and then unicasting them to a router which displays the number received. AF_ACK_REQUEST is being set, and each time an OTA message is sent, a flag is set to block the transmission of any further messages until the AF_DATA_CONFIRM_CMD event is triggered, at which point the flag is reset. A new message cannot therefore be sent until an APS acknowledgement had been received for the previous one.
Under good RF conditions, the router receives all 1000 messages in less than a minute.
If I separate the two devices to say 100m, the link is much more variable, and I sometimes see the messages stop completely for 7-8 seconds, then resume at a slower rate. They may then speed up again to their original rate after a few more seconds.
If I switch off the router in the middle of a burst, the same thing often happens, although the faster rate will not resume unless I switch it back on and let it rejoin the network.
I assume that the 7-8 second delay is due to the coordinator and router trying to re-establish a link. The slower subsequent rate is presumably if the link remains bad and retries are needed. What I don't understand is why APS acknowledgements aren't being processed at all for those 7-8 seconds (I've confirmed this is the case at the coordinator end).
I would guess that this is Zigbee's attempt to maximise the chances of a successful acknowledgement, by waiting to see whether the link can be repaired. But I would rather have a failed acknowledgement in a shorter time, rather than have all my messages back up. Does anyone know of a way around this?