重发机制问题
A协调器用仿真器下载好程序在线仿真,并运行程序。B路由器上电加入网络同时协调器记录上路由器的网络地址。B路由器断电。利用PC串口向协调器发送字符123456789,再由协调器发送数据给B路由节点。由于B路由器节点断电A协调器重发数据给B节点。为什么把重发次数APSC_MAX_FRAME_RETRIES参数值改大或改下都一样,无线抓到的数据以下:
这个重发发挥作用的是 NWK的重发和MAC层的重发。
/* Max number of times retry looking for the next hop address of a message */
-DNWK_MAX_DATA_RETRIES=2
原因是没有收到MAC ACK,所以应用层不会再重发了。
如果使能了APS ACK的情况,MAC ACK有收到,但是APS ACK没有,那么APSC_MAX_FRAME_RETRIES会起作用
谢谢你的回复 我还是有点迷糊,我想给你打个电话 请问电话是多少?
发送失败后触发AF_DATA_CONFIRM_CMD事件 得到的返回状态是0xE9 这个值就是MAC_NO_ACK,既然都得到MAC_NO_ACK这个值为什么设置APSC_MAX_FRAME_RETRIES还是不起作用
当没有MAC ACK没有的时候,APSC_MAX_FRAME_RETRIES就不起作用了。
因为底层已经尝试8次发送了,没必要再多尝试了。
请问,如果我使用了AF_ACK_QUEST发送选项,那么对方的回应我在应用层那接收呢?还有接收到的是什么东西?是根据接收的内容怎么判断要不要重发
你弄明白这个问题了吗?明白的话希望你能帮我解答一下
我用的是zigbee2007pro协议栈,我想再终端设备调用AF_Data_Request()函数发送数据时,发送选项参数加上AF_ACK_REQUEST。我的问题是:1、接收端需要做什么处理?如果要处理的话在应用层怎么处理?
2、发送端如果接收到APS ACK,是在AF_DATA_CONFIRM_CMD事件下处理吗?是的话需要怎么处理?
1, 使能AF_ACK_REQUEST,目的地址接收端不需要做任何处理,协议栈APS层会自动把这个ACK发送给源地址。
2,收到APS ACK以后,在AF_DATA_CONFIRM_CMD中,就会有SUCCESS的状态值。
下面这个图,可以便于你理解关于ZigBee协议栈里面的MAC ACK和APS ACK的区别。
这两个机制是明白了,但是我昨天做实验验证的时候,在不使能AF_ACK_REQUEST的情况下,发送端的应用层还会进入到AF_DATA_CONFIRM_CMD事件里面,感觉有点奇怪,不是只有使能AF_ACK_REQUEST了,当收到APS ACK时才进入到AF_DATA_CONFIRM_CMD事件下吗?
另外我还有两个问题:1、使能AF_ACK_REQUEST,就是发送端在调用AF_DataRequest()函数时,将发送选项参数加上AF_ACK_REQUEST这个掩码就使能了是吗?
2、如果发送端接收到目的地址端的APS ACK 响应,发送端就会触发AF_DATA_CONFIRM_CMD事件,然后在这个事件下是提取消息中的pkt->hdr.status 值,根据不同的值来判断成功或者不成功吗?不知道理解的对不对。现在我不知道发回来响应时什么内容,也不知道如何去判断成不成功。
希望你能够解答我的疑惑,最好能能有个例程片段嘿嘿,谢谢
AF_DataRequest返回SUCESS就必出现AF_DATA_CONFIRM_CMD,AF_DATA_CONFIRM_CMD在不使能MAC ACK(广播)的时候,表示你要发送的数据的最后一个字节已离开CC2530了。
AF_DataRequest并不能保证你发的每一包数据都从CC2530的天线离开CC2530
当没有使能APS ACK的时候, AF_DATA_CONFIRM_CMD就是以收到MAC ACK为准。
当使能APS ACK的时候,AF_DATA_CONFIRM_CMD就是以收到APS ACK为准。
那我使能了APS ACK ,发送方接收到目的地址方发来的APS ACK, 则发送方的应用层事件处理函数
case AF_DATA_CONFIRM_CMD:
break;
这个里面我应该根据什么内容来判断对方受到或者没收到,然后做进一步处理?
使能APS ACK 就是在调用AF_DataRequest()时,发送选项参数添加上AF_DATA_REQUEST这个参数吗
您有这个功能的例程吗?或者类似的,让我参考一下
你可以根据status,
case AF_DATA_CONFIRM_CMD:
// This message is received as a confirmation of a data packet sent.
// The status is of ZStatus_t type [defined in NLMEDE.h]
// The message fields are defined in AF.h
afDataConfirm = (afDataConfirm_t *)msgPtr;
sentEP = afDataConfirm->endpoint;
sentStatus = afDataConfirm->hdr.status;
我看代码了,没看到都有哪些状态,没找到在哪?所以不知道那个状态是成功那个状态是失败。
sentEP = afDataConfirm->endpoint;需要判断是哪个端点发的吗?这个端点是发送方发送时用的端点吗?
谢谢你这么晚还回答我的问题,谢谢VV大神,我为这个问题困扰很久了
@VV
这个 -DNWK_MAX_DATA_RETRIES 的参数 ,我将其 改为0 之后 消息就无法 发送了。
但是改为1 和 改为2 的效果 是一样的。
能否将重发的次数降至 1次呢?