TinyOS中的数据包确认



Iam使用telosB motes进行实现。我遇到了一种确认数据包的方法,

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。这种类型的确认是如何工作的?

我已经用我自己的确认类型进行了检查,它的工作原理就像在收到数据包后,远程设备确认数据包,如果源远程设备在特定时间段内没有收到肯定的确认,那么重新发送数据包。

那么,哪种方式更好呢?

请指导&谢谢,

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

事实上,我的怀疑是,接收的卫星应该承认数据包或它的应用程序,以便发送ACK。

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

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

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

话虽如此,对您确认数据包的方式的描述似乎与PacketAcknowledgements提供的非常相似,因此就我个人而言,我会避免自己编写处理确认的额外代码,并坚持使用所提供的工具。

最新更新