LLTR Teil 1: Erste Schritte in OMNeT ++ und INET

OMNeT ++ (Objective Modular Test in C ++ ) Discrete Event Simulator ist eine modulare, komponentenorientierte C ++ - Bibliothek und ein Framework fĂŒr die Modellierung diskreter Ereignisse , die hauptsĂ€chlich zum Erstellen von Netzwerksimulatoren verwendet wird . Einfach ausgedrĂŒckt handelt es sich um einen „diskreten Ereignissimulator“, der Folgendes umfasst: eine IDE zum Erstellen von Modellen und den Simulator selbst (GUI).


Das INET Framework ist eine „Bibliothek“ von Netzwerkmodellen fĂŒr OMNeT ++ .


: LLTR  1 – OMNeT++ 5 the Open Simulator :: LLTR Model :: for freedom use


Volles GIF (15,7 MiB)


In den vorherigen Teilen ...


0. Automatische Erkennung der Netzwerktopologie und nicht verwaltete Switches. Mission unmöglich? (+ klassisches Habrahabr UserCSS )


In diesem Teil:


  • Erstellen Sie „Ihr erstes“ Protokoll (am Beispiel von LLTR Basic).
  • WĂ€hlen Sie den geeigneten Stadtsimulator zum Debuggen des Protokolls (und Erstellen des Modells).
  • Wir lernen die Feinheiten des Einrichtens der Umgebung fĂŒr den Simulator und seine IDE (Konfiguration, Kompilierung, VerknĂŒpfung, Optimierung, Patching, Ignorieren veralteter Dokumentation und andere EnglĂ€nder in großer Zahl).
  • Wir werden auf alles stoßen, was Ihnen beim Erstellen Ihres ersten Modells Ihres ersten Protokolls in einem unbekannten Netzwerksimulator begegnen kann.
  • Lass uns den ganzen Weg zusammen gehen:
    • aus dem GlĂŒck, das durch die erfolgreiche (endlich!) Zusammenstellung des ersten Projekts mit einem leeren Netzwerk gebracht wurde,
    • bis vollstĂ€ndig in Experimente mit einem funktionierenden Protokollmodell eingetaucht;
  • Tutorial , alles wird als Tutorial beschrieben - wir werden aus Fehlern lernen - wir werden sie machen und wir werden sie (Natur) verstehen, um elegant / effizient mit ihnen umzugehen;
  • Repository (Git ), in dessen Commits und Tags alle Schritte ( "HinzufĂŒgen ..." , "Fix ..." , "Fix ..." , "Ändern ..." , "Korrigieren ..." , ...) von Anfang bis Ende gespeichert werden.


Hinweis : ZusĂ€tzliche Informationen fĂŒr Leser des Hubs „Mesh-Network“.


{Bildvolumen: 2,2+ (2,1) MiB; Text: 484 KiB; Emoticons: 22 StĂŒck }}


Hinweis : [Informationen zur verwendeten Partitionsstruktur] Die Struktur des Lernprogramms / Anleitungen unterscheidet sich normalerweise von der Abschnittsstruktur im Verzeichnis: Im Verzeichnis können Sie mit der Abschnittsstruktur die benötigten Informationen in einer minimalen Anzahl von Schritten erreichen (ausgeglichener Baum). In Tutorial / How-to, wo Abschnitte logisch stark miteinander verbunden sind und ein separater Abschnitt tatsĂ€chlich einer der Schritte in der Abfolge der Schritte ist, ist die Struktur eine Hierarchie von Lesezeichen (Ankern), an die Sie sich erinnern können (siehe ) ĂŒber das zuvor beschriebene Fragment.


off - topic: ĂŒber html5 <section> -Tag und Header-Tags <h #>

Es ist gut, dass das <section> -Tag in HTML5 angezeigt wurde. Mit seiner Hilfe wurde es möglich, die Verschachtelungsebene des Abschnitts direkt festzulegen (indem die Verschachtelung der <section> -Tags ineinander manipuliert wurde). Die Textstruktur könnte nun explizit in der Verschachtelung (Hierarchie) von Tags widergespiegelt werden.


Dies betraf auch die Header-Tags <h#> , as Da die Verschachtelung von Abschnitten durch die Verschachtelung des <section> , reichte es zur Angabe des Abschnittsnamens aus, nur ein <h1> in der Form " <section><h1> </h1> </section> " zu verwenden.


Ich habe dies schon lange verwendet (seit dem Erscheinen von <section> ), aber beim Erstellen dieses Artikels habe ich einen weiteren Vorteil der Verwendung von <section> .


Ein guter Abschnittstitel sollte seine Essenz genau wiedergeben. Es gibt jedoch Situationen, in denen Sie die Essenz bis zur Mitte des Abschnitts beibehalten (nicht offenlegen) mĂŒssen. Das heißt, ein solcher Abschnitt sollte zuerst zur „Routine“ werden und in der Mitte einen „Wow / WTF-Effekt“ erzeugen. Logischerweise ist dies alles - ein Abschnitt, aber wenn Sie den Namen ganz am Anfang des Abschnitts offenlegen, ist der Name selbst ein Spoiler . Stellen Sie sich ein Buch (Detektivgeschichte) vor, auf dessen Cover alle Informationen ĂŒber den „Mörder“ stehen.


Hier geht das <section> -Tag „auf die Szene“. Sie können den Namen des Abschnitts an einer beliebigen Stelle in sich selbst bestimmen, d. H. nicht unbedingt ganz am Anfang. Beispiel: " <section> <h1> </h1> </section> ". Es stellt sich heraus, dass wir gleichzeitig die logische Struktur des Textes speichern und den Namen des Abschnitts zum richtigen Zeitpunkt anzeigen können. Sie können den Abschnittstitel sogar visuell am Anfang anzeigen lassen, nachdem der Leser einen bestimmten Punkt erreicht hat (das <h1> in HTML).


In etwas mehr als 9 Jahren des Bestehens von <section> haben Browser nicht gelernt, wie man eine „HTML5-Dokumentskizze“ richtig erstellt, um die ZugĂ€nglichkeit sicherzustellen .


Warum hast du nicht gelernt? In einem Dokument mit einer komplexen Struktur ist es schwierig * zu bestimmen, ab welchem ​​Tag (Abschnitt, Artikel, ...) die Nummerierung der Überschriften (h1, h2, h3, ...) beginnen soll. Stellen Sie sich nun vor, dass das Dokument selbst auf einer Seite wie dieser platziert wird (mit vielen zusĂ€tzlichen Blöcken, die sich nicht auf das Dokument selbst beziehen, aber Überschriften haben) und h1 ĂŒberall fĂŒr Überschriften verwendet wird. Und wenn auf einer Seite nicht ein Dokument, sondern mehrere? Optisch sieht jedoch alles gut aus ( Beispieldokument ).


* - in der Tat ist es nicht schwierig, alles ist im Standard beschrieben , aber in Wirklichkeit funktioniert es nicht (ErklÀrung siehe unten).


Warum sieht optisch alles gut aus? Hier erschienen dank der Stile zusĂ€tzliche Informationen - die Entsprechung zwischen der Abschnittshierarchie und den Kopfzeilenebenen (h #). Vielleicht sollten Sie beim Erstellen der „HTML5-Dokumentskizze“ Informationen aus CSS verwenden? Dazu mĂŒssen Sie dem CSS-Element eine zusĂ€tzliche Eigenschaft fĂŒr das Titelelement hinzufĂŒgen, die dessen Ebene angibt, z. B.:


 body>section>h2                                 { heading-level: 1; font-size: 1.8em;  } body>section>section>h2                         { heading-level: 2; font-size: 1.4em;  } body>section>section>section>h2                 { heading-level: 3; font-size: 1.17em; } body>section>section>section>section>h2        { heading-level: 4; font-size: 1em;   } body>section>section>section>section>section>h2 { heading-level: 5; font-size: 0.83em; } 


Oder eine strengere Option - in einem Abschnitt ist nur ein Header zulÀssig. In diesem Fall wird die Kopfzeilenebene durch den Abschnitt selbst festgelegt:


 body>section                                { heading-level: 1; } body>section>section                        { heading-level: 2; } body>section>section>section                { heading-level: 3; } body>section>section>section>section        { heading-level: 4; } body>section>section>section>section>section { heading-level: 5; } 


und es spielt keine Rolle, welches Header-Tag am Ende verwendet wird: h1 oder h5.


Wenn es jedoch frĂŒher ausreichte, nur eine Markierung (HTML) zu erstellen, um eine „ Gliederung auf Überschriftenebene “ zu erstellen, benötigen wir jetzt auch Stile (CSS). Vielleicht können Sie sich auf Markup (HTML) beschrĂ€nken? Mit dieser Frage sind wir dem im Standard beschriebenen Konstruktionsalgorithmus „Gliederung auf Überschriftenebene“ nahe gekommen. Das Problem liegt also nicht im Algorithmus selbst, sondern in der Tatsache, dass nur ein begrenzter (fester) Satz von Tags als " Schnittwurzel " -Element fungieren kann. Aber Menschen haben oft „nicht standardmĂ€ĂŸige WĂŒnsche“: „Ich möchte, dass das Artikel-Tag das Element„ Schnittwurzel “auf meiner Artikellistenseite ist,„ und ich möchte, dass der beliebige Abschnitt zum Element „Schnittwurzel“ wird “. Zuvor war es ausreichend, mehrere h1-Tags auf einer Seite zu verwenden (und das taten sie auch). Kann man also sicherstellen, dass jeder Abschnitt (Tags: Abschnitt, Artikel, ...) zu einem "Sectioning Root" -Element wird, wenn der Titel darin mit dem h1-Tag festgelegt wird?



# Erste Schritte: "vor dem Modellieren" / "Brainstorming"


Faltblatt

UFO ist eingeflogen und hat diese LĂŒcke hier gelassen ? Die RĂŒckseite der Packungsbeilage aus dem vorherigen Artikel .


# Protokolldetail


Am Anfang definieren wir, was wir in das Protokoll aufnehmen mĂŒssen. Am Beispiel von LLTR Basic.


Die Basis von LLTR sind Iterationen der Statistikerfassung auf mehreren Hosts wĂ€hrend des Netzwerk-Scans. Es gibt viele Iterationen in LLTR (> 1) , daher ist das erste, was in das Protokoll aufgenommen werden muss, die Steuerung des Starts und Stopps jeder Iteration. Wenn wir berĂŒcksichtigen, dass es viele Hosts gibt (> 1) , besteht das Steuerelement darin, alle Hosts auf bestimmte Weise ĂŒber die Startzeit der Iteration und die Endzeit der Iteration zu informieren. Synchronisieren Sie also alle Hosts.


Jede Iteration hat einen eigenen Unicast-src-Host und einen eigenen Unicast-dst-Host. Als NĂ€chstes mĂŒssen Sie also die Möglichkeit haben , Unicast-src und dst fĂŒr jede Iteration zuzuweisen . Das heißt, in jeder Iteration sollte sich einer der Hosts als Unicast-src-Host „bewusst“ sein, dessen Zweck darin besteht, Datenverkehr an den Unicast-dst-Host zu senden.


Und der letzte. Nach Abschluss aller Iterationen mĂŒssen alle gesammelten Statistiken aller Hosts zur Verarbeitung an einen Host gesendet werden. Dieser Host analysiert die gesammelten Statistiken und erstellt die Netzwerktopologie.


In diesem Schritt können Sie auch ĂŒber einige Implementierungsdetails (EinschrĂ€nkungen) des Protokolls nachdenken. Zum Beispiel möchten wir, dass ein Programm, das LLTR verwendet, ohne Root-Rechte und aus dem Benutzerbereich (d. H. Ohne Installation eines speziellen Treibers im System) arbeiten kann, was bedeutet, dass LLTR beispielsweise ĂŒber TCP und UDP funktionieren sollte.


Alle anderen haben die Implementierung durchgefĂŒhrt und werden bei der Erstellung des Modells selbst entscheiden. Das heißt natĂŒrlich, Sie können sofort alles bis ins kleinste Detail durchdenken, aber gleichzeitig besteht die Gefahr, dass Sie "in ein lokales Optimum rutschen" und keine "bessere" Implementierungsoption bemerken. Es ist gut, wenn es mehrere Modelle gibt. Wenn es fĂŒr jede Implementierungsoption ein Modell gibt, können Modelle kombiniert und Schritt fĂŒr Schritt zu einer besseren Implementierung gefĂŒhrt werden. Erinnerung an den genetischen Algorithmus . Beispielsweise kann in einer Implementierung / einem Modell eine zentralisierte Verwaltung vorhanden sein, in einer anderen - dezentralisiert, in der dritten - eine Kombination der besten Teile aus den beiden vorherigen Optionen.


# Auswahl eines Netzwerksimulators


Jetzt ist es Zeit, sich fĂŒr einen Netzwerksimulator zu entscheiden, in dem wir Modelle erstellen und Experimente durchfĂŒhren.


GrundsĂ€tzlich benötigen wir von einem Netzwerksimulator die FĂ€higkeit, „unser“ Protokoll zu implementieren. Nicht alle Simulatoren machen es einfach.


Das Vorhandensein von Betriebssystememulatoren fĂŒr echte NetzwerkgerĂ€te von „Weltmarken“ ist im Gegenteil nicht erforderlich. Höchstwahrscheinlich verursachen Emulatoren viele EinschrĂ€nkungen, die nur die Experimente beeintrĂ€chtigen.


Bei der Auswahl des Simulators halfen mir der Artikel Evaluierung von Netzwerksimulationswerkzeugen (meine Anforderungen an den Simulator stimmten in vielerlei Hinsicht ĂŒberein) und OMNeT ++ General 'Network' Simulation .


# Installieren Sie OMNeT ++ und INET


Laden Sie OMNeT ++ 5.0 herunter .


Und da OMNeT ++ nur ein „diskreter Ereignissimulator“ ist, benötigen Sie auch INET , eine Bibliothek von Netzwerkmodellen (Protokolle und GerĂ€te). Laden Sie INET 3.4.0 herunter . TatsĂ€chlich könnte es von der IDE installiert werden , aber ich empfehle , es manuell zu installieren (spĂ€ter wird klar, warum).


Die Installation unter * nix und unter Windows ist nicht viel anders. Ich werde am Beispiel von Windows fortfahren.


Entpacken Sie OMNeT ++ in% ProgramData% (C: \ ProgramData \) und öffnen Sie die Datei INSTALL.txt (C: \ ProgramData \ omnetpp-5.0 \ INSTALL.txt). Es heißt, dass sich die detaillierten Anweisungen in „doc / InstallGuide.pdf“ befinden. Wenn Sie sie nicht lesen möchten, tun Sie einfach Folgendes:

$. setenv
$ ./configure
$ machen

Aber beeilen Sie sich nicht, es zu tun!


Achten Sie zuerst auf den ersten Befehl . setenv “ . setenv . " Es gibt keine " setenv " -Datei im "omnetpp-5.0" -Verzeichnis (es war in Version 5.0b1). Es wird nicht benötigt (fĂŒr Windows), fĂŒhren Sie also einfach "mingwenv.bat" aus (ich rate Ihnen, vor dem Start zu sehen, was es tut ... um rm zu vermeiden ). Am Ende bricht das Terminal ab (neuwertig).


Zweitens rate ich Ihnen, die Datei "configure.user" ein wenig zu korrigieren (wenn der erwĂ€hnte Parameter in der Datei auskommentiert ist, mĂŒssen Sie ihn auskommentieren):


  • Wenn Sie Clang (standardmĂ€ĂŸig) verwenden möchten, gehen Sie
    PREFER_CLANG=yes
    und konfigurieren:
    • CFLAGS_RELEASE (Compileroptionen):
      CFLAGS_RELEASE='-O2 -march=native -DNDEBUG=1'
  • Wenn Sie GCC anstelle von Clang verwenden möchten (und höchstwahrscheinlich GCC verwenden möchten, nachdem Sie gesehen haben, was in Zeile 398 der Datei „configure.in“ geschrieben steht), installieren Sie
    PREFER_CLANG=no
    und konfigurieren:
    • CFLAGS_RELEASE (Compileroptionen). Kann wĂ€hlen oder
      CFLAGS_RELEASE='-O2 -mfpmath=sse,387 -ffast-math -fpredictive-commoning -ftree-vectorize -march=native -freorder-blocks-and-partition -pipe -DNDEBUG=1'
      oder
      CFLAGS_RELEASE='-O2 -fpredictive-commoning -march=native -freorder-blocks-and-partition -pipe -DNDEBUG=1'
      oder
      CFLAGS_RELEASE='-O2 -march=native -freorder-blocks-and-partition -pipe -DNDEBUG=1'
      (befindet sich in absteigender Reihenfolge des Auftretens von Störungen).
    • Es lohnt sich auch, CXXFLAGS als ' -std=c++11 ' + CFLAGS_RELEASE hinzuzufĂŒgen. Zum Beispiel:
      CXXFLAGS='-std=c++11 -O2 -fpredictive-commoning -march=native -freorder-blocks-and-partition -pipe -DNDEBUG=1'
    • JAVA_CFLAGS (nur auskommentieren):
      JAVA_CFLAGS=-fno-strict-aliasing
  • PREFER_QTENV=yes
  • Deaktivieren Sie die 3D-Visualisierung:
    WITH_OSG=no
    Sie ist sicherlich schön , aber wir werden es nicht brauchen.
  • Leider sollte auch die parallele (auf einer Reihe von CPUs) SimulationsausfĂŒhrung (WITH_PARSIM) deaktiviert werden, aber ohne sie schlĂ€gt der Linker fehl, sodass wir ihn aktiviert lassen:
    WITH_PARSIM=yes

Warum sollten Sie es ausschalten?

Wenn es nicht explizit verwendet wird, wird es (theoretisch) nicht benötigt. Weitere Informationen finden Sie in den Abschnitten 16.1, 16.3 und 16.3.2 „Beispiel fĂŒr eine parallele Simulation“ in „doc / InstallGuide.pdf“ oder hier .



Jetzt können Sie im Terminal (mintty) Folgendes tun:


 ./configure && make clean MODE=release make MODE=release –j17 


Hinweis : " 17 " sollte durch die Anzahl der CPU + 1- Kerne oder durch 1,5 × Kerne ersetzt werden.


Vorsicht fĂŒr Neugierige (Build 64bit)

Das Verzeichnis "tools / win32" enthÀlt MSYS2, seine Compiler-Pakete können aktualisiert werden:



Und OMNeT ++ kann unter 64 Bit erstellt werden .


OMNeT ++ kann jedoch möglicherweise nicht mit einer neueren Version von GCC kompiliert werden (dies war bei der ersten Beta der fĂŒnften Version von OMNeT ++ der Fall - ohne Bearbeitung des Quellcodes wurde es normalerweise nur mit GCC 4.x erstellt). Und der Übergang zu 64-Bit erfordert noch mehr Aufwand. Zuerst mĂŒssen Sie die Kompilierungsoptionen ĂŒberprĂŒfen ( fPIC , nicht benötigt? ). Wenn Sie dann durch den OMNeT ++ - Quellcode scrollen, werden Sie feststellen , dass dort hĂ€ufig der Typ long anstelle von int32_t, size_t und ptrdiff_t (sowie uintptr_t und intptr_t) verwendet wird . Was bedroht das? In * nix in der 64-Bit-Assembly (LP64) betrĂ€gt die lange GrĂ¶ĂŸe 64-Bit und in Windows (LLP64) 32-Bit (siehe Datenmodelle ). Wir mĂŒssen long durch size_t und ptrdiff_t ersetzen, aber hier finden Sie Fallstricke. Zum Beispiel können Sie "src / utils / opp_lcg32_seedtool.cc" öffnen und in Zeile 231 - index nachsehen oder 32 Bit verlassen (durch int32_t ersetzen) oder 64 Bit erstellen und alle Bitmasken + Beschreibungen + (möglicherweise) ein wenig Logik Ă€ndern. Daher muss ein Teil der langen Variablen 32 Bit und der andere Teil 64 Bit belassen werden. Im Allgemeinen mĂŒssen Sie fĂŒr die korrekte Operation alle Punkte ausfĂŒhren von:



Dasselbe muss mit zahlreichen Bibliotheken fĂŒr OMNeT ++ gemacht werden , zum Beispiel mit INET.


Im Allgemeinen warne ich Sie davor, eine 64-Bit- OMNeT ++ - Assembly zu erstellen.


Unter * nix empfehle ich außerdem die Verwendung eines 32-Bit-Builds (zumindest mit Version 5.0 und weniger).


Vielleicht wird sich Andrey2008 eines Tages verpflichten, den OMNeT ++ - und INET-Code zu ĂŒberprĂŒfen ... In der Zwischenzeit schlage ich vor, nur alle „ FIXME “ / „ Fix “ im  -Code zu finden und FIXME .


PS erwĂ€hnt, dass OMNeT ++ - Code , der von einem statischen Code-Analysator ĂŒberprĂŒft wurde, fehlt. In den INET 3.4.0-Dateien von „ChangeLog“ finden Sie jedoch 70 ErwĂ€hnungen zum Beheben von Fehlern nach dem Scannen in Coverity.



OMNeT ++ verwendet Eclipse als IDE. Zur Vereinfachung können Sie eine VerknĂŒpfung in der IDE "% ProgramData% \ omnetpp-5.0 \ ide \ omnetpp.exe" erstellen und an einem leicht zugĂ€nglichen Ort platzieren. Das Verzeichnis "ide / jre /" enthĂ€lt JRE v1.8.0_66-b18. Wenn bereits ein kompatibles JRE / JDK im System installiert ist, kann das Verzeichnis ide / jre / sicher gelöscht werden, indem es durch einen symbolischen Link zum Speicherort des System-JRE ersetzt wird.


Beim ersten Start schlĂ€gt Eclipse vor, den Arbeitsbereich im Verzeichnis "samples" abzulegen. Es ist jedoch besser, ihn in einem anderen fĂŒr Sie geeigneten Verzeichnis außerhalb von "% ProgramData%" abzulegen. Die Hauptsache ist, dass im Pfad zum neuen Verzeichnis nur lateinische Buchstaben (+ Zeichen) verwendet werden und keine Leerzeichen vorhanden sind.


Nach dem Schließen von Welcome bietet die IDE an, INET (wie oben beschrieben) zu installieren und die Beispiele zu importieren - verwerfen Sie beide Punkte.


Eclipse-Einstellungen, JVM-Optionen, zusÀtzliche Plugins und Themen

JVM-Optionen . FĂŒgen Sie der Datei „ide / omnetpp.ini“ hinzu (jeder Editor, der LF-ZeilenvorschĂŒbe versteht, eignet sich zum Bearbeiten; der Editor funktioniert nicht), und speichert die letzte leere Zeile:


 -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+AggressiveOpts -XX:+TieredCompilation -XX:CompileThreshold=100 

Eclipse-Tuning (un [7z] me)


Um Eclipse wie die auf dem Bild zu machen, schauen Sie in das Bild.



Es ist Zeit, INET zu installieren. Das Verzeichnis "inet" aus dem zuvor heruntergeladenen Archiv (inet-3.4.0-src.tgz) muss in den Arbeitsbereich ĂŒbertragen werden. Im Verzeichnis befindet sich eine INSTALL-Datei mit einer schrittweisen Beschreibung der Installation. Sie können es verwenden (Abschnitt „Wenn Sie die IDE verwenden“), aber erstellen Sie einfach kein (Build-) Projekt!


INET importieren:


  1. Öffnen Sie in Eclipse: Datei> Importieren.
  2. WĂ€hlen Sie: Allgemeine / Vorhandene Projekte im Arbeitsbereich.
  3. WĂ€hlen Sie als „Stammverzeichnis“ den Speicherort des Arbeitsbereichs.
  4. Stellen Sie sicher, dass die Option "Projekte in Arbeitsbereich kopieren" deaktiviert ist.
  5. Warten Sie nach dem Klicken auf die SchaltflĂ€che „Fertig stellen“, bis die Indizierung des Projekts abgeschlossen ist (% der Fertigstellung, siehe unten in der Statusleiste - „ C / C ++ - Indexer“).


Richten Sie das Projekt ein:


  • A. Komponenten deaktivieren, die fĂŒr LLTR nicht erforderlich sind;
  • B. die Baugruppe auf Freigabe schalten;
  • C. Entfernen Sie die OMNeT ++ Make Builder-Störungen (opp_makemake). FrĂŒher, als es ausgewĂ€hlt wurde, wurde das Makefile hĂ€ufig neu generiert, auch wenn es nicht erforderlich war.
  • D. parallele Kompilierung aktivieren ;
  • E. Optimierungen aktivieren;
  • F. Aktivieren Sie die Syntaxhervorhebung fĂŒr c ++ 11 an mehreren Stellen.
  • G. Beheben Sie den Fehler im Zusammenhang mit " #include " (dies passiert, wenn Sie "Current Builder" mehrmals Ă€ndern; in anderen FĂ€llen kann dies passieren).


Bevor Sie {A} einrichten, mĂŒssen Sie eine der Projektdateien reparieren. In der Datei "inet / .oppfeatures" befindet sich eine Zeile " inet.examples.visualization ". inet.examples.visualization mĂŒssen Sie eine leere Zeile hinzufĂŒgen, in die " inet.tutorials.visualization " geschrieben werden soll, wobei der Einzug vorzugsweise links bleibt (analog zu anderen Parametern " nedPackages " in der Datei ) Wenn dies nicht getan wird, passiert nichts Schlimmes. Unmittelbar nach dem Einstellen von „Probleme“ (Alt + Umschalt + Q, X) inet.tutorials.visualization immer Fehler im Zusammenhang mit „ inet.tutorials.visualization “ auf. Sie können zuerst {A} erstellen, die Fehler ĂŒberprĂŒfen und dann die Datei "inet / .oppfeatures" korrigieren. Gleichzeitig warnt Eclipse vor einer Verletzung der IntegritĂ€t in den Einstellungen und bietet an, diese zu beheben (wir stimmen dem zu).


Beginnen wir ( Fenster „Projektexplorer“> Projekt „Inet“> KontextmenĂŒ> Eigenschaften ):


  1. Abschnitt OMNeT ++> Unterabschnitt Projektfunktionen
    1. {A} entferne alles außer:
      • TCP Common
      • TCP (INET)
      • IPv4-Protokoll
      • UDP-Protokoll
      • Ethernet
    2. SchaltflĂ€che "Übernehmen".
  2. Abschnitt „C / C ++ Build“:
    1. SchaltflÀche "Konfigurationen verwalten ..."> "gcc-release" {B} aktivieren;
    2. WĂ€hlen Sie die Konfiguration "gcc-release [Active]" {B} .
    3. Unterabschnitt „Tool Chain Editor“:
      1. WĂ€hlen Sie als "Aktueller Builder" fĂŒr beide Konfigurationen "GNU Make Builder": "gcc-debug" und "gcc-release" {C} . Hinweis : Wenn Sie in Zukunft "Aktueller Builder" Ă€ndern, mĂŒssen Sie alles neu konfigurieren!
      2. SchaltflĂ€che "Übernehmen".
    4. Registerkarte "Verhalten" (kehren Sie zum Stammverzeichnis des Abschnitts "C / C ++ Build" zurĂŒck):
      1. Setzen Sie "Parallele Jobs verwenden" auf N (entweder N ist die Anzahl der CPU- Kerne + 1 oder 1,5 × Kerne) - damit können alle CPU-Kerne zum Kompilieren von {D} verwendet werden (konfigurieren Sie fĂŒr "gcc-debug" und "gcc-"). Release ”).
    5. Registerkarte "Build-Einstellungen":
      1. Deaktivieren Sie "Standard-Build-Befehl verwenden".
      2. Ersetzen Sie die Zeile "Build command" durch " make MODE=release CONFIGNAME=${ConfigName} -j17 " (ersetzen Sie " 17 " durch den vorherigen Wert in der Zeile, dh durch das ausgewĂ€hlte N) {E} . Sie können dasselbe tun Ersetzen Sie fĂŒr die Konfiguration "gcc-debug" " MODE=release " durch " MODE=debug " in der Zeile. Vergessen Sie danach nicht, wieder zu "gcc-release [Active]" zu wechseln.
    6. SchaltflĂ€che "Übernehmen".
  3. Abschnitt „C / C ++ Allgemein“:
    1. Unterabschnitt „Pfade und Symbole“:
      1. Registerkarte "Beinhaltet":
        1. SchaltflĂ€che " ../src ": FĂŒgen Sie das Verzeichnis " ../src " mit den ausgewĂ€hlten ../src "Zu allen Konfigurationen hinzufĂŒgen" und "Zu allen Sprachen ../src " {G} hinzu. Anfangs ist " ../src " in der Sprache "GNU C ++ ", jedoch zu einem ungewissen Zeitpunkt kann es aus der Liste gelöscht werden;
        2. ../src Sie auf die SchaltflĂ€che „ ../src “ und ĂŒberprĂŒfen Sie, ob „ ../src “ in allen Sprachen und Konfigurationen ../src .
      2. Registerkarte "Symbole":
        1. SchaltflĂ€che " __cplusplus ": FĂŒgen Sie das Symbol " __cplusplus " mit dem Wert " 201103L " und den ausgewĂ€hlten 201103L "Zu allen Konfigurationen hinzufĂŒgen" und "Zu allen Sprachen hinzufĂŒgen" __cplusplus - {F} more ;
        2. __cplusplus die 201103L " 201103L " und ĂŒberprĂŒfen Sie, __cplusplus " __cplusplus " in der Konfiguration "gcc-debug" den Wert " 201103L " hat.
      3. Registerkarte "Quellspeicherort":
        1. ÜberprĂŒfen Sie, ob ein Element in der Liste vorhanden ist und auf " /inet/src " {G} zeigt. Wenn noch etwas vorhanden ist (z. B. " /inet "), löschen Sie das Element und fĂŒgen Sie es hinzu ("Ordner hinzufĂŒgen") ... ”)“ /inet/src ”. Klicken Sie dann auf die SchaltflĂ€che „Übernehmen“ und kehren Sie zu {A} zurĂŒck , weil Alle Filter wurden beim Löschen gelöscht. Übrigens kann " /inet " tatsĂ€chlich belassen werden - alles lĂ€uft auch gut, aber es ist besser, es auf das ursprĂŒngliche " /inet/src " zu beschrĂ€nken.
    2. Unterabschnitt „PrĂ€prozessor enthĂ€lt Pfade, Marcos usw.“ > Registerkarte "Anbieter":
      1. WĂ€hlen Sie "CDT GCC Build-in Compiler-Einstellungen":
        1. Klicken Sie in der Gruppe "Anbieteroptionen fĂŒr Spracheinstellungen" auf den Link "Arbeitsbereichseinstellungen":
          1. Registerkarte "Discovery": -std=c++11 erneut "CDT GCC Build-in Compiler Settings" und fĂŒgen Sie " -std=c++11 " vor " ${FLAGS} " in "Befehl zum ${FLAGS} Compilerspezifikationen" hinzu. Es sollte ${FLAGS} so aussehen wie " ${COMMAND} -std=c++11 ${FLAGS} -E -P -v -dD "${INPUTS}" ` {F} , weitere Details hier und hier ;
          2. SchaltflĂ€che "Übernehmen", "Ok" (Fenster schließen).
        2. Verschieben Sie "CDT GCC Build-in Compiler-Einstellungen" ĂŒber "CDT Managed Build System Entries" (fĂŒr beide Konfigurationen: "gcc-release" und "gcc-debug") {F} , weitere Details - danach verlieren wir die Möglichkeit, die Zeichen "CDT" neu zu definieren GCC Build-in Compiler-Einstellungen â€œĂŒber„ CDT Managed Build System-EintrĂ€ge “( „ C / C ++ Allgemein “> „ Pfade und Symbole “> „ Symbole “) können Sie nur ĂŒberschreiben, indem Sie den„ CDT-BenutzereinstellungseintrĂ€gen “Werte hinzufĂŒgen. “Entries” (: , .. “CDT Managed Build System Entries” “ __cplusplus ”; , “ __cplusplus __cplusplus ” “CDT Managed Build System Entries”, , );
        3. “Apply”, , “Entries” “GNU C++ ” “CDT GCC Build-in Compiler Settings” ( [ ] “Show build-in values” ) “ __cplusplus=201103L ” ( ).
    3. “Indexer”:
      1. “Build configuration for indexer” “gcc-release” {B} ;
      2. “Apply”.


{E} . Ich werde es erklĂ€ren. , Eclipse , “configure.user” OMNeT++ (./configure). Eclipse g++ make. , , , . , “Build command” {E} “ --just-print ” “ --trace ”, , ( “Project Explorer” > “inet” > > “Clean Project” “Build Project”), “Console” (Alt+Shift+Q,C), ‑ “ g++ -c -std=c++11 -O2 -fpredictive-commoning -march=native -freorder-blocks-and-partition -pipe -DNDEBUG=1 
 ”. , .



( “Project Explorer” > “inet” > > Properties ):


  1. “/++ Build”:
    1. “Build Variables” (, “gcc-release [ Active ]”):
      1. “Add
”, “ CFLAGS ”, “String”, “ -O2 -fpredictive-commoning -march=native -freorder-blocks-and-partition -pipe ”;
      2. “Add
”, “ CXXFLAGS ”, “String”, “ -std=c++11 -O2 -fpredictive-commoning -march=native -freorder-blocks-and-partition -pipe ”;
      3. “Apply”.
    2. “Environment”:
      1. “Add
”, “ CFLAGS ”, “ ${CFLAGS} ”;
      2. “Add
”, “ CXXFLAGS ”, “ ${CXXFLAGS} ”;
      3. “Apply”.


, , g++ , “ --just-print ” “ --trace ”, Process Explorer . Process Explorer , “ -march=native ” “cc1plus.exe”.


, , INET! , “gcc-release” {B} , “ --just-print ” “ --trace ” {E} , . ( “Project Explorer” > “inet” > > “Clean Project” “Build Project”), “Console” (Alt+Shift+Q,C).


, Eclipse, “.cproject” “.settings” {BG} , : “.oppfeatures”, “.oppfeaturestate”, “.nedexclusions” – {A} .


, , .


#


Note : , – “doc” OMNeT++ INET. Simulation Manual User Guide, Stack Overflow ( stackoverflow.com, ). , , , , “” .


Note : , OMNeT++ INET, , INET GitHub. 3.4.0 ( , INET ).


INET, , . , ?


INET “Project Explorer”, “inet/src/inet/applications”, “ udpapp ” (UDP Application). UDP broadcast . , , , , “ UDPEchoApp ”. “UDPBasicApp”, “Basic”. “.cc”, “.h” “.ned” . , “.ned” , ( “parameters: ” ) .


. , ( inet/examples ) INET. , “broadcast” ( inet/examples/inet/broadcast )! “.cc”, “.h” “.ned”, “.ini” “.xml” . , :



, (“broadcast”) , .. . , , .


Note : Simulation Manual . , , ( RAM) . JS ‑ bookmark let . , Simulation Manual, ( ), ( target Simulation Manual). Bookmarklet . , , Simulation Manual , bookmarklet .


bookmarklet , ?

bookmarklet . . 5- . bookmarklet , .
⇒ bookmarklet – ; bookmarklet , ( 5- ) – .



#


“LLTR”, “src” “simulations”, “gcc-release” (File → New → OMNeT++ Project
):


New OMNeT++ project Wizard


“inet”, . , “gcc-debug” (.. “LLTR”), “inet”. : {A,B,G} “Project References”, “inet”.


#


, Wizard, , “package.ned” : “src”, “simulations”. – “ package lltr; ” “ package lltr.simulations; ” . .


INET, “inet/src” – “LLTR/src”, “inet/examples” – “LLTR/simulations”. “LLTR/simulations” “.ned” c Network , “LLTR/src” – ().


– INET , INET, , INET. , – INET.


, “.ned” “LLTR/src” ( “inet/src”), “ package lltr.simulations; ” “LLTR/simulations”. “package.ned” “LLTR/src” “LLTR/simulations”.


#


LLTR. “LLTR/simulations/omnetpp.ini”, ( Run > Run As > 1 OMNeT++ Simulation):


Run simulation from toolbar


Eclipse “simulations” . , : “LLTR/src/LLTR.exe” . , “LLTR.exe” , ( Project → Build Project), ( ).


“No network specified in the configuration.”, , “ network = lltr. Network ” “ [General] ” “omnetpp .ini ”, “ network Network {} ” “package .ned ”. ( “.ned” ), ( “.ini” ) ( Network – ) .


( Run > Run As > 1 OMNeT++ Simulation), () Network .


Note : ( Run > Run As > 1 OMNeT++ Simulation), ( Run > 1 simulations): , .. , , Eclipse .


Note : ( – a1_v0.1.0 (“a” – article) “ git checkout -b â€čmy_branchâ€ș tags/a1_v0.1.0 ”)


#


, :


  • tutorial git;
  • tutorial – ;
  • () , (article) – ( : “article_#”), / ;
  • , “” tutorial.


Note : “article_#” , , , ( ), /.


“ ”? , GitHub , :



, , “ git checkout -b â€č my_branch â€ș tags/â€čtag_nameâ€ș ”.


, .. ? Pull Request, >:-), , , , ):


Git: Ablauf des Verlaufskontrollsystems


, , Pull Request .


Note : , : , ( “ ” () , ). “ -u ” , . , “a1_v0.1. 0 ”, “a1_v0.2. 0 ”, 
 – “a1_v0.1. 1 ”, “a1_v0.2. 1 ”, 
 , : “a1_v0.1. 2 ”, “a1_v0.2. 2 ”, 



Note : tutorial , “”, git Git Tag Diff Symbol , git tag.


Note : git diff , , ( , / ) ( AST ), Java .


# (Link Layer Topology Reveal)



# −1:


“package.ned” ( “Design” ), :


Netzwerkeditor


, broadcast :


  • – StandardHost;
  • – EtherSwitch.


“” ( ) Eth100M (: 100 Mbps; : 10 ). , 10 , , ? ( )


( “Source” ), (git tag a1_v0.2.0) diff . :


 package â€č<a href="https://omnetpp.org/doc/omnetpp/manual/#sec:ned-ref:packages"> </a>â€ș; //<a href="https://omnetpp.org/doc/omnetpp/manual/#sec:ned-ref:directory-structure"> </a> import â€č<a href="https://omnetpp.org/doc/omnetpp/manual/#sec:ned-lang:imports-and-name-resolution">  </a>â€ș; network â€č<a href="https://omnetpp.org/doc/omnetpp/manual/#sec:ned-lang:warmup:network">  </a>â€ș {   @display(â€č  , ,  â€ș);   <a href="https://omnetpp.org/doc/omnetpp/manual/#sec:ned-ref:submodules">submodules</a>:       â€č<a href="https://omnetpp.org/doc/omnetpp/manual/#sec:ned-lang:submodules"> </a>â€ș: â€č â€ș { @display(â€č  , , â€ș); }   <a href="https://omnetpp.org/doc/omnetpp/manual/#sec:ned-ref:connections">connections</a>:       â€č â€ș.â€č<a href="https://omnetpp.org/doc/omnetpp/manual/#sec:ned-lang:gates"> </a>â€ș <--> â€č  â€ș <--> â€č â€ș.â€č â€ș; } 


Warning : <a>...</a> – “” . , , , ( <strong>...</strong> , <em>...</em> ).



package â€č â€ș; //

import â€č â€ș;

network â€č â€ș
{
@display(â€č , , â€ș);
submodules :
â€č â€ș: â€č â€ș { @display(â€č , , â€ș); }
connections :
â€č â€ș.â€č â€ș <--> â€č â€ș <--> â€č â€ș.â€č â€ș;
}


“ ” (Gates) :


  1. Gates , , gate “ â€č â€ș.â€čgateâ€ș[â€čâ€ș] ”, – “ â€č â€ș.â€čgateâ€ș ++ ”.
  2. (: “ 
 <--> { delay = 100ms; } <--> 
 ”), / , ( broadcast : “ 
 <--> C <--> 
 ”), (: “ 
 <--> FastEthernet {per = 1e-6;} <--> 
 ”), 

  3. Gates ( : output / input ; : --> / <-- ), ( : inout ; : <--> ). , , “ $i ” “ $o ” .



Warning : 1 ⁄ 3 20 ( 504 “Gateway Time-out”). 1 ⁄ 3 . ( ):


     <a href="#set">: “<code>set: p=1.87548</code>”</a>      . 


:


     <a href="#set"><code>: “set: p=1.87548</code>”</a>      . 


, 3‑ . :


   , <a href="https://omnetpp.org/doc/omnetpp/manual/#sec:ned-ref:inout-gates">  “<strong><code>$i</code></strong>”  “<strong><code>$o</code></strong>”</a>. 


, . , , GitHub Pages:


Lesen Sie mehr →


Note : target Simulation Manual – bookmarklet ', . « →» , .


Note : , CSS JS – , 3 , GitHub Pages 2‑ ( HTML, , , , ‑). 3‑ – .


# / To be continued



  • 2.
  • 3. OMNeT++
  • 4.
  • 5. OMNeT++ 2
  • 6.
  • 7. (‑: “ ”)

DOI: 10.5281 / zenodo.1407029

#


. . – . – .

Source: https://habr.com/ru/post/de420327/


All Articles