我再次遇到了疑问。我在我的实现中插入了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,则重传原始消息。如果没有发生这种情况,你能否建议我对此进行适当的修改?
答案 0 :(得分:0)
我的问题是,在这一点上,如果确认没有确认,那么 原始邮件被重新传输。
不,邮件不会被重传。
如果没有发生这种情况,您能否建议我进行适当的更改 这会发生什么?
您正在做的只是请求确认而不启用重新传输。重传由分组链路层发送,该链路层使用指定的HERE。
为了实现重传,您需要:
1)将PACKETLINK
预处理器变量添加到makefile中。这可以通过简单地将“-DPACKETLINK”添加到makefile中的PFlags来完成,即
PFLAGS = -DPACKETLINK
2)指定设备可以传输的最大重试次数以及每次重试之间的延迟。这是通过适当调用Packet链接接口中的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
3。在配置文件中,您需要提供实例化的Packetlink实现并将其链接到您的模块。例如,如果您使用的节点带有CC2420收发器(例如TelosB节点),您将在配置文件的实现部分中具有以下内容。
components CC2420ActiveMessageC, myModuleP as App;
App.PacketLink -> CC2420ActiveMessageC.PacketLink;
以上操作是编译分组链路层以及其余的通信栈。您可以查看PacketLinkP.nc
文件,了解如何使用传递给PacketLink接口的值。
如果您正在使用PacketLink接口并且PacketAcknowledgements.wasAcked
在FALSE
方法中返回AMSend.sendDone
,则表示尽管所有重试都仍然无法传输。此时您可以再次尝试重新传输(设备将再次尝试重新传输最多maxRetries
次)。