This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

Z-stack中,协调器/路由器向节点发出“空包”的现象。

www.deyisupport.com/.../78037.aspx

这个帖子中,关于VV问作者,为什么协调器发给节点的数据“看不到”内容。

我以前也遇到过,我认为是“空包”现象。

导致这个现象的,应该是TI-MAC层协议的问题。

协调器发送给节点,最终是采用的Indirect发送模式,即节点向协调器发起一个Data Request,协调器再发数据给节点。

在TI-MAC中,两种数据是Indirect发送:1,MAC_McpsDataReq采用MAC_TXOPTION_INDIRECT的方式发送;2,MAC_MlmeAssociateRsp发送协调器分配给路由/节点短地址的时候。

Indirect发送的时候,依赖发(xie)送(tiao)者(qi)的TX缓存,当一个协调器连续向多个节点发送数据时,必然会造成缓存不足。比如连续多次调用MAC_McpsDataReq和MAC_MlmeAssociateRsp函数,协议栈内部就会连续申请缓存空间,但是没有收到MAC Data Request的时候,已经申请的空间不会释放,后申请的,也无法分配到空间,但是协议栈会分配一个“空包”。

至于为什么会有“空包”,个人认为是和ACK的PEND标志有关。ACK里面的PEND标志,只有在收到MAC Data Request的时候才会用到。因为在触发MAC_McpsDataReq和MAC_MlmeAssociateRsp函数,就已经打开了ACK的PEND标志,在收到MAC Data Request,回复的ACK里面就带有PEND标志。然后MAC Data Request的发起者在收到带有PEND标志的ACK后,不会立即休眠,需要收到一个数据包后才会休眠,否则一直打开RXON,对于节点来说,这样的电能损失非常高。因此协调器会发一个“空包”给节点。这个“空包”的意思就是“老子没有空间给你发数据了,洗洗睡吧”