Пакетные благодарности в TinyOS

Я использую 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. Как работает этот тип подтверждения?

И я проверил с моим собственным типом подтверждения, он работает так, как если бы после получения пакета узел подтвердил пакеты, если исходный узел не получил положительного подтверждения в течение определенного периода времени, затем повторно передал пакет.

Так какой же способ лучше?

Пожалуйста, руководство и спасибо,

1 ответ

Решение

В TinyOS подтверждения реализованы на самом низком уровне коммуникационной абстракции - активном сообщении [1]. Это означает, что любой компонент, который работает с активными сообщениями, имеет встроенную поддержку синхронных подтверждений.

На самом деле я сомневаюсь, что принимающий узел должен был бы подтвердить пакет, или он должен иметь интерфейс PacketAcknowledgements в своем приложении для отправки ACK.

Если вы использовали PacketAcknowledgements.requestAck(&myMsg) чтобы запросить подтверждение, вам не нужно писать дополнительный код в обработчике события Receive.receive для обработки подтверждений, поскольку это делается для вас базовым уровнем связи. Все, что вам нужно сделать, это подключить интерфейс PacketAcknowledgements, который ваш компонент / модуль использует к одному из поставщиков (AMSenderC или ActiveMessageC).

Как работает этот тип подтверждения?

Идея высокого уровня заключается в следующем - вызов PacketAcknowledgements.requestAck(&myMsg) устанавливает флаг в заголовке пакета и сообщает компоненту отправителя не сигнализировать о событии sendDone до тех пор, пока ack не будет получен (или не истечет время ожидания). Когда компонент получателя обрабатывает пакет на другом конце, он читает флаг и отправляет и подтверждает, если требуется.

Сказав все это, описание вашего способа подтверждения пакетов кажется очень похожим на то, что предлагает PacketAcknowledgements, поэтому лично я бы не стал писать дополнительный код для обработки подтверждений самостоятельно и придерживался предоставленных инструментов.

Другие вопросы по тегам