2

我正在使用 telosB 微粒进行实施。我遇到了一种确认数据包的方法,

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 确认数据包,如果源 mote 在特定时间范围内没有收到肯定的 ack,则重新传输数据包。

那么哪种方式更好呢?

请指导,谢谢,

4

1 回答 1

4

在 TinyOS 中,确认是在最低的通信抽象级别 - 活动消息[1]上实现的。这意味着任何使用活动消息操作的组件都具有对同步确认的内置支持。

实际上我的疑问是,接收节点应该必须确认数据包,或者它的应用程序中应该有 PacketAcknowledgements 接口才能发送 ACK。

如果您曾经PacketAcknowledgements.requestAck(&myMsg)请求确认,那么您不必在 Receive.receive 事件处理程序中编写额外的代码来处理确认,因为这是由底层通信层为您完成的。您需要做的就是将组件/模块使用的 PacketAcknowledgements 接口连接到提供者之一(AMSenderC 或 ActiveMessageC)。

这种类型的确认是如何工作的?

高级想法如下 - 调用PacketAcknowledgements.requestAck(&myMsg)在数据包头中设置一个标志,并告诉发送方组件在收到确认(或超时)之前不要发出 sendDone 事件。当接收器组件在另一端处理数据包时,它会读取标志并在请求时发送和确认。

说了这么多,你对数据包的确认方式的描述似乎与 PacketAcknowledgements 提供的非常相似,所以我个人会避免自己编写额外的代码来处理确认并坚持使用提供的工具。

于 2013-02-20T00:45:18.340 回答