LLTR Part 1: Premiers pas dans OMNeT ++ et INET

OMNeT ++ (Objective M odular N estwork T estbed in C ++ ) Discrete Event Simulator est une bibliothĂšque C ++ modulaire et orientĂ©e composants et un cadre pour la modĂ©lisation d' Ă©vĂ©nements discrets , utilisĂ©e principalement pour crĂ©er des simulateurs de rĂ©seau . Autrement dit, il s'agit d'un «simulateur d'Ă©vĂ©nements discrets», comprenant: un IDE pour crĂ©er des modĂšles et le simulateur lui-mĂȘme (GUI).


Le cadre INET est une «bibliothÚque» de modÚles de réseau pour OMNeT ++ .


KDPV: LLTR Part 1 - OMNeT ++ 5 Open Simulator :: ModĂšle LLTR :: pour une utilisation libre


GIF complet (15,7 Mio)


Dans les parties précédentes ...


0. Détection automatique de la topologie du réseau et commutateurs non gérés. Mission impossible? (+ classique Habrahabr UserCSS )


Dans cette partie:


  • crĂ©er «votre premier» protocole (en utilisant LLTR Basic comme exemple);
  • choisir le simulateur de ville appropriĂ© pour dĂ©boguer le protocole (et crĂ©er son modĂšle);
  • nous apprenons les subtilitĂ©s de la mise en place de l'environnement pour le simulateur et son IDE (configuration, compilation, liaison, rĂ©glage, correctif, ignorant la documentation obsolĂšte et autres anglaisismes en grand nombre);
  • nous rencontrerons tout ce que vous pouvez rencontrer lors de la crĂ©ation de votre premier modĂšle de votre premier protocole dans un simulateur de rĂ©seau inconnu;
  • allons tout le chemin ensemble:
    • du bonheur apportĂ© par la compilation (enfin!) rĂ©ussie du premier projet avec un rĂ©seau vide,
    • jusqu'Ă  complĂštement immergĂ© dans des expĂ©riences avec un modĂšle de protocole fonctionnel;
  • tutoriel , tout est dĂ©crit comme un tutoriel - nous apprendrons des erreurs - nous les ferons, et nous les comprendrons (la nature) afin de les traiter avec Ă©lĂ©gance / efficacitĂ©;
  • rĂ©fĂ©rentiel (git ), dans les validations et balises dont toutes les Ă©tapes ( "Ajouter ..." , "Corriger ..." , "Corriger ..." , "Modifier ..." , "Corriger ..." , ...) sont enregistrĂ©es, du dĂ©but Ă  la fin.


Remarque : informations supplémentaires pour les lecteurs du hub «Mesh-network».


{volume d'images: 2,2+ (2,1) Mio; Texte: 484 Ko; Émoticînes: 22 pcs. }


Remarque : [Ă  propos de la structure de partition utilisĂ©e] la structure des sections tutoriel / how-to est gĂ©nĂ©ralement diffĂ©rente de la structure de section dans le rĂ©pertoire: dans le rĂ©pertoire - la structure de section vous permet d'accĂ©der aux informations dont vous avez besoin en un minimum d'Ă©tapes (arbre Ă©quilibrĂ©); dans le tutoriel / comment, oĂč les sections sont fortement connectĂ©es logiquement, et une section distincte, en fait, est l'une des Ă©tapes de la sĂ©quence d'Ă©tapes, la structure est une hiĂ©rarchie de signets (ancres), qui vous permet de rappeler (voir ) sur le fragment dĂ©crit prĂ©cĂ©demment.


off - topic: Ă  propos de la balise html5 <section> et des balises d'en-tĂȘte <h #>

Il est bon que la <section> apparue en HTML5, avec son aide, il est devenu possible de dĂ©finir directement le niveau d'imbrication de la section (en manipulant l'imbrication des balises <section> unes dans les autres). La structure du texte pouvait dĂ©sormais ĂȘtre explicitement reflĂ©tĂ©e dans l'imbrication (hiĂ©rarchie) des balises.


Cela a Ă©galement affectĂ© les balises d'en-tĂȘte <h#> , comme Étant donnĂ© que l'imbrication des sections est dĂ©terminĂ©e par l'imbrication de la <section> , pour indiquer le nom de la section, il suffisait d'utiliser une seule <h1> sous la forme: " <section><h1> </h1> </section> ".


J'utilise cela depuis longtemps (depuis l'apparition de <section> ), mais lors de la création de cet article, j'ai vu un autre avantage d'utiliser <section> .


Un bon titre de section doit reflĂ©ter fidĂšlement son essence, cependant, il y a des moments oĂč vous devez conserver (ne pas divulguer) l'essence jusqu'au milieu de la section. C'est-Ă -dire qu'une telle section devrait d'abord devenir une «routine» et au milieu crĂ©er un «effet wow / wtf». Logiquement, il s'agit d'une seule section, mais si vous rĂ©vĂ©lez son nom au tout dĂ©but de la section, le nom lui-mĂȘme sera un spoiler . Imaginez un livre (roman policier), sur la couverture duquel figureront toutes les informations sur le «tueur».


C'est lĂ  que la <section> "entre en scĂšne". Il vous permet de dĂ©terminer le nom de la section n'importe oĂč Ă  l'intĂ©rieur de vous, c'est-Ă -dire pas nĂ©cessairement au tout dĂ©but. Exemple: " <section> <h1> </h1> </section> ". Il s'avĂšre que nous pouvons simultanĂ©ment enregistrer la structure logique du texte et afficher le nom de la section au bon moment. Vous pouvez mĂȘme faire apparaĂźtre visuellement le titre de la section au dĂ©but, une fois que le lecteur a atteint un certain point (la <h1> en html).


En un peu plus de 9 ans d'existence de <section> , les navigateurs n'ont pas appris à créer correctement un «contour de document HTML5» pour garantir l'accessibilité .


Pourquoi n’as-tu pas appris? Dans un document de structure complexe, il est difficile * de dĂ©terminer Ă  partir de quelle balise (section, article, ...) la numĂ©rotation des rubriques (h1, h2, h3, ...) doit commencer. Imaginez maintenant que le document lui-mĂȘme soit placĂ© sur une page comme celle-ci (avec de nombreux blocs supplĂ©mentaires qui ne sont pas liĂ©s au document lui-mĂȘme, mais qui ont des en-tĂȘtes), et h1 est utilisĂ© partout pour les en-tĂȘtes. Et si sur une seule page pas un document, mais plusieurs? Cependant, visuellement, tout semble bon ( exemple de document ).


* - en fait ce n'est pas difficile, tout est décrit dans la norme , mais en réalité ça ne marche pas (explication voir ci-dessous).


Pourquoi tout est-il beau visuellement? Ici, grĂące aux styles , des informations supplĂ©mentaires sont apparues - la correspondance entre la hiĂ©rarchie des sections et les niveaux d'en-tĂȘte (h #). Alors peut-ĂȘtre que lors de la construction du «plan du document HTML5», vous devriez utiliser des informations de CSS? Pour ce faire, vous devez ajouter une propriĂ©tĂ© supplĂ©mentaire au CSS pour l'Ă©lĂ©ment title indiquant son niveau, par exemple:


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


Ou une option plus rigoureuse - un seul en-tĂȘte est autorisĂ© dans une section. Dans ce cas, le niveau d'en-tĂȘte est dĂ©fini par la section elle-mĂȘme:


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


, et peu importe la balise d'en-tĂȘte qui sera utilisĂ©e Ă  la fin: h1 ou h5.


Cependant, si auparavant pour crĂ©er un « contour au niveau de l'en-tĂȘte », il suffisait de n'avoir que du balisage (HTML), maintenant nous avons Ă©galement besoin de styles (CSS). Peut-ĂȘtre que vous pouvez vous limiter au balisage (HTML)? Avec cette question, nous nous sommes rapprochĂ©s du problĂšme de l'algorithme de construction «contour au niveau de l'en-tĂȘte» dĂ©crit dans la norme. Ainsi, le problĂšme n'est pas dans l'algorithme lui-mĂȘme, mais dans le fait que seul un ensemble limitĂ© (fixe) de balises peut agir comme un Ă©lĂ©ment " racine de sectionnement ". Mais les gens ont souvent des «dĂ©sirs non standard»: «Je veux que la balise d'article soit l'Ă©lĂ©ment« racine de sectionnement »» sur ma page de liste d'articles, «et je veux que la section arbitraire devienne l'Ă©lĂ©ment« racine de sectionnement »». Auparavant, il leur suffisait d'utiliser plusieurs balises h1 sur une seule page (et ils l'ont fait). Vous pouvez donc vous assurer que n'importe quelle section (balises: section, article, ...) devient un Ă©lĂ©ment "racine de sectionnement" si le titre qu'il contient est dĂ©fini Ă  l'aide de la balise h1? ..



# PremiÚres étapes: «avant la modélisation» / «brainstorming»


Dépliant

Un OVNI est entré et a laissé cet espace ici ? Le verso du dépliant de l'article précédent .


# Détail du protocole


Au début, nous définissons ce que nous devons inclure dans le protocole. Sur l'exemple de LLTR Basic.


La base de LLTR est l'itération de la collecte de statistiques sur plusieurs hÎtes lors de l'analyse du réseau. Il existe de nombreuses itérations dans LLTR (> 1) , donc la premiÚre chose à inclure dans le protocole est de contrÎler le début et la fin de chaque itération. Si l'on prend en compte qu'il y a beaucoup d'hÎtes (> 1) , alors le contrÎle consistera à renseigner tous les hÎtes d'une certaine maniÚre l'heure de début de l'itération et l'heure de fin de l'itération. Autrement dit, synchronisez tous les hÎtes.


Chaque itĂ©ration a son propre hĂŽte src unicast et son hĂŽte dst unicast, donc la prochaine chose Ă  activer est la façon d' affecter src et dst unicast pour chaque itĂ©ration. C'est-Ă -dire qu'Ă  chaque itĂ©ration, l'un des hĂŽtes doit «ĂȘtre conscient» de lui-mĂȘme en tant qu'hĂŽte src unicast, dont le but est d'envoyer du trafic Ă  l'hĂŽte dst unicast.


Et le dernier. Une fois toutes les itĂ©rations terminĂ©es , toutes les statistiques collectĂ©es de tous les hĂŽtes doivent ĂȘtre envoyĂ©es Ă  un hĂŽte pour traitement. Cet hĂŽte analysera les statistiques collectĂ©es et construira la topologie du rĂ©seau.


De plus, à cette étape, vous pourriez penser à certains détails d'implémentation (limitations) du protocole. Par exemple, nous voulons qu'un programme utilisant LLTR puisse fonctionner sans droits root et depuis l'espace utilisateur (c'est-à-dire sans installer de pilote spécial dans le systÚme), ce qui signifie que LLTR devrait fonctionner, par exemple, sur TCP et UDP.


Tous les autres ont fait la mise en Ɠuvre, ils dĂ©cideront d'eux-mĂȘmes dans le processus de crĂ©ation du modĂšle. C'est-Ă -dire, bien sĂ»r, vous pouvez immĂ©diatement tout penser dans les moindres dĂ©tails, mais en mĂȘme temps, vous risquez de "glisser dans un optimum local" et de ne pas remarquer une "meilleure" option de mise en Ɠuvre. C'est bien quand il y aura plusieurs modĂšles - s'il y a un modĂšle pour chaque option d'implĂ©mentation, alors il sera possible de combiner des modĂšles, et Ă©tape par Ă©tape d'arriver Ă  une meilleure implĂ©mentation. Se souvenir de l'algorithme gĂ©nĂ©tique . Par exemple, dans une mise en Ɠuvre / modĂšle, il peut y avoir une gestion centralisĂ©e, dans une autre - dĂ©centralisĂ©e, dans la troisiĂšme - une combinaison des meilleures parties des deux options prĂ©cĂ©dentes.


# Choisir un simulateur de réseau


Il est maintenant temps de décider d'un simulateur de réseau dans lequel nous allons créer des modÚles et mettre en place des expériences.


Fondamentalement, à partir d'un simulateur de réseau, nous avons besoin de pouvoir implémenter «notre» protocole. Tous les simulateurs ne facilitent pas la tùche.


Mais la présence d'émulateurs OS de véritables équipements réseaux de «marques mondiales», au contraire, n'est pas nécessaire. TrÚs probablement, les émulateurs créeront de nombreuses limitations qui n'interféreront qu'avec les expériences.


Avec le choix du simulateur, l'article Evaluating Network Simulation Tools (mes exigences pour le simulateur coïncident à bien des égards) et OMNeT ++ General 'Network' Simulation m'ont aidé.


# Installez OMNeT ++ et INET


Téléchargez OMNeT ++ 5.0 .


Et comme OMNeT ++ n'est qu'un «simulateur d'Ă©vĂ©nements discrets», vous aurez Ă©galement besoin d' INET , une bibliothĂšque de modĂšles de rĂ©seaux (protocoles et pĂ©riphĂ©riques). TĂ©lĂ©chargez INET 3.4.0 . En fait, il pourrait ĂȘtre installĂ© Ă  partir de l'IDE , mais je recommande de l' installer manuellement (plus tard, il sera clair pourquoi).


L'installation sur * nix et sur Windows n'est pas trÚs différente. Je vais continuer sur l'exemple de Windows.


Décompressez OMNeT ++ dans% ProgramData% (C: \ ProgramData \) et ouvrez le fichier INSTALL.txt (C: \ ProgramData \ omnetpp-5.0 \ INSTALL.txt). Il dit que les instructions détaillées sont dans "doc / InstallGuide.pdf", il est en outre écrit que si vous ne voulez pas le lire, alors faites simplement:

$. setenv
$ ./configure
$ make

Mais ne vous précipitez pas pour le faire!


Tout d'abord, faites attention Ă  la premiĂšre commande . setenv " . setenv . " Il n'y a pas de fichier « setenv » dans le rĂ©pertoire «omnetpp-5.0» (il Ă©tait dans la version 5.0b1). Ce n'est pas nĂ©cessaire (pour Windows), alors lancez simplement «mingwenv.bat» (je vous conseille de voir ce qu'il fait avant de commencer ... pour Ă©viter rm ). À la fin, le terminal se cassera (menthe).


DeuxiÚmement, je vous conseille de corriger un peu le fichier "configure.user" (si le paramÚtre mentionné est commenté dans le fichier, alors vous devez le décommenter):


  • Si vous souhaitez utiliser Clang (par dĂ©faut), laissez
    PREFER_CLANG=yes
    et configurer:
    • CFLAGS_RELEASE (options du compilateur):
      CFLAGS_RELEASE='-O2 -march=native -DNDEBUG=1'
  • Si vous souhaitez utiliser GCC au lieu de Clang (et vous voulez trĂšs probablement utiliser GCC aprĂšs avoir vu ce qui est Ă©crit Ă  la ligne 398 du fichier "configure.in"), alors installez
    PREFER_CLANG=no
    et configurer:
    • CFLAGS_RELEASE (options du compilateur). Peut choisir ou
      CFLAGS_RELEASE='-O2 -mfpmath=sse,387 -ffast-math -fpredictive-commoning -ftree-vectorize -march=native -freorder-blocks-and-partition -pipe -DNDEBUG=1'
      ou
      CFLAGS_RELEASE='-O2 -fpredictive-commoning -march=native -freorder-blocks-and-partition -pipe -DNDEBUG=1'
      ou
      CFLAGS_RELEASE='-O2 -march=native -freorder-blocks-and-partition -pipe -DNDEBUG=1'
      (situé dans l'ordre décroissant d'occurrence des pépins).
    • Il vaut Ă©galement la peine d'ajouter CXXFLAGS en tant que ' -std=c++11 ' + CFLAGS_RELEASE. Par exemple:
      CXXFLAGS='-std=c++11 -O2 -fpredictive-commoning -march=native -freorder-blocks-and-partition -pipe -DNDEBUG=1'
    • JAVA_CFLAGS (dĂ©commentez juste):
      JAVA_CFLAGS=-fno-strict-aliasing
  • PREFER_QTENV=yes
  • DĂ©sactivez la visualisation 3D:
    WITH_OSG=no
    Elle est certainement belle , mais nous n'en aurons pas besoin.
  • Malheureusement, l'exĂ©cution de la simulation parallĂšle (sur un ensemble de processeurs) (WITH_PARSIM) doit Ă©galement ĂȘtre dĂ©sactivĂ©e, mais sans que l'Ă©diteur de liens Ă©choue, nous allons donc le laisser activĂ©:
    WITH_PARSIM=yes

Pourquoi devriez-vous l'éteindre?

S'il n'est pas explicitement utilisé, il n'est pas nécessaire (en théorie). Plus de détails dans les sections 16.1, 16.3 et 16.3.2 «Exemple de simulation parallÚle» dans «doc / InstallGuide.pdf», ou ici .



Maintenant dans le terminal (mintty) vous pouvez faire:


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


Remarque : « 17 » doit ĂȘtre remplacĂ© par le nombre de CPU + 1 cƓurs, ou par 1,5 × cƓurs.


Attention aux curieux (build 64bit)

Le rĂ©pertoire «tools / win32» contient MSYS2, ses packages de compilation peuvent ĂȘtre mis Ă  jour:



Et OMNeT ++ peut ĂȘtre construit sous 64 bits .


Mais OMNeT ++ peut tout simplement ne pas ĂȘtre compilĂ© avec une version plus rĂ©cente de GCC (c'Ă©tait le cas avec la premiĂšre version bĂȘta de la cinquiĂšme version d' OMNeT ++ - sans Ă©diter le code source, il n'Ă©tait normalement construit qu'avec GCC 4.x). Et la transition vers 64 bits exigera encore plus d'efforts. Vous devez d'abord revoir les options de compilation ( fPIC , pas nĂ©cessaire? ). Ensuite, si vous faites dĂ©filer le code source OMNeT ++ , vous verrez que le type long y est souvent utilisĂ© au lieu de int32_t, size_t et ptrdiff_t (ainsi que uintptr_t et intptr_t) . Qu'est-ce que cela menace? Dans * nix dans l'assemblage 64 bits (LP64), la taille longue sera de 64 bits et dans Windows (LLP64), elle sera de 32 bits (voir modĂšles de donnĂ©es ). Nous devrons remplacer long par size_t et ptrdiff_t, mais ici vous trouverez des piĂšges. Par exemple, vous pouvez ouvrir "src / utils / opp_lcg32_seedtool.cc" et regarder la ligne 231 - index ou vous pouvez laisser 32 bits (remplacer par int32_t), ou faire 64 bits et modifier tous les masques de bits + descriptions + (Ă©ventuellement) un peu de logique. Par consĂ©quent, une partie des variables longues devra ĂȘtre laissĂ©e Ă  32 bits et l'autre partie Ă  64 bits. En gĂ©nĂ©ral, pour le bon fonctionnement, vous devez effectuer tous les points Ă  partir de:



Et la mĂȘme chose doit ĂȘtre faite avec de nombreuses bibliothĂšques pour OMNeT ++ , par exemple, avec INET.


En général, je vous déconseille d'essayer de créer un assemblage OMNeT ++ 64 bits.


Sous * nix, je recommande également d'utiliser une version 32 bits (au moins avec la version 5.0 et moins).


Peut-ĂȘtre qu'un jour Andrey2008 entreprendra de vĂ©rifier le code OMNeT ++ et INET ... En attendant, je suggĂšre simplement de trouver et de visualiser tous les " FIXME " / " Fix " dans le code .


PS mentionne que le code OMNeT ++ a été vérifié par un analyseur de code statique manquant, mais dans les fichiers INET 3.4.0 «ChangeLog», vous pouvez trouver 70 mentions sur la correction des défauts aprÚs numérisation dans Coverity.



OMNeT ++ utilise Eclipse comme IDE. Pour plus de commoditĂ©, vous pouvez crĂ©er un raccourci sur l'EDI «% ProgramData% \ omnetpp-5.0 \ ide \ omnetpp.exe» et le placer dans un endroit facilement accessible. Le rĂ©pertoire «ide / jre /» contient JRE v1.8.0_66-b18. Si un JRE / JDK compatible est dĂ©jĂ  installĂ© dans le systĂšme, le rĂ©pertoire ide / jre / peut ĂȘtre supprimĂ© en toute sĂ©curitĂ© en le remplaçant par un lien symbolique vers l'emplacement du JRE du systĂšme.


Au premier démarrage, Eclipse suggÚre de placer l'espace de travail dans le répertoire «samples», mais il est préférable de le placer dans tout autre répertoire qui vous convient en dehors de «% ProgramData%». L'essentiel est que seules les lettres latines (+ caractÚres) soient utilisées dans le chemin d'accÚs au nouveau répertoire et qu'il n'y ait pas d'espaces.


AprÚs avoir fermé Welcome, l'IDE vous proposera d'installer INET (comme décrit ci-dessus) et d'importer les exemples - jetez les deux points.


ParamÚtres Eclipse, options JVM, plugins et thÚmes supplémentaires

Options JVM . Ajoutez «ide / omnetpp.ini» au fichier (tout Ă©diteur qui comprend les sauts de ligne LF peut ĂȘtre Ă©ditĂ©; le bloc-notes ne fonctionnera pas), en enregistrant la derniĂšre ligne vide:


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

Réglage Eclipse (un [7z] moi)


Pour rendre Eclipse semblable à celle de l'image, regardez à l'intérieur de l'image.



Il est temps d'installer INET. Le rĂ©pertoire «inet» de l'archive prĂ©cĂ©demment tĂ©lĂ©chargĂ©e (inet-3.4.0-src.tgz) doit ĂȘtre transfĂ©rĂ© dans l'espace de travail. Il y a un fichier «INSTALL» dans le rĂ©pertoire avec une description Ă©tape par Ă©tape de l'installation. Vous pouvez l'utiliser (section «Si vous utilisez l'IDE»), mais ne construisez pas de projet (Build)!


Importer INET:


  1. Dans Eclipse, ouvrez: Fichier> Importer.
  2. Sélectionnez: Projets généraux / existants dans l'espace de travail.
  3. En tant que «répertoire racine», sélectionnez l'emplacement de l'espace de travail.
  4. Assurez-vous que l'option «Copier les projets dans l'espace de travail» est désactivée.
  5. AprÚs avoir cliqué sur le bouton «Terminer», attendez que l'indexation du projet soit terminée (% d'achÚvement, voir ci-dessous, dans la barre d'état - « Indexeur C / C ++ »).


Mettre en place le projet:


  • A. dĂ©sactiver les composants inutiles pour LLTR;
  • B. basculez l'assemblage pour le libĂ©rer;
  • C. se dĂ©barrasser des pĂ©pins OMNeT ++ Make Builder (opp_makemake) - plus tĂŽt, lorsqu'il Ă©tait sĂ©lectionnĂ©, le Makefile Ă©tait souvent rĂ©gĂ©nĂ©rĂ©, mĂȘme lorsqu'il n'Ă©tait pas requis;
  • D. activer la compilation parallĂšle ;
  • E. activer les optimisations;
  • F. activer la coloration syntaxique pour c ++ 11 , Ă  plusieurs endroits;
  • G. corrige le bug liĂ© Ă  " #include " (cela se produit si vous changez plusieurs fois "GĂ©nĂ©rateur actuel"; cela peut arriver dans d'autres cas).


Avant de configurer {A}, vous devez corriger l'un des fichiers de projet. Dans le fichier «inet / .oppfeatures», il y a une ligne « inet.examples.visualization » que vous devez ajouter une ligne vide aprĂšs pour Ă©crire « inet.tutorials.visualization », en gardant de prĂ©fĂ©rence le retrait Ă  gauche (par analogie avec d'autres paramĂštres « nedPackages » dans le fichier ) Si cela n'est pas fait, alors rien de mauvais ne se produira, juste aprĂšs avoir rĂ©glĂ© dans «ProblĂšmes» (Alt + Maj + Q, X), il y aura toujours des erreurs associĂ©es Ă  « inet.tutorials.visualization ». Vous pouvez d'abord faire {A} , et regarder les erreurs, puis corriger le fichier "inet / .oppfeatures" - en mĂȘme temps, Eclipse vous avertira de la violation de l'intĂ©gritĂ© dans les paramĂštres et vous proposera de les corriger (nous sommes d'accord avec cela).


Commençons (panneau «Project Explorer»> projet «inet»> menu contextuel> Propriétés ):


  1. Section OMNeT ++> Sous-section des fonctionnalités du projet
    1. {A} supprimez tout sauf:
      • TCP commun
      • TCP (INET)
      • Protocole IPv4
      • Protocole UDP
      • Ethernet
    2. Bouton «Appliquer».
  2. Section «Build C / C ++»:
    1. Bouton "Gérer les configurations ..."> activer "gcc-release" {B} ;
    2. sélectionnez la configuration «gcc-release [Active]» {B} .
    3. Sous-section «Éditeur de chaĂźne d'outils»:
      1. comme "Générateur actuel", sélectionnez "GNU Make Builder" pour les deux configurations: "gcc-debug" et "gcc-release" {C} , remarque : si vous changez "Générateur actuel" à l'avenir, vous devrez tout reconfigurer!
      2. Bouton «Appliquer».
    4. Onglet "Comportement" (retour Ă  la racine de la section "Build C / C ++"):
      1. dĂ©finissez «Utiliser les travaux parallĂšles» sur N (soit N est le nombre de cƓurs CPU + 1 , soit 1,5 × cƓurs) - cela permettra Ă  tous les cƓurs CPU d' ĂȘtre utilisĂ©s pour compiler {D} (configurer pour «gcc-debug» et «gcc- libĂ©ration ”).
    5. Onglet ParamĂštres de construction:
      1. désactiver «Utiliser la commande de construction par défaut»;
      2. remplacez la ligne «Build command» par « make MODE=release CONFIGNAME=${ConfigName} -j17 » (remplacez « 17 » par la valeur prĂ©cĂ©dente de la ligne, c'est-Ă -dire par le N sĂ©lectionnĂ©) {E} , vous pouvez faire de mĂȘme pour la configuration "gcc-debug", en remplaçant " MODE=release " par " MODE=debug " dans la ligne, n'oubliez pas de revenir Ă  "gcc-release [Active]".
    6. Bouton «Appliquer».
  3. Section «Général C / C ++»:
    1. Sous-section "Chemins et symboles":
      1. Onglet «Comprend»:
        1. Bouton Ajouter: ajoutez le rĂ©pertoire « ../src » avec les «Ajouter Ă  toutes les configurations» et «Ajouter Ă  toutes les langues» sĂ©lectionnĂ©s {G} - initialement « ../src » est dans la langue «GNU C ++ », mais Ă  un moment incertain , il peut ĂȘtre supprimĂ© de la liste;
        2. ../src bouton «Appliquer» et vérifiez que « ../src » apparaßt dans toutes les langues et configurations.
      2. Onglet Symboles:
        1. Bouton Ajouter: ajoutez le symbole « __cplusplus » avec la valeur « 201103L » et les «Ajouter à toutes les configurations» et «Ajouter à toutes les langues» sélectionnés - {F} plus ;
        2. Bouton «Appliquer» et vérifiez que dans la configuration «gcc-debug», « __cplusplus » a la valeur « 201103L ».
      3. Onglet Emplacement source:
        1. VĂ©rifiez qu'il y a un Ă©lĂ©ment dans la liste et qu'il pointe vers « /inet/src » {G} , s'il y a autre chose (par exemple, juste « /inet »), puis supprimez ce qui est et ajoutez («Ajouter un dossier ... ")" /inet/src ". Cliquez ensuite sur le bouton "Appliquer" et revenez Ă  {A} , car tous les filtres ont Ă©tĂ© supprimĂ©s lors de la suppression. Soit dit en passant, " /inet " peut en fait ĂȘtre laissĂ© - tout va bien avec lui aussi, mais il vaut mieux le rĂ©duire Ă  l'original " /inet/src ".
    2. Sous-section «Le préprocesseur inclut les chemins, Marcos, etc.» > Onglet «Fournisseurs»:
      1. Sélectionnez «ParamÚtres du compilateur intégré CDT GCC»:
        1. Dans le groupe «Options du fournisseur de paramÚtres de langue», cliquez sur le lien «ParamÚtres de l'espace de travail»:
          1. Onglet «Découverte»: sélectionnez à nouveau «ParamÚtres du compilateur -std=c++11 CDT GCC» et ajoutez « -std=c++11 » avant « ${FLAGS} » dans «Commande pour obtenir les spécifications du compilateur», il devrait ressembler à « ${COMMAND} -std=c++11 ${FLAGS} -E -P -v -dD "${INPUTS}" ` {F} , plus de détails ici et ici ;
          2. bouton "Appliquer", "Ok" (fermer la fenĂȘtre).
        2. dĂ©placez «ParamĂštres du compilateur intĂ©grĂ© CDT GCC» au-dessus de «EntrĂ©es du systĂšme de gĂ©nĂ©ration gĂ©rĂ©e CDT» (pour les deux configurations: «gcc-release» et «gcc-debug») {F} , plus de dĂ©tails - aprĂšs cela, nous perdrons la possibilitĂ© de redĂ©finir les caractĂšres «CDT ParamĂštres du compilateur intĂ©grĂ© GCC "Ă " EntrĂ©es du systĂšme de construction gĂ©rĂ© CDT "( " GĂ©nĂ©ral C / C ++ "> " Chemins et symboles "> " Symboles "), vous ne pouvez le remplacer qu'en ajoutant des valeurs aux" EntrĂ©es des paramĂštres utilisateur CDT " “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} . Je vais vous expliquer. , 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
):


Nouvel assistant de projet OMNeT ++


“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):


Exécuter la simulation à partir de la barre d'outils


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: Flux du systĂšme de contrĂŽle de l'historique


, , 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 icîne diff git tag , git tag.


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


# (Link Layer Topology Reveal)



# −1:


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


Editeur de réseau


, 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:


En savoir plus →


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/fr420327/


All Articles