2013-02-05 32 views
2

Iam使用telosB微粒實現。 我所遇到的用於確認數據包的方式之一,TinyOS中的分組確認

task void send() { 
    call PacketAcknowledgements.requestAck(&myMsg); 
    if(call AMSend.send(1, &myMsg, 0) != SUCCESS) { 
     post send(); 
    } 
    } 
event void AMSend.sendDone(message_t *msg, error_t error) { 
    if(call PacketAcknowledgements.wasAcked(msg)) 
     // do something if packet was acked 
    else 
     // do something else if packet was not acked (possibly resend) 
    } 

其實我的疑問是,接收微塵應該有應答數據包,或者它應該有PacketAcknowledgements接口的應用,以發送的ACK。 這種類型的確認是如何工作的?

我已經檢查了我自己的確認類型,它的工作方式類似於在收到包確認數據包之後,如果源mote在某個時間幀內沒有收到正確的確認,然後重新發送數據包。

那麼哪個更好的方法呢?

請指導&感謝,

回答

4

在TinyOS的確認是在最低的通信抽象層實現 - 主動消息[1]。這意味着任何使用主動消息的組件都具有對同步確認的內置支持。

其實我的疑問是,接收微塵應該不得不承認 包或它應該有PacketAcknowledgements接口在其 應用才能發送的ACK。

如果使用PacketAcknowledgements.requestAck(&myMsg)請求確認,則不必在Receive.receive事件處理程序處理的ACK,因爲這是你的通信層基本完成編寫額外的代碼。您需要做的就是將您的組件/模塊使用的PacketAcknowledgements接口連接到其中一個提供程序(AMSenderC或ActiveMessageC)。

這種類型的確認是如何工作的?

高電平想法是以下 - 主叫PacketAcknowledgements.requestAck(&myMsg)設置在分組報頭的標誌,並告訴發送方部件直到ACK被接收(或超時)不與信號sendDone事件。當接收器組件處理另一端的數據包時,它讀取該標誌,並在請求時發送和確認。儘管如此,關於您確認數據包的方式的描述看起來與PacketAcknowledgements所提供的方式非常相似,因此我個人不會編寫額外的代碼來處理確認,並且堅持使用提供的工具。