1

我又遇到了一个疑问。我在我的实现中插入了 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,是否会重新发送原始消息。如果这没有发生,您能否建议我进行适当的更改以使其发生?

4

1 回答 1

0

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

不,消息不会被重传。

如果这没有发生,您能否建议我进行适当的更改以使其发生?

您正在做的只是请求确认而不是启用重传。重传由在此处指定使用的数据包链路层发送。

为了启用重新传输,您需要:

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返回,则这意味着尽管重试了所有传输仍然失败。此时,您可以再次尝试重新传输(设备将再次尝试重新传输最多一次)。FALSEAMSend.sendDonemaxRetries

于 2017-05-10T13:26:46.763 回答