【问题标题】:ACK with packet retransmission带有数据包重传的 ACK
【发布时间】:2017-04-19 21:04:03
【问题描述】:

我又遇到了一个疑问。我在我的实现中插入了 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。

我的问题是,在这一点上,如果没有确认 ACK,是否会重新发送原始消息。如果这没有发生,您能否建议我进行适当的更改以使其发生?

【问题讨论】:

    标签: simulation packet tinyos nesc


    【解决方案1】:

    我的问题是,在这一点上,如果 ACK 未被确认,是否 重新发送原始消息。

    不,消息不会被重传。

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

    您所做的只是请求确认而不启用重传。重传由分组链路层发送,按照指定的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.wasAcked 在您的AMSend.sendDone 方法中返回FALSE,那么这意味着尽管重试了所有传输仍然失败。此时您可以再次尝试重新传输(设备将再次尝试重新传输,总计maxRetries 次)。

    【讨论】:

      猜你喜欢
      • 2014-03-04
      • 1970-01-01
      • 2021-10-16
      • 2017-10-02
      • 2016-03-04
      • 1970-01-01
      • 2019-07-16
      • 2013-11-15
      • 2018-06-01
      相关资源
      最近更新 更多