1.MAC层ACK不用于确认数据成功,而是拿来做冲突检测和低功耗 。这个观点是对吗?不管是对的还是错的,能解释解释吗?
2.因为协议栈的版本不是最新了,没有child eging但是需要做心跳,所以想问问:APS层和mac层的ack,是在哪儿检测到自己接收到了ACK呢?
Viki Shi:
1、是用于确认数据成功的
2、APS层发送数据的时候,option是APS_ACK_REQUEST , 返回ZSuccess说明ACK成功
user4733766:
回复 Viki Shi:
我知道心跳可以用返回值来判断(仅仅说明数据包达到了下一跳节点),但是当目的节点不在下一跳的位置而需要进过几个路由器,又怎么判断自己是否接收到了mac层或者是aps层的ack应答呢? 麻烦大牛解释解释,困扰几天了
Aries Lord:
回复 Viki Shi:
纠正一下
1,MAC ACK是广播发送的,MAC层收到ACK后判断不是自己的,会增加CSMA回退(Z-stak的处理在rxStartIsr中好像是直接跳过的)。低功耗节点发送MAC Data Request后,会根据对应的ACK中的PEND标记,确定父节点是否有数据发给自己,并延续20ms的接收,这样既能收到数据又不会浪费能耗。
2,在消息AF_DATA_CONFIRM中判断发送成功,而不是在AF_DataReuqest函数的返回中。AF_DataReuqest返回只是说明发送数据格式正确,数据进入CC2530的发送缓存。
Yue TANG:
回复 user4733766:
mac的ACK就是管点对点的。多跳的ACK需要应用层的ack, 参考zstack developer guide的
第8节. End-to-end acknowledgements
VV:
为什么要有mac ack,你可以详细参考下IEEE802.15.4的标准!
dong liu9:
回复 Aries Lord:
请问,在收到对方的应答时,AF_DATA_CONFIRM事件下会收到什么消息,意思是我在这个事件下判断什么内容来说明发送成功了?
dong liu9:
回复 VV:
请问通过发送心跳包的方式来判断设备在没在网络中,到底该怎么实现呢?一直搞不懂!1、是节点周期性给路由发送数据,然后等待应答,如果一段时间后节点没收到应答就代表自己不再网络中了? 2、还是路由周期性给节点发,当收不到节点的应答时,说明节点不再网络中了。 时用1的方式还是2的方式呢,而且应答的时间判断怎么实现,期待你的解答
dong liu9:
回复 Yue TANG:
终端设备,发送给某个特定路由和协调器算多跳ack吗,如果算多跳ack,那我在应用层什么地方接受ack?期待您的回答谢谢
dong liu9:
回复 Aries Lord:
发送成功后,在本应用层的AF_DATA_CONFIRM时间下会受到什么内容或者判断什么东西?
dong liu9:
回复 Yue TANG:
看不懂,比如
1、终端节点广播数据给协调器,但是需要确认协调器收到数据,那么在终端节点调用AF_DataRequest( )发送数据时,发送选项需要配置为AF_DISCV_ROUTE||AF_ACK_REQUEST 吗?
2、当协调器收到数据后是自动回复确认信息,还是在应用层的什么地方添加回复内容
3、然后终端节点会在系统消息的AF_DATA_CONFIRM_CMD怎么处理、处理什么?
期待你的回答,先谢谢了