在OMNET ++中连续发送多个数据包

时间:2018-05-26 19:13:29

标签: omnet++

我是OMNET ++的新手,需要你的帮助。我正在进行模拟,其中数据包需要从一个模块转到另一个模块,而无需等待第一个模块发送所有数据包。

from matplotlib import gridspec

fig = plt.figure(figsize = (8.5,11))

gs = gridspec.GridSpec(2, 4, width_ratios=[.48,.02,.48,.02],wspace=0,hspace=0)

for i in [0,1]:
    for j in [0,2]:
        d = np.random.random((200,200))
        ax = fig.add_subplot(gs[i,j])
        ax_cb = fig.add_subplot(gs[i,j+1])
        sns.heatmap(d,cmap='jet',ax=ax, cbar_ax=ax_cb)

gs.tight_layout(fig)

现在,如果模块A通过模块B向模块C发送5个数据包,则模块B等待所有5个数据包接收,并且在收到所有5个数据包后,开始发送到模块C。

我想要的是,如果模块B接收到数据包,它需要直接发送到模块C而无需等待模块A发送所有数据包。

请查看附图以供参考。在此图像中,您可以看到中间4个模块保留所有数据包并在模块1发送所有数据包时开始转发。

enter image description here

感谢你的帮助。

模块A代码

JTextField

模块B代码

 -------------               ------------          -------------   
|   Module A  |     -->     |  Module B  |   -->  |   Module C  |
 -------------               ------------          -------------

模拟日志

#include <string.h>
#include <omnetpp.h>
#include <iostream>
#include <cstdlib>

using namespace omnetpp;

class QKDProcessor : public cSimpleModule
{
     private:
          int randomGate;
          int counter = 0 ;
     protected:
          virtual void handleMessage(cMessage *msg) override;
};

Define_Module(QKDProcessor);

void QKDProcessor::handleMessage(cMessage *msg)
{
     if(strcmp("QuantumStatesProcessorBob", getName()) == 0)
     {
         delete msg;
         if(counter == 0)
         {
             cMessage *keyCheck = new cMessage("T");
             send(keyCheck,"out",0);
         }
         counter++;
     }
     else
     {
         std::string key = msg->getName();
         delete msg;
         char *stat = new char[key.length()+1];
         strcpy(stat, key.c_str());

         for(int i=0; i<key.length(); i++)
         {
             // Selecting random gates
             double x = rand()/static_cast<double>(RAND_MAX+1);
             randomGate = 0 + static_cast<int>( x * (4 - 0) );

             // Create individual message for each bit.
             std::string j = std::string(1,stat[i]);
             cMessage *quantumState = new cMessage(j.c_str());
             send(quantumState,"out", randomGate);
         }
     }
 }

1 个答案:

答案 0 :(得分:3)

正如Jerzy建议的那样,您的模拟工作正常。假设您没有在模块之间的通道上设置延迟,您所看到的是所有这些消息交换同时发生(t = 0),而不是像实际动画所暗示的那样。在模拟时间内,这些消息发生在同一时间。观看右上角的模拟时间显示。它在这些消息交换期间没有进展但保持为0,因此您假设模块B在收到消息后不立即发送是假的。虽然这些消息交换发生在相同的模拟时间,但模拟器在动画期间将它们序列化以便更好(或更糟)。或者换句话说,这里有两个不同的时间轴:模拟时间和动画时间。这两者并不相同,有时可能令人困惑。

现在,如果您想要查看更符合模拟时间的动画,您应该转到动画选项对话框并启用广播动画。该模式收集在同一事件中发生的所有事件(消息发送)并并行动画它们。你会看到模块A发送的所有消息并行动画,并且在模块B发送给C之后,请注意,这仍然不是镜像现实(模拟时间),因为它只动画那些并行发生的消息。同一事件(不是那些在同一模拟时间发生的事件)。即实际上,模块A和B都将同时发送消息,并且视频上的所有消息交换应该立即动画化。然而,该动画也会误导消息发送的图形实现,其中一个点沿着连接线传播,因为在这种情况下,您将丢失因果信息(即,您不会看到来自模块B的消息实际上是由从模块A传入的消息,因此这种模式也会产生误导。这就是为什么OMNeT ++只回归动画来自同一事件的消息。

动画的第三种方式是摆脱旅行的点,然后闪烁显示消息交换发生的连接线。但是,如果屏幕上的所有连接同时闪烁,也会丢失信息,原因影响关系将再次丢失。

实际上,信息永远不会在物理实体之间以无限速度传播,因此某种延迟总是在它们之间的通道上是合理的。这对动画很有帮助。最后的建议是,您应该使用最新版本的OMNeT ++和Qtenv,因为它大大提高了动画功能。