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.

为什么收到ACK之后,数据包还是会被重发

RT

图片为抓包截图

而且设备这边也确实收到了4次同样的数据

  • 你用的是哪个协议栈,是否可以在发送端接收MAC ACK的地方,打个断点,看程序是否有进入case AF_DATA_CONFIRM_CMD 里面。

    另外两个节点之间的距离怎么样,板子的射频性能是否有问题的

  • 谢谢VV,协调器,路由器和抓包所用的模块距离都在20公分之内,所有的模块都是使用外接天线,射频性能应该没有什么问题,另外如果收到MAC ACK就会有AF_DATA_CONFIRM_CMD里边吗? 另外经过我的测试,如果2个模块距离10公分之内,很少出现上述情况,但是如果距离稍远(20公分)就会出现上述情况,但是通过抓包看到的LQI的值还是很高的啊,信号质量应该不是问题啊

  • 如果收到MAC ACK肯定会到AF_DATA_CONFIRM_CMD

    你说的10公分没问题,20公分有问题,那真应该确认下射频性能是否有问题了。

  • 谢谢您的回答   我用来做测试的板子都是在淘宝上买的模块都是外接天线,所以我认为射频性能应该没问题,另外用相同的模块,2个模块之间通过广播发送消息,在办公室可以在相隔20米而且中间有承重墙的情况下,双方都能正常收发数据

    另外抓包的板子和协调器之间的距离与协调器到路由器之间的距离是差不多相同的,所以我认为既然抓包的工具都能抓到MAC ACK,那么协调器应该也会收到MAC ACK才对啊  

  • 通过AF_DataRequest发送完数据后,发送端收到ACK,然后在哪里处理AF_DATA_CONFIRM_CMD的?

  • 你直接整个工程搜索就可以了,你用的是哪个协议栈?

  • uint16 GenericApp_ProcessEvent( uint8 task_id, uint16 events )
    {
    afIncomingMSGPacket_t *MSGpkt;
    afDataConfirm_t *afDataConfirm;

    // Data Confirmation message fields
    byte sentEP;
    ZStatus_t sentStatus;
    byte sentTransID; // This should match the value sent
    (void)task_id; // Intentionally unreferenced parameter

    if ( events & SYS_EVENT_MSG )
    {
    MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( GenericApp_TaskID );
    while ( MSGpkt )
    {
    switch ( MSGpkt->hdr.event )
    {
    case ZDO_CB_MSG:
    GenericApp_ProcessZDOMsgs( (zdoIncomingMsg_t *)MSGpkt );
    break;

    case KEY_CHANGE:
    GenericApp_HandleKeys( ((keyChange_t *)MSGpkt)->state, ((keyChange_t *)MSGpkt)->keys );
    break;

    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 ZComDef.h]
    // The message fields are defined in AF.h
    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;

  • 谢谢VV  我观察了  确实收到重复数据的时候AF_DATA_CONFIRM_CMD中status为E9,也就是没有mac_ack,根据现象推测,其实节点收到了数据,但是由于协调器没有收到ack,所以协调器又重新发送了几次,直至收到ack或者到达了最大重发次数,所以造成了重复收到数据的问题。那么必须在软件中增加必要的措施保证数据传输可靠性了?

  • 我也遇到了相同的问题,该怎么增加保护措施?

  • 已經在你 e2echina.ti.com/.../168524 的帖子協助,請勿重複發帖