首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ACK包重传

ACK包重传
EN

Stack Overflow用户
提问于 2017-04-20 05:04:04
回答 1查看 122关注 0票数 1

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

在函数中:

代码语言:javascript
复制
AMSend.sendDone (message_t * bufPtr, error_t error) {
    if (call PacketAcknowledgements.wasAcked (bufPtr)) {
         dbg ("test", "SEND_ACK \ n");
    }
}

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

已在函数中:

代码语言:javascript
复制
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未得到确认,是否会重新传输原始消息。如果这种情况没有发生,您能建议我进行适当的更改吗?

EN

回答 1

Stack Overflow用户

发布于 2017-05-10 21:26:47

我的问题是,在这一点上,如果确认没有被确认,原始消息是否被重传。

不会,该消息将不会被重传。

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

您所做的只是请求确认,而不是启用重新传输。重新传输由用作指定HERE的数据包链路层发送。

要启用重新传输,您需要执行以下操作:

1)将PACKETLINK预处理器变量添加到生成文件中。这可以通过在makefile中的PFlags中添加"-DPACKETLINK“来实现。

PFLAGS = -DPACKETLINK

2)指定您的设备可以传输的最大重试次数和每次重试之间的延迟。这可以通过适当地调用数据包链接接口中的setRetriessetRetryDelay函数来实现(这些函数可以在PacketLink接口的实例化中找到,因此您需要在模块的连接部分中使用uses interface PacketLink语句)。在调用AMSend.send之前,需要设置重试次数。也就是说,你需要有类似以下内容的东西:

代码语言:javascript
复制
#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  

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

代码语言:javascript
复制
 components CC2420ActiveMessageC, myModuleP as App; 
 App.PacketLink -> CC2420ActiveMessageC.PacketLink;

上面要做的是编译数据包链路层以及通信堆栈的其余部分。您可以查看PacketLinkP.nc文件,以查看传递给PacketLink接口的值是如何使用的。

如果您正在使用PacketLink接口,并且PacketAcknowledgements.wasAcked在您的AMSend.sendDone方法中返回FALSE,那么这意味着尽管进行了多次重试,传输仍然失败。此时,您可以再次尝试重新传输(设备将再次尝试重新传输最多maxRetries次)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43506028

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档