微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI Zigbee设计交流 > 请问Zstack的mac层的ack的作用是什么?

请问Zstack的mac层的ack的作用是什么?

时间:10-02 整理:3721RD 点击:

1.MAC层ACK不用于确认数据成功,而是拿来做冲突检测和低功耗 。这个观点是对吗?不管是对的还是错的,能解释解释吗?

2.因为协议栈的版本不是最新了,没有child eging但是需要做心跳,所以想问问:APS层和mac层的ack,是在哪儿检测到自己接收到了ACK呢? 

1、是用于确认数据成功的

2、APS层发送数据的时候,option是APS_ACK_REQUEST , 返回ZSuccess说明ACK成功

我知道心跳可以用返回值来判断(仅仅说明数据包达到了下一跳节点),但是当目的节点不在下一跳的位置而需要进过几个路由器,又怎么判断自己是否接收到了mac层或者是aps层的ack应答呢?   麻烦大牛解释解释,困扰几天了

纠正一下

1,MAC ACK是广播发送的,MAC层收到ACK后判断不是自己的,会增加CSMA回退(Z-stak的处理在rxStartIsr中好像是直接跳过的)。低功耗节点发送MAC Data Request后,会根据对应的ACK中的PEND标记,确定父节点是否有数据发给自己,并延续20ms的接收,这样既能收到数据又不会浪费能耗。

2,在消息AF_DATA_CONFIRM中判断发送成功,而不是在AF_DataReuqest函数的返回中。AF_DataReuqest返回只是说明发送数据格式正确,数据进入CC2530的发送缓存。

mac的ACK就是管点对点的。多跳的ACK需要应用层的ack, 参考zstack developer guide的

第8节.  End-to-end acknowledgements

为什么要有mac ack,你可以详细参考下IEEE802.15.4的标准!

请问,在收到对方的应答时,AF_DATA_CONFIRM事件下会收到什么消息,意思是我在这个事件下判断什么内容来说明发送成功了?

请问通过发送心跳包的方式来判断设备在没在网络中,到底该怎么实现呢?一直搞不懂!1、是节点周期性给路由发送数据,然后等待应答,如果一段时间后节点没收到应答就代表自己不再网络中了?     2、还是路由周期性给节点发,当收不到节点的应答时,说明节点不再网络中了。    时用1的方式还是2的方式呢,而且应答的时间判断怎么实现,期待你的解答

终端设备,发送给某个特定路由和协调器算多跳ack吗,如果算多跳ack,那我在应用层什么地方接受ack?期待您的回答谢谢

发送成功后,在本应用层的AF_DATA_CONFIRM时间下会受到什么内容或者判断什么东西?

看不懂,比如

1、终端节点广播数据给协调器,但是需要确认协调器收到数据,那么在终端节点调用AF_DataRequest( )发送数据时,发送选项需要配置为AF_DISCV_ROUTE||AF_ACK_REQUEST 吗?

2、当协调器收到数据后是自动回复确认信息,还是在应用层的什么地方添加回复内容

3、然后终端节点会在系统消息的AF_DATA_CONFIRM_CMD怎么处理、处理什么?

期待你的回答,先谢谢了

你说的内容我看了,但是还是没弄明白。

首先,不知道如何使能应用层ack,是在调用AF_DataRequest()函数式,发送参数设置为AF_DISCV_ROUTE | AF_ACK_REQUEST吗?我这样做了但是没看到有啥反应,用抓包工具看也没看到有APS 确认帧。

该如何是能应用层ack

其次,当发送方收到接收方发来的APS ACK,是下面这样判断吗 ?

case AF_DATA_CONFIRM_CMD: 

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

          // Action taken when confirmation is received.
          if ( sentStatus != ZSuccess )
          {
            // The data wasn't delivered -- Do something
          }

break;

 sentStatus的值都有哪些或者说都有哪些返回状态?

第三,APS有个常量 apsAckWaitDuration代表等待确认传输一帧的最大秒数,我的理解是当调用 AF_DataRequest(  ) == afStatus_SUCCESS 发送成功后,APS ack应该在apsAckWaitDuration时间内收到。但是如果收不到这时候还会还进去到下面的这个系统消息里面吗?这时候返回的状态就是sentStatus != ZSuccess?

case AF_DATA_CONFIRM_CMD: 

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

          // Action taken when confirmation is received.
          if ( sentStatus != ZSuccess )
          {
            // The data wasn't delivered -- Do something
          }

break;

第四,APS子层还有个常量 apsMaxFrameRetries 代表传输失败后允许重传的最大次数,该怎么理解?我是这个理解的在调用 AF_DataRequest(  )时会最多发三次,如果3次之内发送出去返回afStatus_SUCCESS,否则返回失败,不知道对不对。

希望你在有时间的时候能帮我解答一下疑惑,谢谢。

 

前一阵你的回答意思明白,但是问题是没解决。

首先,不知道如何使能应用层ack,是在调用AF_DataRequest()函数式,发送参数设置为AF_DISCV_ROUTE | AF_ACK_REQUEST吗?我这样做了但是没看到有啥反应,用抓包工具看也没看到有APS 确认帧。

该如何是能应用层ack

其次,当发送方收到接收方发来的APS ACK,是下面这样判断吗 ?

case AF_DATA_CONFIRM_CMD: 

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

          // Action taken when confirmation is received.
          if ( sentStatus != ZSuccess )
          {
            // The data wasn't delivered -- Do something
          }

break;

 sentStatus的值都有哪些或者说都有哪些返回状态?

第三,APS有个常量 apsAckWaitDuration代表等待确认传输一帧的最大秒数,我的理解是当调用 AF_DataRequest(  ) == afStatus_SUCCESS 发送成功后,APS ack应该在apsAckWaitDuration时间内收到。但是如果收不到这时候还会还进去到下面的这个系统消息里面吗?这时候返回的状态就是sentStatus != ZSuccess?

case AF_DATA_CONFIRM_CMD: 

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

          // Action taken when confirmation is received.
          if ( sentStatus != ZSuccess )
          {
            // The data wasn't delivered -- Do something
          }

break;

第四,APS子层还有个常量 apsMaxFrameRetries 代表传输失败后允许重传的最大次数,该怎么理解?我是这个理解的在调用 AF_DataRequest(  )时会最多发三次,如果3次之内发送出去返回afStatus_SUCCESS,否则返回失败,不知道对不对。

希望你在有时间的时候能帮我再次解答一下疑惑,谢谢。

你手头如果有这部分代码的话,可以截图给我看看,这样我会容易理解,不胜感谢

能否详细说明一下APS ack 功能是如何实现的?

使能APS ack 是在调用AF_DataRequest()的时候,发送选项参数AF_DISCV_ROUTE | AF_ACK_REQUEST这样设置吗?

能用相关代码演示说明一下吗?这个问题困扰我很久了,谢谢

如何调用mac ack ,我需要协调器确认哪些原网内的路由器现在不在网内了

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top