2017-04-19 107 views
1

我又遇到了一个疑问。我在我的实现中插入了使用ACK。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没有被确认,原始邮件的重发。如果这种情况没有发生,你能否建议我对此进行适当的修改?

回答

0

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

否,邮件不会被重发。

如果没有发生这种情况,你能否建议我为此发生适当的变化 ?

你在做什么只是要求确认,不启用重传。重传由分组链路层发送,该分组链路层按照指定的HERE使用。

为了能够重新传输您需要:

1)PACKETLINK处理器变量添加到您的Makefile。这可以通过简单地在生成文件即

PFLAGS = -DPACKETLINK

2)添加“-DPACKETLINK”到PFlags指定设备可以传输重试的最大数量和每个重试之间的延迟来完成。这是通过调用适当的分组链路接口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.wasAckedAMSend.sendDone方法中返回FALSE那么这意味着即使进行了所有重试,传输仍然失败。此时您可以再次尝试重新传输(该设备将再次尝试重新传输总共maxRetries次)。