Пакетные благодарности в 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, поэтому лично я бы не стал писать дополнительный код для обработки подтверждений самостоятельно и придерживался предоставленных инструментов.