我再一次遇到了一个疑问。我在我的实现中插入了ACK的使用。
在函数中:
AMSend.sendDone (message_t * bufPtr, error_t error) {
if (call PacketAcknowledgements.wasAcked (bufPtr)) {
dbg ("test", "SEND_ACK \ n");
}
}它显然工作正常,这取决于输出日志。
已在函数中:
AMControl.startDone (error_t err) {
radio = TRUE;
dbg ("test", "SLOT_ACTIVE \ n");
if (err == SUCCESS) {
if ((call Clock.get ()> (ultpkdados + 5000)) && (TOS_NODE_ID! = 0)) {
test_msg_t * rcm = (test_msg_t *) call Packet.getPayload (& pkt, sizeof (test_msg_t));
rcm-> type = 1;
rcm-> nodeid = TOS_NODE_ID;
rcm-> proxsalto = syncwith;
call PacketAcknowledgements.requestAck (& pkt);
if (call AMSend.send (syncwith, & pkt, sizeof (test_msg_t)) == SUCCESS) {
Dbg ("test", "SEND_PKT_DATA \ n"));
locked = TRUE;
ultpkdados call Clock.get = ();
}
}
}
}这个函数startDone正常地发送这个“数据”包,并且我调用了一个PacketAcknowledgements.requestAck来请求确认。
我的问题是,在这一点上,如果ACK未得到确认,是否会重新传输原始消息。如果这种情况没有发生,您能建议我进行适当的更改吗?
发布于 2017-05-10 21:26:47
我的问题是,在这一点上,如果确认没有被确认,原始消息是否被重传。
不会,该消息将不会被重传。
如果没有发生这种情况,您能建议我进行适当的更改吗?
您所做的只是请求确认,而不是启用重新传输。重新传输由用作指定HERE的数据包链路层发送。
要启用重新传输,您需要执行以下操作:
1)将PACKETLINK预处理器变量添加到生成文件中。这可以通过在makefile中的PFlags中添加"-DPACKETLINK“来实现。
PFLAGS = -DPACKETLINK
2)指定您的设备可以传输的最大重试次数和每次重试之间的延迟。这可以通过适当地调用数据包链接接口中的setRetries和setRetryDelay函数来实现(这些函数可以在PacketLink接口的实例化中找到,因此您需要在模块的连接部分中使用uses interface PacketLink语句)。在调用AMSend.send之前,需要设置重试次数。也就是说,你需要有类似以下内容的东西:
#if defined(PACKET_LINK)
maxRetries = 100; //max retries
myDelay = 10; //delay between retries
call PacketLink.setRetries(&pkt, maxRetries); //set retries
call PacketLink.setRetryDelay(&pkt, myDelay); //set delay
#endif components CC2420ActiveMessageC, myModuleP as App;
App.PacketLink -> CC2420ActiveMessageC.PacketLink;上面要做的是编译数据包链路层以及通信堆栈的其余部分。您可以查看PacketLinkP.nc文件,以查看传递给PacketLink接口的值是如何使用的。
如果您正在使用PacketLink接口,并且PacketAcknowledgements.wasAcked在您的AMSend.sendDone方法中返回FALSE,那么这意味着尽管进行了多次重试,传输仍然失败。此时,您可以再次尝试重新传输(设备将再次尝试重新传输最多maxRetries次)。
https://stackoverflow.com/questions/43506028
复制相似问题