This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

重发机制问题

Other Parts Discussed in Thread: CC2530

A协调器用仿真器下载好程序在线仿真,并运行程序。B路由器上电加入网络同时协调器记录上路由器的网络地址。B路由器断电。利用PC串口向协调器发送字符123456789,再由协调器发送数据给B路由节点。由于B路由器节点断电A协调器重发数据给B节点。为什么把重发次数APSC_MAX_FRAME_RETRIES参数值改大或改下都一样,无线抓到的数据以下:

CFG.psd
  • 这个重发发挥作用的是 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次呢?