ACK重传包

时间:2017-04-19 21:04:04

标签: simulation packet tinyos nesc

我再次遇到了疑问。我在我的实现中插入了ACK的使用。

在功能中:

AMSend.sendDone (message_t * bufPtr, error_t error) {
    if (call PacketAcknowledgements.wasAcked (bufPtr)) {
         dbg ("test", "SEND_ACK \ n");
    }
}

它显然正常工作,具体取决于输出日志。

已经在功能:

AMControl.startDone (error_t err) {
    radio = TRUE;
    dbg ("test", "SLOT_ACTIVE \ n");
    if (err == SUCCESS) {
        if ((call Clock.get ()> (ultpkdados + 5000)) && (TOS_NODE_ID! = 0)) {
            test_msg_t * rcm = (test_msg_t *) call Packet.getPayload (& pkt, sizeof (test_msg_t));
            rcm-> type = 1;
            rcm-> nodeid = TOS_NODE_ID;
            rcm-> proxsalto = syncwith;
            call PacketAcknowledgements.requestAck (& pkt);
            if (call AMSend.send (syncwith, & pkt, sizeof (test_msg_t)) == SUCCESS) {
                Dbg ("test", "SEND_PKT_DATA \ n"));
                locked = TRUE;
                ultpkdados call Clock.get = ();
            }
        }
    }
}

此函数startDone正在正常发送此数据包,我拨打电话PacketAcknowledgements.requestAck来请求确认。

我的问题是,在此时,如果未确认ACK,则重传原始消息。如果没有发生这种情况,你能否建议我对此进行适当的修改?

1 个答案:

答案 0 :(得分:0)

  

我的问题是,在这一点上,如果确认没有确认,那么   原始邮件被重新传输。

不,邮件不会被重传。

  

如果没有发生这种情况,您能否建议我进行适当的更改   这会发生什么?

您正在做的只是请求确认而不启用重新传输。重传由分组链路层发送,该链路层使用指定的HERE

为了实现重传,您需要:

1)将PACKETLINK预处理器变量添加到makefile中。这可以通过简单地将“-DPACKETLINK”添加到makefile中的PFlags来完成,即

PFLAGS = -DPACKETLINK

2)指定设备可以传输的最大重试次数以及每次重试之间的延迟。这是通过适当调用Packet链接接口中的setRetriessetRetryDelay函数来完成的(这些函数可在PacketLink接口的实例化中找到,因此您需要在接线部分中使用uses interface PacketLink语句你的模块)。您需要在调用AMSend.send之前设置重试次数。即你需要有一些类似的东西:

#if defined(PACKET_LINK)
          maxRetries = 100;  //max retries
          myDelay = 10;    //delay between retries
          call PacketLink.setRetries(&pkt, maxRetries); //set retries
          call PacketLink.setRetryDelay(&pkt, myDelay); //set delay
#endif  

3。在配置文件中,您需要提供实例化的Packetlink实现并将其链接到您的模块。例如,如果您使用的节点带有CC2420收发器(例如TelosB节点),您将在配置文件的实现部分中具有以下内容。

 components CC2420ActiveMessageC, myModuleP as App; 
 App.PacketLink -> CC2420ActiveMessageC.PacketLink;

以上操作是编译分组链路层以及其余的通信栈。您可以查看PacketLinkP.nc文件,了解如何使用传递给PacketLink接口的值。

如果您正在使用PacketLink接口并且PacketAcknowledgements.wasAckedFALSE方法中返回AMSend.sendDone,则表示尽管所有重试都仍然无法传输。此时您可以再次尝试重新传输(设备将再次尝试重新传输最多maxRetries次)。