Отправка нескольких пакетов вместе в OMNET ++ непрерывно - PullRequest
0 голосов
/ 26 мая 2018

Я новичок в OMNET ++ и мне нужна ваша помощь.Я работаю над симуляцией, когда пакеты должны идти от одного модуля к другому, не дожидаясь, пока первый модуль отправит все пакеты.

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

Теперь, если модуль A отправит 5 пакетов в модуль C через модуль B, модульB ожидает получения всех 5 пакетов и после получения всех 5 пакетов, после чего начинается его отправка в модуль C.

Что я хочу, если модуль B принимает пакеты, то он должен сразу отправить в модульC, не дожидаясь, пока модуль A отправит все пакеты.

Пожалуйста, проверьте прикрепленное изображение для справки.на этом рисунке вы можете видеть, что средние 4 модуля сохраняют все пакеты и начинают пересылку, когда модуль 1 отправляет все пакеты.

enter image description here

спасибо за вашу помощь ваванс.

Код модуля A

#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);
         }
     }
 }

Код модуля B

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

 using namespace omnetpp;

 class PolarizationFilter : public cSimpleModule
 {
      protected:
          virtual void handleMessage(cMessage *msg) override;
 };

 Define_Module(PolarizationFilter);

 void PolarizationFilter::handleMessage(cMessage *msg)
 {
     send(msg,"polarizaedLight",0);
 }

Журнал моделирования

** Initializing network
Initializing module QKDNetwork, stage 0
QKDNetwork.AliceProcessor: Initializing module QKDNetwork.AliceProcessor, stage 0
QKDNetwork.BobProcessor: Initializing module QKDNetwork.BobProcessor, stage 0
QKDNetwork.AlicePublicChannel: Initializing module QKDNetwork.AlicePublicChannel, stage 0
QKDNetwork.BobPublicChannel: Initializing module QKDNetwork.BobPublicChannel, stage 0
QKDNetwork.FilterA: Initializing module QKDNetwork.FilterA, stage 0
QKDNetwork.FilterB: Initializing module QKDNetwork.FilterB, stage 0
QKDNetwork.FilterC: Initializing module QKDNetwork.FilterC, stage 0
QKDNetwork.FilterD: Initializing module QKDNetwork.FilterD, stage 0
QKDNetwork.Alice_Quantum_Channel: Initializing module QKDNetwork.Alice_Quantum_Channel, stage 0
QKDNetwork.Bob_Quantum_Channel: Initializing module QKDNetwork.Bob_Quantum_Channel, stage 0
QKDNetwork.DiagonalFilter: Initializing module QKDNetwork.DiagonalFilter, stage 0
QKDNetwork.HorizontalFilter: Initializing module QKDNetwork.HorizontalFilter, stage 0
QKDNetwork.QuantumStatesProcessorBob: Initializing module QKDNetwork.QuantumStatesProcessorBob, stage 0
QKDNetwork.QuantumStatesProcessorAlice: Initializing module QKDNetwork.QuantumStatesProcessorAlice, stage 0
** Event #1  t=0  QKDNetwork.QuantumStatesProcessorAlice (QKDProcessor, id=15)  on 01000001 (omnetpp::cMessage, id=0)
** Event #2  t=0  QKDNetwork.FilterC (PolarizationFilter, id=8)  on 0 (omnetpp::cMessage, id=2)
** Event #3  t=0  QKDNetwork.FilterB (PolarizationFilter, id=7)  on 1 (omnetpp::cMessage, id=4)
** Event #4  t=0  QKDNetwork.FilterB (PolarizationFilter, id=7)  on 0 (omnetpp::cMessage, id=6)
** Event #5  t=0  QKDNetwork.FilterD (PolarizationFilter, id=9)  on 0 (omnetpp::cMessage, id=8)
** Event #6  t=0  QKDNetwork.FilterD (PolarizationFilter, id=9)  on 0 (omnetpp::cMessage, id=10)
** Event #7  t=0  QKDNetwork.FilterC (PolarizationFilter, id=8)  on 0 (omnetpp::cMessage, id=12)
** Event #8  t=0  QKDNetwork.FilterA (PolarizationFilter, id=6)  on 0 (omnetpp::cMessage, id=14)
** Event #9  t=0  QKDNetwork.FilterD (PolarizationFilter, id=9)  on 1 (omnetpp::cMessage, id=16)
** Event #10  t=0  QKDNetwork.Alice_Quantum_Channel (QKDChannel, id=10)  on 0 (omnetpp::cMessage, id=2)

1 Ответ

0 голосов
/ 29 мая 2018

Как предположил Ежи, ваша симуляция работает правильно.Предполагая, что вы не установили задержку на канале между модулями, вы видите, что все эти обмены сообщениями происходят в одно и то же время (t = 0), а НЕ в последовательности, как предполагает реальная анимация.Во время моделирования эти сообщения происходят в то же время.Посмотрите время симуляции в правом верхнем углу.Он не прогрессирует во время этих обменов сообщениями, но остается на 0, поэтому ваше предположение, что Модуль B не отправляет сразу после получения сообщения, неверно.Хотя обмен сообщениями происходит в одно и то же время симуляции, симулятор сериализует их для лучшего (или худшего) во время анимации.Или, другими словами, здесь есть две разные временные шкалы: время симуляции и время анимации.Они НЕ одинаковы и иногда могут сбивать с толку.

Теперь, если вы хотите увидеть анимацию, которая больше соответствует времени симуляции, вы должны перейти в диалог настроек анимации и включить широковещательную анимацию.Этот режим собирает все события (отправка сообщений), которые происходят в одном и том же событии , и анимирует их параллельно.Вы увидите все сообщения, отправленные модулем A, анимированные параллельно, и сразу после этого модуль B отправит на C. Обратите внимание, что это все еще НЕ отражает реальность (время моделирования), потому что он анимирует только те параллельные сообщения, которые происходят водно и то же событие (не те, которые происходят в одно и то же время симуляции).т.е. в действительности все оба модуля A и B будут отправлять сообщения одновременно, и все обмены сообщениями на видео должны быть анимированы одновременно.Однако эта анимация также вводит в заблуждение графической реализацией отправки сообщения с точкой, проходящей вдоль линий соединения, потому что в этом случае вы потеряете информацию о причине и следствии (т.е. вы не увидите, что сообщение от модуля B на самом деле вызваносообщения, поступающие из модуля А, поэтому этот режим также вводит в заблуждение).Вот почему OMNeT ++ использует анимацию только сообщений от одного и того же события.

Третий способ анимации - избавиться от движущихся точек и просто высветить линии соединения, показывая, что произошел обмен сообщениями.Однако это также приведет к потере информации: вы увидите, что все соединения на экране мигают одновременно, и причинно-следственная связь снова будет потеряна.

На самом деле, информация никогда не перемещается с бесконечной скоростью между физические объекты, поэтому некоторая задержка всегда оправдана на каналах между ними.Это очень помогает с анимацией.И последний совет: вам следует использовать последнюю версию OMNeT ++ и Qtenv, поскольку она значительно улучшила возможности анимации.

...