TI中文支持网
TI专业的中文技术问题搜集分享网站

关于AF_DATA_CONFIRM_CMD

case AF_DATA_CONFIRM_CMD:  
          afDataConfirm = (afDataConfirm_t *)MSGpkt;
          sentEP = afDataConfirm->endpoint;
          sentStatus = afDataConfirm->hdr.status;
          sentTransID = afDataConfirm->transID;
          (void)sentEP;
          (void)sentTransID;

          if ( sentStatus != ZSuccess )
          {
          }
          break;

只要调用AF_DataRequest()函数发送数据且返回afStatus_SUCCESS,就会返回事件AF_DATA_CONFIRM_CMD,这么理解对吗? 在对此事件的处理中,sentStatus != ZSuccess是目的接收端没有接到数据吗?查了一些资料,对这一块始终有点疑惑,还望大家指点一下。谢谢了。

Martin:

Hi Zhenxing,

只要调用了AF_DataRequest()函数发送数据,就会有AF_DATA_CONFIRM_CMD事件返回,无论传输成功与否。

sentStatus != ZSuccess的解释与你调用AF_DataRequest()函数的options参数有关:

如果option中使能了AF_ACK_REQUEST,表明需要应用层的ACK,那么此时若sentStatus == ZSuccess则表明数据已经到达了目的地址。

若option中并没有使能AF_ACK_REQUEST,表明只需要网络层的ACK,那么此时若sentStatus == ZSuccess则表明数据已经到下一跳节点。

关于这一点可参考Z-Stack Developer's Guide.pdf文档的第8节End-to-end acknowledgements

zhenxing wang1:

回复 Martin:

您好:

        非常感谢您的回复,原本我也是这么理解的。可是最近一些测试中,我发现即使发送端sentStatus = ZSuccess,接收端也不一定接收到了数据,这一点我觉得意外。另外,还有数据丢失、收到重复数据现象。看开发文档第8节End-to-end acknowledgements时,说的是MAC ACk和APS ACk足以保证数据传输的正确性。我想,要利用协议栈的ACK机制,是不是还要加入某一个预编译选项或者使能某些参数?

Martin:

回复 zhenxing wang1:

Hi Zhenxing,

我在2楼的回答可能有点错误:

1. 没有网络层的ACK的说法,2楼中的网络层ack应该是MAC层的ACK!

2. 实际上当你调用AF_DataRequest()函数的option中并没有使能AF_ACK_REQUEST时,表明只需要MAC层的ACK,那么此时不会再有AF_DATA_CONFIRM_CMD事件。 只有当option中使能了AF_ACK_REQUEST时,才会有AF_DATA_CONFIRM_CMD事件返回。

您所描述的 即使发送端sentStatus = ZSuccess,接收端也不一定接收到了数据,有没有可能是你的接收端在数据处理过程中有问题?

协议栈中,的ACK机制,不需要再加入额外的预编译选项或者使能某些参数了。MAC层ACK是默认开启的,应用层的ACK则是在调用AF_DataRequest()函数的option中使能AF_ACK_REQUEST就可以实现了。

 

 

zhenxing wang1:

回复 Martin:

您好:

        您在2中提到,调用AF_DataRequest()函数的option中没有使能AF_ACK_REQUEST,不会再有AF_DATA_CONFIRM_CMD事件。这一点我有疑问,因为我在测试中,并没有使能AF_ACK_REQUEST,但是却有AF_DATA_CONFIRM_CMD事件发生,我在该事件下对sentStatus != ZSuccess的处理是,一直重发,直到成功。这样处理的缺点是,接收端可能会受到重复的数据。

        另一方面,我也试过使能AF_ACK_REQUEST,启用APS ACK,协议栈默认的重传次数是3,延时3s,这种情况下,可能会出现重传3次以后,数据仍然会丢失的情况。

        还有一点,想咨询一下,当传输距离增大,会不会出现接收功率小于某个阀值(这个阀值有没有参考值?)时,即使接收到数据,也无法正确的解析。

        再次对您的回复表示谢意,谢谢!

wenlong lin:

回复 Martin:

如果我想要 禁止 MAC的ack,要在哪里设置呢?

Leekay James:

回复 Martin:

发送的时候,随便指定一个合法地址,就会产生AF_DATA_CONFIRM_CMD;

mac层的应答指的是数据到达接收方的mac层以后,接收方回一个ack数据包到发送方吗?

还是说发送自己mac层给自己的ack?

Nutcracker:

这是 ZigBee 的吧?去 ZigBee 版面询问效果更好。

zexin zeng:

回复 zhenxing wang1:

你好,请问后续还有研究这个问题吗,我也发现了发射端即使收到了AF_DATA_CONFIRM_CMD的success,也存在数据包没有发送到接收端,或者发送的数据有误,请问有什么方法解决这个问题吗?能否指导下,谢谢。

YiKai Chen:

回复 zexin zeng:

有沒有先抓包看看問題

user4711142:

回复 zexin zeng:

您好,请问这个问题解决了么。我也遇到了类似的问题,能否讲解下思路?

赞(0)
未经允许不得转载:TI中文支持网 » 关于AF_DATA_CONFIRM_CMD
分享到: 更多 (0)