2017-04-19 26 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次)。