首页 > 解决方案 > 如何在 INET 中管理状态转换

问题描述

我正在尝试在 x-mac 协议中实现数据确认。算法是,数据包传输结束后,发送节点将等待接收方的确认。为此,我添加了一个新状态 WAIT_ACK。但是在运行时,我可以看到节点无法从WAIT_TX_DATA_OVERto进行状态转换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]。无线电: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

解决方案


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


推荐阅读