【问题标题】:How to manage state transitions in INET如何在 INET 中管理状态转换
【发布时间】:2021-07-06 06:36:01
【问题描述】:

我正在尝试在 x-mac 协议中实现数据确认。算法是,数据包传输结束后,发送节点将等待接收方的确认。为此,我添加了一个新状态 WAIT_ACK。但是在运行时,我可以看到节点无法从WAIT_TX_DATA_OVER 到WAIT_ACK 进行状态转换。我收到以下错误。

状态 7(无线电状态 2)中类型 204 的未定义事件! -- 在模块 (inet::XMac1) SensorNetworkShowcaseA.sensor3.wlan[0].mac (id=181) 中,在 t=0.10677288732s,事件 #62

注意:XMAC1_DATA_TX_OVER = 204 并且状态 7 是 WAIT_ACK

case SEND_DATA:

    if (msg->getKind() == XMAC1_STOP_PREAMBLES) {
        sendDataPacket();
        macState = WAIT_TX_DATA_OVER;
        return;
    }
    else if (msg->getKind() == XMAC1_SWITCHING_FINISHED) {
        sendDataPacket();
        macState = WAIT_TX_DATA_OVER;
        return;
    }
    else {
        return;
    }
    break;

case WAIT_TX_DATA_OVER:
     if (msg->getKind() == XMAC1_DATA_TX_OVER) {
        scheduleAt(simTime() + (slotDuration / 2), data_ack_timeout);
        macState = WAIT_ACK;
        radio->setRadioMode(IRadio::RADIO_MODE_RECEIVER);
        changeDisplayColor(GREEN);

    }
    break;
case WAIT_ACK:
    if (msg->getKind() == XMAC1_DATA_TX_OVER) {
        delete msg;
        return;
    }
   ...
   }
    
    break;

更新

在运行时,执行停止后我可以看到以下内容

INFO (XMac1)SensorNetworkShowcaseA.sensor3.wlan[0].mac:节点 0A-AA-00-00-00-04:状态 WAIT_TX_DATA_OVER,消息 XMAC_DATA_TX_OVER,新状态 WAIT_ACK INFO (ApskScalarRadio)SensorNetworkShowcaseA.sensor3.wlan[0].radio:SensorNetworkShowcaseA.sensor3.wlan[0].radio:无线电模式从 TRANSMITTER 更改为 RECEIVER。 INFO (ApskScalarRadio)SensorNetworkShowcaseA.sensor3.wlan[0].radio:SensorNetworkShowcaseA.sensor3.wlan[0].radio:将无线电接收状态从 UNDEFINED 更改为 IDLE。 INFO (ApskScalarRadio)SensorNetworkShowcaseA.sensor3.wlan[0].radio:SensorNetworkShowcaseA.sensor3.wlan[0].radio:将无线电传输状态从 IDLE 更改为 UNDEFINED。 状态 7(无线电状态 2)中类型 204 的未定义事件! -- 在模块 (inet::XMac1) SensorNetworkShowcaseA.sensor3.wlan[0].mac (id=181) 中,在 t=0.10677288732s,事件 #62

【问题讨论】:

    标签: omnet++ inet


    【解决方案1】:

    根据您提供的信息,这不应该发生,因此您的假设有些地方是错误的。很可能,您没有运行此代码。确保确实执行了此代码(您可以构建发布版本并运行调试版本或其他)。在这些情况下,我经常临时修改代码中的错误消息,以查看代码更改是否真的编译到可执行文件中,以确保我运行的确实是我假设运行的代码。

    【讨论】:

    • 这是我正在运行的代码。在我的问题中,我添加了执行因错误停止后可以看到的信息。正如你所建议的,我也尝试通过更改代码,然后我可以看到代码更改的影响。如果我的代码有误或者我需要查看其他内容来修复此错误,您能否建议我?谢谢。
    • 据我所知,您的代码是正确的。您看到的错误是在函数结束时抛出的,并且执行不应到达该点,因为函数应该从 switch 语句内部返回。现在显然不是这样,因此您应该调试并查看此事件中的实际执行路径。这将向您展示为什么不执行 WAIT_ACK 案例块。
    • 调试显示throw cRuntimeError("Undefined event of type %d in state %d (Radio state %d)!", msg->getKind(), macState, radio->getRadioMode()); 中有一个线程。这是 .cc 文件中唯一显示的内容。我什至无法理解如何从中找出主要问题。有没有办法更多地调试这个线程?谢谢。
    • 当然它显示了,因为那是打印错误的行。您应该尝试在该方法的开头使用断点停止执行并逐步执行。有趣的是执行是如何到达那里的。在调试器中使用 Qtenv 开始模拟,然后“模拟/运行直到...”事件 #62,然后选择“模拟/调试下一个事件”。进入 handleMessage 调用并单步执行代码。
    猜你喜欢
    • 1970-01-01
    • 2011-02-08
    • 2020-06-16
    • 1970-01-01
    • 2018-08-13
    • 2016-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多