请问Zstack的mac层的ack的作用是什么?
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 ,我需要协调器确认哪些原网内的路由器现在不在网内了