我使用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。 这种确认如何运作?
我已经用我自己的确认类型进行了检查,它的工作方式就像收到数据包后mote确认数据包一样,如果源mote在某个时间帧内没有收到肯定的ack,则重新发送数据包。
那么哪种方式更好?
请指导&感谢,
答案 0 :(得分:4)
在TinyOS中,确认是在最低的通信抽象级别 - 活动消息[1]上实现的。这意味着使用活动消息操作的任何组件都具有对同步确认的内置支持。
实际上我的疑问是,接收微尘应该承认 数据包或它应该有PacketAcknowledgements接口 应用程序以发送ACK。
如果您使用PacketAcknowledgements.requestAck(&myMsg)
请求确认,那么您不必在Receive.receive事件处理程序中编写额外的代码来处理ack,因为这是由底层通信层为您完成的。您需要做的就是将组件/模块使用的PacketAcknowledgements接口连接到其中一个提供程序(AMSenderC或ActiveMessageC)。
这种确认如何运作?
高级别的想法如下:调用PacketAcknowledgements.requestAck(&myMsg)
在数据包标头中设置一个标志,并告知发送方组件在收到(或超时)ack之前不发出sendDone事件的信号。当接收器组件在另一端处理数据包时,它会读取标志并在请求时发送和确认。
说了这么多,对你的确认包的方式的描述看起来与PacketAcknowledgements提供的非常相似,所以我个人会避免编写额外的代码来处理我自己的确认并坚持使用提供的工具。