blob: ded393066e95b9ef8399abb813fbc5c45168fcf6 [file] [log] [blame]
<!DOCTYPE html><html lang="en-us" >
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="generator" content="Source Themes Academic 4.8.0">
<meta name="author" content="Fraunhofer FOKUS">
<meta name="description" content="The OMNeT&#43;&#43; Federate design is based on a microsimulation where every participating vehicle respectively node is individually modeled and simulated and all entities are clued together in a scenario with one instance the manages the interaction between them.">
<link rel="alternate" hreflang="en-us" href="https://www.eclipse.org/mosaic/docs/extending_mosaic/omnetpp_details/">
<meta name="theme-color" content="#68145C">
<script src="/mosaic/js/mathjax-config.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/academicons/1.8.6/css/academicons.min.css" integrity="sha512-MCWBwPSput2UWNwyznVFLbD2iUc1e5VsdD1zahsWVzkDSUzyHhMZ4kCS3wgYSRm0mU+glwD/Q9lSJrDPwbUL2A==" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.12.0-1/css/all.min.css" integrity="sha512-ZYg+hQvLlM0W9C3P6vTpes5LmJ66G2EsroxDNzwD6qiulckldb29eD9I672HL2X+LH5nRhY1sQqZLJGB+aUUPg==" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/fancybox/3.5.7/jquery.fancybox.min.css" integrity="sha512-H9jrZiiopUdsLpg94A333EfumgUBpO9MdbxStdeITo+KEIMaNfHNvwyjjDJb+ERPaRS6DpyRlKbvPUasNItRyw==" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.18.1/styles/atom-one-light.min.css" crossorigin="anonymous" title="hl-light">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.18.1/styles/atom-one-light.min.css" crossorigin="anonymous" title="hl-dark" disabled>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.5.1/leaflet.css" integrity="sha512-xwE/Az9zrjBIphAcBb3F6JVqxf46+CDLwfLMHloNu6KEQCAWi6HcDUbeOfBIptF7tcCzusKFjFw2yuvEpDL9wQ==" crossorigin="anonymous">
<script src="https://cdnjs.cloudflare.com/ajax/libs/lazysizes/5.2.2/lazysizes.min.js" integrity="sha512-TmDwFLhg3UA4ZG0Eb4MIyT1O1Mb+Oww5kFG0uHqXsdbyZz9DcvYQhKpGgNkamAI6h2lGGZq2X8ftOJvF/XjTUg==" crossorigin="anonymous" async></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/3.1.0/es5/tex-chtml.min.js" integrity="sha512-uwL1UtpYdWra2iqJlAW8Ts0s9Os6IxWLDJDF/BnWdhDmT7DEMFba3GPsFwmV3QiTNcUyl2GB5vsgycB/MOvo9g==" crossorigin="anonymous" async></script>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Lato:400,400i,700,700i%7CRoboto+Mono&display=swap">
<link rel="stylesheet" href="/mosaic/css/academic.css">
<link rel="manifest" href="/mosaic/index.webmanifest">
<link rel="icon" type="image/png" href="/mosaic/images/icon_hu6bdfb97c7e23190c70e41ca0e15a9fce_30436_32x32_fill_lanczos_center_2.png">
<link rel="apple-touch-icon" type="image/png" href="/mosaic/images/icon_hu6bdfb97c7e23190c70e41ca0e15a9fce_30436_192x192_fill_lanczos_center_2.png">
<link rel="canonical" href="https://www.eclipse.org/mosaic/docs/extending_mosaic/omnetpp_details/">
<meta property="twitter:card" content="summary">
<meta property="og:site_name" content="Eclipse MOSAIC – A Multi-Domain and Multi-Scale Simulation Framework for Connected and Automated Mobility">
<meta property="og:url" content="https://www.eclipse.org/mosaic/docs/extending_mosaic/omnetpp_details/">
<meta property="og:title" content="OMNeT&#43;&#43; Federate Implementation | Eclipse MOSAIC – A Multi-Domain and Multi-Scale Simulation Framework for Connected and Automated Mobility">
<meta property="og:description" content="The OMNeT&#43;&#43; Federate design is based on a microsimulation where every participating vehicle respectively node is individually modeled and simulated and all entities are clued together in a scenario with one instance the manages the interaction between them."><meta property="og:image" content="https://www.eclipse.org/mosaic/images/logo.svg">
<meta property="twitter:image" content="https://www.eclipse.org/mosaic/images/logo.svg"><meta property="og:locale" content="en-us">
<meta property="article:published_time" content="2019-05-05T00:00:00&#43;01:00">
<meta property="article:modified_time" content="2019-05-05T00:00:00&#43;01:00">
<title>OMNeT&#43;&#43; Federate Implementation | Eclipse MOSAIC – A Multi-Domain and Multi-Scale Simulation Framework for Connected and Automated Mobility</title>
</head>
<body id="top" data-spy="scroll" data-offset="70" data-target="#TableOfContents" class=" page-mosaic page-docs page-extending_mosaic page-omnetpp_details ">
<aside class="search-results" id="search">
<div class="container">
<section class="search-header">
<div class="row no-gutters justify-content-between mb-3">
<div class="col-10 col-md-3">
<div class="logo" style="background-image: url(/mosaic/img/logos/mosaic/EclipseMOSAIC-Logo-RGB-positiv.svg)"></div>
</div>
<div class="col-2 col-md-4 col-search-close">
<a class="js-search" href="#"><i class="fas fa-times-circle text-muted" aria-hidden="true"></i></a>
</div>
</div>
<div id="search-box">
<input name="q" id="search-query" placeholder="Search..." autocapitalize="off"
autocomplete="off" autocorrect="off" spellcheck="false" type="search">
</div>
</section>
<section class="section-search-results">
<div id="search-hits">
</div>
</section>
</div>
</aside>
<nav class="navbar navbar-expand-lg navbar-light compensate-for-scrollbar" id="navbar-main">
<div class="container">
<div class="d-none d-lg-inline-flex">
<a style="visibility:visible;" class="navbar-brand" href="/mosaic/"><img src="/mosaic/images/logo.svg" alt="Eclipse MOSAIC – A Multi-Domain and Multi-Scale Simulation Framework for Connected and Automated Mobility"></a>
</div>
<button type="button" class="navbar-toggler" data-bs-toggle="collapse" data-bs-target="#navbar-content-mobile" aria-controls="navbar" aria-expanded="false" aria-label="Toggle navigation">
<span><i class="fas fa-bars"></i></span>
</button>
<div class="navbar-brand-mobile-wrapper d-inline-flex d-lg-none">
<a class="navbar-brand" href="/mosaic/"><img src="/mosaic/images/logo.svg" alt="Eclipse MOSAIC – A Multi-Domain and Multi-Scale Simulation Framework for Connected and Automated Mobility"></a>
</div>
<div id="navbar-content" class="navbar-collapse main-menu-item collapse justify-content-start">
<ul class="navbar-nav d-md-inline-flex">
<li class="nav-item">
<a class="nav-link " href="/mosaic/about/"><span>About</span></a>
</li>
<li class="nav-item">
<a class="nav-link " href="/mosaic/news/"><span>News</span></a>
</li>
<li class="nav-item">
<a class="nav-link active" href="/mosaic/docs/"><span>Documentation</span></a>
</li>
<li class="nav-item">
<a class="nav-link " href="/mosaic/tutorials/"><span>Tutorials</span></a>
</li>
<li class="nav-item">
<a class="nav-link " href="/mosaic/download/"><span>Download</span></a>
</li>
<li class="nav-item">
<a class="nav-link " href="/mosaic/community/"><span>Community</span></a>
</li>
</ul>
</div>
<ul class="nav-icons navbar-nav flex-row ml-auto d-flex pl-md-2">
<li class="nav-item">
<a class="nav-link js-search" href="#" aria-label="Search"><i class="fas fa-search" aria-hidden="true"></i></a>
</li>
<li class="nav-item ">
<a href="https://github.com/eclipse/mosaic" target="blank">
<i class="fab fa-github" aria-hidden="true"></i>
</a>
</li>
</ul>
<div id="navbar-content-mobile" class="navbar-collapse main-menu-item collapse justify-content-start d-lg-none">
<ul class="navbar-nav d-inline-flex">
<li class="nav-item">
<a class="nav-link " href="/mosaic/about/"><span>About</span></a>
</li>
<li class="nav-item">
<a class="nav-link " href="/mosaic/news/"><span>News</span></a>
</li>
<li class="nav-item">
<a class="nav-link active" href="/mosaic/docs/"><span>Documentation</span></a>
</li>
<li class="nav-item">
<a class="nav-link " href="/mosaic/tutorials/"><span>Tutorials</span></a>
</li>
<li class="nav-item">
<a class="nav-link " href="/mosaic/download/"><span>Download</span></a>
</li>
<li class="nav-item">
<a class="nav-link " href="/mosaic/community/"><span>Community</span></a>
</li>
</ul>
</div>
</div>
</nav>
<div class="docs container">
<div class="row flex-xl-nowrap">
<div class="docs-sidebar col-12 col-md-3 col-xl-3">
<div class="docs-version">
<a class="" data-bs-toggle="tooltip" data-bs-placement="bottom" title="The documentation corresponds to the latest version of Eclipse MOSAIC 21.1-SNAPSHOT." href="https://github.com/eclipse/mosaic">
<i class="fab fa-github"></i>&nbsp;Eclipse MOSAIC 21.1-SNAPSHOT
</a>
</div>
<form class="docs-search d-flex align-items-center">
<button class="btn docs-toggle d-md-none p-0 mr-3" type="button" data-bs-toggle="collapse" data-bs-target="#docs-nav" aria-controls="docs-nav" aria-expanded="false" aria-label="Toggle section navigation">
<span><i class="fas fa-bars"></i></span>
</button>
<input name="q" type="search" class="form-control" placeholder="Search..." autocomplete="off">
</form>
<nav class="collapse docs-links" id="docs-nav">
<div class="docs-toc-item">
<a class="docs-toc-link" href="/mosaic/docs/getting_started/">Getting Started</a>
<ul class="nav docs-sidenav">
<li >
<a href="/mosaic/docs/getting_started/">Download</a>
</li>
<li >
<a href="/mosaic/docs/getting_started/run_mosaic/">Run Eclipse MOSAIC</a>
</li>
<li >
<a href="/mosaic/docs/getting_started/results/">Simulation Results</a>
</li>
</ul>
</div>
<div class="docs-toc-item">
<a class="docs-toc-link" href="/mosaic/docs/visualization/">Visualization</a>
<ul class="nav docs-sidenav">
<li >
<a href="/mosaic/docs/visualization/">WebSocket Visualizer</a>
</li>
<li >
<a href="/mosaic/docs/visualization/filevis/">File Output</a>
</li>
<li >
<a href="/mosaic/docs/visualization/statistics/">Statistics Output</a>
</li>
<li >
<a href="/mosaic/docs/visualization/itef/">ITEF</a>
</li>
<li >
<a href="/mosaic/docs/visualization/phabmap/">PHABMap</a>
</li>
</ul>
</div>
<div class="docs-toc-item">
<a class="docs-toc-link" href="/mosaic/docs/simulators/">Simulators</a>
<ul class="nav docs-sidenav">
<li >
<a href="/mosaic/docs/simulators/">Overview</a>
</li>
<li >
<a href="/mosaic/docs/simulators/application_simulator/">Application - Simulator</a>
</li>
<li >
<a href="/mosaic/docs/simulators/application_mapping/">Application - Mapping</a>
</li>
<li >
<a href="/mosaic/docs/simulators/traffic_simulator_sumo/">Traffic - Eclipse SUMO</a>
</li>
<li >
<a href="/mosaic/docs/simulators/network_simulator_omnetpp/">Network - OMNeT&#43;&#43;</a>
</li>
<li >
<a href="/mosaic/docs/simulators/network_simulator_ns3/">Network - ns-3</a>
</li>
<li >
<a href="/mosaic/docs/simulators/network_simulator_sns/">Network - SNS</a>
</li>
<li >
<a href="/mosaic/docs/simulators/network_simulator_cell/">Network - Cell</a>
</li>
<li >
<a href="/mosaic/docs/simulators/environment_simulator/">Environment Simulator</a>
</li>
<li >
<a href="/mosaic/docs/simulators/battery_simulator/">Battery Simulator</a>
</li>
<li >
<a href="/mosaic/docs/simulators/vms_simulator/">VMS Simulator</a>
</li>
</ul>
</div>
<div class="docs-toc-item">
<a class="docs-toc-link" href="/mosaic/docs/building_scenarios/">Building Scenarios</a>
<ul class="nav docs-sidenav">
<li >
<a href="/mosaic/docs/building_scenarios/">Simulation Scenarios</a>
</li>
<li >
<a href="/mosaic/docs/building_scenarios/scenario_convert/">Scenario Convert</a>
</li>
<li >
<a href="/mosaic/docs/building_scenarios/scenario_configuration/">Additional Scenario Configuration</a>
</li>
</ul>
</div>
<div class="docs-toc-item">
<a class="docs-toc-link" href="/mosaic/docs/develop_applications/">Create Applications</a>
<ul class="nav docs-sidenav">
<li >
<a href="/mosaic/docs/develop_applications/">Basics</a>
</li>
<li >
<a href="/mosaic/docs/develop_applications/communication/">V2X Communication</a>
</li>
<li >
<a href="/mosaic/docs/develop_applications/event_scheduler/">Event Scheduling</a>
</li>
<li >
<a href="/mosaic/docs/develop_applications/road_traffic/">Scenario Database</a>
</li>
</ul>
</div>
<div class="docs-toc-item">
<a class="docs-toc-link" href="/mosaic/docs/mosaic_configuration/">MOSAIC Configuration</a>
<ul class="nav docs-sidenav">
<li >
<a href="/mosaic/docs/mosaic_configuration/">Configuration Files</a>
</li>
<li >
<a href="/mosaic/docs/mosaic_configuration/scenario_config/">Scenario Configuration</a>
</li>
<li >
<a href="/mosaic/docs/mosaic_configuration/mapping_ambassador_config/">Mapping Configuration</a>
</li>
<li >
<a href="/mosaic/docs/mosaic_configuration/environment_config/">Environment Configuration</a>
</li>
<li >
<a href="/mosaic/docs/mosaic_configuration/sns_config/">SNS Configuration</a>
</li>
<li >
<a href="/mosaic/docs/mosaic_configuration/cell_config/">Cell Basic Configuration</a>
</li>
<li >
<a href="/mosaic/docs/mosaic_configuration/cell_network_config/">Cell Network Configuration</a>
</li>
<li >
<a href="/mosaic/docs/mosaic_configuration/cell_region_config/">Cell Region Configuration</a>
</li>
<li >
<a href="/mosaic/docs/mosaic_configuration/sumo_config/">SUMO Configuration</a>
</li>
</ul>
</div>
<div class="docs-toc-item">
<a class="docs-toc-link" href="/mosaic/docs/extending_mosaic/">Extending Eclipse MOSAIC</a>
<ul class="nav docs-sidenav">
<li >
<a href="/mosaic/docs/extending_mosaic/">Core Concepts</a>
</li>
<li >
<a href="/mosaic/docs/extending_mosaic/simulator_coupling/">Simulator Coupling</a>
</li>
<li >
<a href="/mosaic/docs/extending_mosaic/interactions/">Interactions</a>
</li>
<li >
<a href="/mosaic/docs/extending_mosaic/application_ambassador_details/">Application Ambassador</a>
</li>
<li >
<a href="/mosaic/docs/extending_mosaic/sumo_ambassador_details/">Sumo Ambassador</a>
</li>
<li class="active">
<a href="/mosaic/docs/extending_mosaic/omnetpp_details/">OMNeT&#43;&#43; Federate</a>
</li>
<li >
<a href="/mosaic/docs/extending_mosaic/delay_models/">Delay Models</a>
</li>
</ul>
</div>
<div class="docs-toc-item">
<a class="docs-toc-link" href="/mosaic/docs/api_docs/">API Documentation</a>
<ul class="nav docs-sidenav">
<li >
<a href="/mosaic/docs/api_docs/">Javadoc</a>
</li>
</ul>
</div>
<div class="nav-bottom">
<img src="/mosaic/img/logos/mosaic/EclipseMOSAIC-Medallion-RGB-single-navy.svg">
</div>
</nav>
</div>
<div class="docs-toc d-none d-xl-block col-xl-2">
<ul class="nav toc-top">
<li><a href="#" id="back_to_top" class="docs-toc-title">Contents</a></li>
</ul>
<nav id="TableOfContents">
<ul>
<li>
<ul>
<li><a href="#node-internals">Node Internals</a></li>
<li><a href="#simulation-setup">Simulation Setup</a></li>
<li><a href="#simulator-coupling">Simulator Coupling</a></li>
</ul>
</li>
</ul>
</nav>
</div>
<style>
@media (min-width:1140px) {
.docs-sidebar {
flex: 0 1 320px;
}
.docs-toc {
flex: 0 1 280px;
}
main.docs-content.no-docs-toc {
padding-bottom: 0 !important;
max-width: calc(100% - 320px) !important;
flex: 0 1 calc(100% - 320px);
width: 100%;
}
main.docs-content {
padding-bottom: 0 !important;
max-width: calc(100% - 600px) !important;
flex: 0 1 calc(100% - 600px);
width: 100%;
}
}
@media (max-width: 770px) {
main.docs-content {
max-width: 100% !important;
width: 100%;
}
}
@media (min-width: 771px) and(max-width: 1139px) {
main.docs-content.no-docs-toc {
padding-bottom: 0 !important;
max-width: calc(100% - 320px) !important;
width: 100%;
}
}
</style>
<main class="docs-content col-12 col-md-9 col-xl-auto py-md-3 pl-md-4" role="main">
<article class="article">
<div class="docs-article-container">
<h1>OMNeT&#43;&#43; Federate Implementation</h1>
<div class="article-style">
<p>The OMNeT++ Federate design is based on a microsimulation where every participating vehicle respectively
node is individually modeled and simulated and all entities are clued together in a scenario with
one instance the manages the interaction between them. That means at first the internals of one node
are introduced which incorporate mainly the communication stack and a mobility model. Afterwards,
especially the scenario management is presented which builds up on the individual nodes and controls
the major part of the simulation. These both aspects are in similar way needed for most mobile communication
simulation with OMNeT++ even in an isolated setup. However, specifically for interaction and
synchronization with the other simulators in the Eclipse MOSAIC environment, a third pillar is necessary. This
scheduler module is very important for the system as it implements the time management and event
scheduling according to Eclipse MOSAIC specific concepts.</p>
<h3 id="node-internals">Node Internals</h3>
<p>The main part of the node model consists of the communication stack. The submodules for communication
are adopted from the INET framework. All
modules are linked together to a compound module using the <code>NED</code> language. The following figure depicts the node architecture.
The concept currently supports two different
kinds of nodes for Vehicles and RSUs, while V2X-based traffic lights are treated as RSUs. For the first
approach these two kinds of nodes have the equal construction in terms of modules. The difference at the
moment is that they can be configured with different values for parameters in the <code>omnetpp.ini</code> e.g. that Vehicles and RSUs
have a different antenna height which is important for Two Ray Ground ReflectionModel.</p>
<figure id="figure-architecture-of-one-node">
<a data-fancybox="" href="../images/implementation_vehicle.png" data-caption="Architecture of one Node">
<img src="../images/implementation_vehicle.png" alt="" width="600px" >
</a>
<figcaption data-pre="Figure " data-post=":" class="numbered">
Architecture of one Node
</figcaption>
</figure>
<h5 id="communication-stack">Communication Stack</h5>
<p>The right part of the block diagram in the figure above depicts the communication stack. It is based on the
module <code>Ieee80211</code>, which is a compound module itself and covers the complete IEEE 802.11 network interface
card with the <code>MAC</code> and <code>PHY</code> Layer and the <code>Radio Channel</code>. The configuration of different values for
standard parameters e.g. the PHY bit rate or size of the contention window of the MAC can be exchanged
within the <code>omnetpp.ini</code>-file.</p>
<p>(<em>Please
note that the configuration allows different values for each kind of nodes and hence it is possible to
configure another propagation model or carrier frequency for Vehicles compared to RSUs. Even if
the possibility for such a configuration exists, it should be avoided and common parameters should
consistently be configured twice with the same value.</em>)</p>
<p>The next module in the communication stack is the <code>NetworkLayer</code>. Once again it is a compound module
and already a collection of most important IPv4 protocols as well as the Interface- and RoutingTables.
The NetworkLayer is also the home of the Routing Protocol, which could be e.g. GPSR. Yet, at the current
status, the implementation focusses on single hop communication, meaning the NetworkLayer mainly
forwards messages for 255.255.255.255-broadcast adresses from the TransportLayer to the MAC Layer.</p>
<p>The <code>TransportLayer</code> of the communication stack is made up of UDP.</p>
<p>The module <code>MosaicProxyApp</code> of Application Layer is the entry point for application messages for the communication stack.
It is triggered by the Eclipse MOSAIC ScenarioManager
to send new messages to lower layers and forwards received messages back to the ScenarioManager
upon reception. The main tasks are generally acting as an application within the scope of OMNeT++ and
encapsulating the message contents to packets to prepare them for sending.</p>
<h5 id="mobility-model">Mobility Model</h5>
<p>The second important component of the node is the mobility module <code>MosaicMobility</code>, which extends
the BasicMobility. Unlike other mobility models as RandomWaypoint it does not generate node movements
itself and has a straight static character. Node position updates are always triggered by the Eclipse MOSAIC
ScenarioManager. Hence,mobility is completely controlled by Eclipse MOSAIC and in turn by the coupled traffic
simulator.</p>
<h3 id="simulation-setup">Simulation Setup</h3>
<p>The setup of the complete simulation is illustrated in the following Figure. From the view of OMNeT++,
the simulation is a network (<code>Scenario.ned</code>), which has a dynamic topology and is referenced as the simulated network
in the omnetpp.ini-file for configuration. The ini-file gives access to all parameters which are offered
to be configured by the included simple modules. The parameters are referred to by their hierarchical
names with the simulated network as root module. As it is possible to assign already default values for
parameters in the modules NED file, not every parameter needs to be configured in the ini-file. The
simulation consists of basically three parts.</p>
<figure id="figure-architecture-of-the-whole-simulation-scenario">
<a data-fancybox="" href="../images/implementation_simulation.png" data-caption="Architecture of the whole Simulation Scenario">
<img src="../images/implementation_simulation.png" alt="" width="600px" >
</a>
<figcaption data-pre="Figure " data-post=":" class="numbered">
Architecture of the whole Simulation Scenario
</figcaption>
</figure>
<h5 id="simulated-nodes">Simulated Nodes</h5>
<p>Obviously the major part of the simulation is dedicated to the nodes. They are compound modules either
from type <code>Vehicle</code> or <code>RSU</code> and have the properties as described in the previous section. The number
of nodes in the simulation can vary over simulation time and is dynamically managed by the Eclipse MOSAIC
ScenarioManager.</p>
<h5 id="ieee80211scalarradiomedium">Ieee80211ScalarRadioMedium</h5>
<p>The <code>Ieee80211ScalarRadioMedium</code> basically models the broadcast communication channel between the Radio Channel
sub module (in Ieee80211 Nic) for each node and thus enables the actual V2X message transmission between the nodes.</p>
<h5 id="mosaicscenariomanager">MosaicScenarioManager</h5>
<p>The <code>MosaicScenarioManager</code> is used as the central
management instance to enhance simple configurations to simulate more sophisticated scenarios. The
general tasks of the MosaicScenarioManager contain the simulation start up with initialization of the
<code>MosaicEventScheduler</code> (detailed later) and controlled simulation shut down, and most important during simulation
the management of node mobility and V2X communication, which are triggered by Eclipse MOSAIC.</p>
<p>The <strong>Mobility Management</strong> is responsible for administration of simulated nodes and their mobility.
This includes introducing nodes to simulation, updating node positions and removing nodes from
simulation.</p>
<p>The node introduction method is triggered by Eclipse MOSAIC with the commands <code>ADD_NODES</code> or <code>ADD_RSU_NODES</code> respectively. It adds the node according to its node id to the managed modules and creates the complete compound module. Important for later message handling is the setup of connections to the dedicated Eclipse MOSAIC App, which is done via so called gates. At the moment, the Eclipse MOSAIC Apps are statically initialized, but the concept is suitable to be extended later when other transport protocols and in turn
applications have to be simulated.</p>
<p>Upon <code>MOVE_NODE</code> command, which contains the affected node id and new position to be updated, the
node is moved via the <code>MosaicMobility</code> module.</p>
<p>At last the <code>REMOVE_NODE</code> command indicates that a node leaves the simulation. On this event, the according node is deleted and unregistered from managed modules.</p>
<p>The <strong>CommunicationManagement</strong> controls the configuration of the Radio during runtime as well as the sending and receiving of V2X messages.</p>
<p>The <code>SEND_V2X_MESSAGE</code> command initiates the sending process. It contains the sender node id and
the transport protocol. Thus the MosaicScenarioManager can select the according Eclipse MOSAIC app at the according node.</p>
<p>When a message from another node successfully arrives at the ProxyApplication, the MosaicScenarioManager
is notified by the according node. Then, it sets up a <code>RECV_V2X_MESSAGE</code> which is sent back
to Eclipse MOSAIC via the MosaicEventScheduler. This intermediate step is introduced, since the MosaicEventScheduler is the only instance, which is connected to Eclipse MOSAIC and which knows when it is safe to
receive and send interactions.</p>
<h3 id="simulator-coupling">Simulator Coupling</h3>
<p>OMNeT++ is connected to Eclipse MOSAIC according to the concept of high-level-architecture (HLA). That
means that the OMNeT++ simulation program itself is encapsulated in the OMNeT++ federate. To
enable the coupling according to Eclipse MOSAIC concept, two components needed to be developed. First, the
OMNeT++ federate is extended with the customized Eclipse MOSAIC EventScheduler, which can receive and
send interactions forMobility and CommunicationManagement. The second component is the OMNeT++
Ambassador that can handle on the one hand the OMNeT++ specific connection and on the other
hand the well-defined interface to Eclipse MOSAIC. The emphasis of both components lies in the synchronized
exchange of interactions i.e. a time management mechanism must be jointly realized by them. For this
purpose the conservative synchronization mechanism is implemented. The following figure gives an overview
of the included compenents.</p>
<figure id="figure-overview-of-simulator-coupling">
<a data-fancybox="" href="../images/implementation_simcoupling.png" data-caption="Overview of Simulator Coupling">
<img src="../images/implementation_simcoupling.png" alt="" width="450px" >
</a>
<figcaption data-pre="Figure " data-post=":" class="numbered">
Overview of Simulator Coupling
</figcaption>
</figure>
<h5 id="eclipse-mosaic-eventscheduler">Eclipse MOSAIC EventScheduler</h5>
<p>The <code>MosaicEventScheduler</code> extends the standard scheduler of OMNeT++ to be able to implement the time management for
synchronization with Eclipse MOSAIC. It is the only module in OMNeT++ which has access to the event queue or Future Event Set (FES). Since the OMNeT++ simulation
is an event driven simulation the scheduler has to fulfill two tasks. The first task is the actual scheduling
part which is always invoked by the simulation kernel to schedule the next event. It allows all events from
the FES to be processed up to the granted logical time $T$. If there are only events with a later time $T'$ than
$T$ left in the FES, it sends the Next Event Request (NER) to the OMNeT++ Ambassador at Eclipse MOSAIC side and
blocks the OMNeT++ simulation. Then the second task comes into operation. If necessary, it coordinates
the Receive Interaction procedure and merges the external events from Eclipse MOSAIC and hence from other
federates to the internal FES. Events with the same time stamp are ordered to the FES according to first
come first serve mechanism. Note that the handling of these simultaneous events is generally important
to ensure repeatable execution of simulations. The decision about ordering is in control of the federate
itself, since the RTI does not sufficiently have the information to do this. After the Receive Interaction
step, the RTI completes the time management cycle with the Time Advance Grant for $T'$. At this point the
scheduler can set its logical time to $T = T'$ and unblock the further processing.</p>
<p>Additionally the <code>MosaicEventScheduler</code> provides the service for other modules to send interactions back
to the OMNeT++ Ambassador, since it is also the one module which is connected to Eclipse MOSAIC. Currently,
this is used by the Eclipse MOSAIC ScenarioManager to report the <code>RECEIVE_V2X_MESSAGES</code>.</p>
<h4 id="eclipse-mosaic-omnet-federate-development">Eclipse MOSAIC OMNeT++ Federate Development</h4>
<p>This section provides a description how to set up the <strong>OMNeT++ IDE</strong> for the Eclipse MOSAIC OMNeT++ Federate Development.</p>
<p>At this point it is awaited, that the
<a href="/mosaic/docs/simulators/network_simulator_omnetpp/">
OMNeT++ Federate
</a>
is successfully installed.</p>
<h5 id="prepare-omnet-ide">Prepare OMNeT++ IDE</h5>
<ol>
<li>
<p>Create an empty directory somewhere inside your home directory. We will call it <code>&lt;omnetpp_workspace&gt;</code> from here on. This directory will be used as a workspace in your OMNeT++ IDE.</p>
</li>
<li>
<p>Open your OMNeT++ IDE by executing <code>omnetpp</code> in your terminal.</p>
</li>
<li>
<p>Select <code>&lt;omnetpp_workspace&gt;</code> as workspace and continue by clicking <code>Launch</code>.</p>
</li>
<li>
<p>Close the &ldquo;Welcome&rdquo; screen.</p>
</li>
<li>
<p>Since your workspace is empty, the OMNeT++ IDE will ask you if you want to install the INET framework and OMNeT++ programming examples.<br>
<figure id="figure-omnet-ide-install-inet">
<a data-fancybox="" href="../images/omnetpp-ide-install-inet.png" data-caption="OMNeT&#43;&#43; IDE: Install INET">
<img src="../images/omnetpp-ide-install-inet.png" alt="" >
</a>
<figcaption data-pre="Figure " data-post=":" class="numbered">
OMNeT++ IDE: Install INET
</figcaption>
</figure>
Decide by yourself if you want to do that:</p>
<ul>
<li>By clicking <code>OK</code> the INET framework is going to be installed into an <code>inet</code> folder in your <code>&lt;omnetpp_workspace&gt;</code></li>
<li>If you already have INET installed somewhere you can skip the installation and import your existing INET project:
<ol>
<li><code>Cancel</code> the dialog.</li>
<li>Choose <code>File</code> &gt; <code>Open Projects from File System...</code></li>
<li>In the new window choose the directory of your existing INET installation as <code>Import Source</code> and click <code>Finish</code></li>
</ol>
</li>
</ul>
</li>
<li>
<p>The project <code>inet</code> should now be visible in the <code>Project Explorer</code> of your OMNeT++ IDE.</p>
</li>
<li>
<p>Right-click on free space in the <code>Project Explorer</code> and choose <code>New</code> &gt; <code>OMNeT++ Project...</code></p>
<figure id="figure-omnet-ide-create-new-omnet-project">
<a data-fancybox="" href="../images/omnetpp-ide-new-project.png" data-caption="OMNeT&#43;&#43; IDE: Create new OMNeT&#43;&#43; Project">
<img src="../images/omnetpp-ide-new-project.png" alt="" >
</a>
<figcaption data-pre="Figure " data-post=":" class="numbered">
OMNeT++ IDE: Create new OMNeT++ Project
</figcaption>
</figure>
</li>
<li>
<p>In the new window:</p>
<ol>
<li>Name the new project <code>federate</code></li>
<li><strong>Uncheck</strong> the box before <code>Use default location</code>, click <code>Browse</code> and select:<br>
<code>&lt;mosaic&gt;/bin/fed/omnetpp/omnetpp_federate_src/src</code><br>
<figure id="figure-omnet-ide-create-new-omnet-project">
<a data-fancybox="" href="../images/omnetpp-ide-new-project-2.png" data-caption="OMNeT&#43;&#43; IDE: Create new OMNeT&#43;&#43; Project">
<img src="../images/omnetpp-ide-new-project-2.png" alt="" >
</a>
<figcaption data-pre="Figure " data-post=":" class="numbered">
OMNeT++ IDE: Create new OMNeT++ Project
</figcaption>
</figure>
</li>
<li>Click <code>Next</code></li>
</ol>
</li>
<li>
<p>On the following <code>Initial Contents</code> page select <code>Empty Project</code> and continue by clicking <code>Finish</code><br>
You should now find two projects in the <code>Project Explorer</code> of your OMNeT++ IDE: <code>inet</code> and <code>federate</code></p>
</li>
<li>
<p>Right-click on the <code>federate</code> project and choose <code>Properties</code></p>
<ol>
<li>Go to <code>Project references</code> and <strong>check</strong> the box before <code>inet</code><br>
<figure id="figure-choose-project-references">
<a data-fancybox="" href="../images/omnetpp-ide-project-references.png" data-caption="Choose project references">
<img src="../images/omnetpp-ide-project-references.png" alt="" >
</a>
<figcaption data-pre="Figure " data-post=":" class="numbered">
Choose project references
</figcaption>
</figure>
</li>
</ol>
</li>
</ol>
<p>That&rsquo;s it! None of the files should now be marked with an error symbol.</p>
<hr>
<h5 id="configure-rebuild-configuration">Configure Rebuild Configuration</h5>
<p>Since the Eclipse MOSAIC OMNeT++ Federate is not a classic OMNeT++ project, it cannot be build regulary with
the OMNeT++ IDE by just clicking on the <code>Build</code> button. However, to make the build process easy and intuitive
we provide a simple build script and the following desciption how to configure the OMNeT++ IDE to enable
building on a single click:</p>
<ol>
<li>In the OMNeT++ IDE select <code>Run</code> &gt; <code>External Tools</code> &gt; <code>External Tools Configuration...</code></li>
<li>Double-click in the left column on <code>Program</code> to create a new configuration.</li>
<li>Call it <code>rebuild federate</code></li>
<li>In the <code>Main</code> tab:
<ol>
<li>Under <code>Location</code> choose <code>Browse Workspace...</code> and select <code>federate/rebuild_federate.sh</code></li>
<li>Still in the <code>Main</code> tab under <code>Working Directory</code> choose <code>Browse Workspace...</code> and select <code>federate</code>
<figure id="figure-omnet-ide-build-configuration">
<a data-fancybox="" href="../images/omnetpp-ide-build-config.png" data-caption="OMNeT&#43;&#43; IDE Build Configuration">
<img src="../images/omnetpp-ide-build-config.png" alt="" >
</a>
<figcaption data-pre="Figure " data-post=":" class="numbered">
OMNeT++ IDE Build Configuration
</figcaption>
</figure>
</li>
</ol>
</li>
<li>In the <code>Build</code> tab <strong>uncheck</strong> the box before <code>Build before launch</code><br>
<figure id="figure-omnet-ide-build-configuration">
<a data-fancybox="" href="../images/omnetpp-ide-build-config-2.png" data-caption="OMNeT&#43;&#43; IDE Build Configuration">
<img src="../images/omnetpp-ide-build-config-2.png" alt="" >
</a>
<figcaption data-pre="Figure " data-post=":" class="numbered">
OMNeT++ IDE Build Configuration
</figcaption>
</figure>
</li>
<li>Now you can <code>Apply</code> your changes and click on <code>Run</code>.</li>
<li>Since you have built the project at least once, you can rebuild it again by clicking here:<br>
<figure id="figure-run-rebuild">
<a data-fancybox="" href="../images/omnetpp-ide-run-rebuild.png" data-caption="Run rebuild">
<img src="../images/omnetpp-ide-run-rebuild.png" alt="" >
</a>
<figcaption data-pre="Figure " data-post=":" class="numbered">
Run rebuild
</figcaption>
</figure>
</li>
</ol>
<p><strong>The following video shows the above described steps:</strong></p>
<video controls >
<source src="../images/omnetpp-ide-rebuild-federate.mp4" type="video/mp4">
</video>
<hr>
<h5 id="configure-debug-configuration">Configure Debug Configuration</h5>
<p>To debug the Eclipse MOSAIC OMNeT++ Federate during simulation you need to create a Debug Configuration. The following
instruction will tell you how to that:</p>
<ol>
<li>In your OMNeT++ IDE choose <code>Run</code> &gt; <code>Debug Configurations...</code></li>
<li>In the new window double-click on <code>OMNeT++ Simulation</code> in the left column and name the new created debug configuration <code>federate</code>.</li>
<li>In the <code>Executable</code> row check <code>other</code> and type <code>/federate/federate</code></li>
<li>In the <code>Working dir</code> row type <code>/federate</code></li>
<li>In the <code>Ini file(s)</code> row type <code>debug.ini omnetpp.ini</code></li>
<li>At the end of the page click on the <code>More &gt;&gt;</code> link. And make sure all fields in the <code>Advanced</code> area are <strong>empty</strong>.</li>
<li>For <code>Projects to build</code> select <code>Do not build automatically before launch</code></li>
<li>Now <code>Apply</code> your changes and try your configuration by clicking <code>Debug</code></li>
</ol>
<p><strong>The following images shows the final debug configuration:</strong></p>
<figure id="figure-final-debug-configuration">
<a data-fancybox="" href="../images/omnetpp-ide-debug-config.png" data-caption="Final debug configuration">
<img src="../images/omnetpp-ide-debug-config.png" alt="" >
</a>
<figcaption data-pre="Figure " data-post=":" class="numbered">
Final debug configuration
</figcaption>
</figure>
<hr>
<h1 id="the-omnet-ambassador">The OMNeT++ Ambassador</h1>
<p>The OMNeT++ Ambassador is the intermediate component between OMNeT++ and Eclipse MOSAIC. As it
implements the interface of an abstract federate ambassador in Eclipse MOSAIC. In the initialization phase the
Ambassador applies for the TimeManagement policies time constrained and time regulated at the RTI.
Remind that time constrained means that the time advances of the OMNeT++ Federate are dependent on
the other simulators in the federation and time regulating means that the OMNeT++ Federate itself can
prevent other federates from advancing their time.</p>
<p>The OMNeT++ simulation starts initially with an empty event queue and hence it needs to receive an
interaction to fill the event queue with the first events to be processed. That means that the typical time
management cycle in the Ambassador starts at step two with the Receive Interaction procedure. Note
that messages within Eclipse MOSAIC usually effect more than one interaction e.g. a VehicleUpdates interaction
contains information for added nodes and moved nodes. These are exchanged with OMNeT++ using a
simple byte protocol. After this procedure the third step of time management cycle is processed with
the initial Time Advance Grant. This is the point when the OMNeT++ simulation is able to start and the
initialization phase is finished. Hence the time management cycle can be executed from first step which
is waiting for a new NER until no federate requests further events and the simulation is finished.</p>
</div>
<div class="article-widget">
<div class="post-nav prev-next-pages col-12">
<div class="row">
<div class="post-nav-item col-6">
<div class="meta-nav">Previous</div>
<a href="/mosaic/docs/extending_mosaic/sumo_ambassador_details/" rel="next">Sumo Ambassador Implementation</a>
</div>
<div class="post-nav-item col-6 align-self-end">
<div class="meta-nav">Next</div>
<a href="/mosaic/docs/extending_mosaic/delay_models/" rel="prev">Delay Models</a>
</div>
</div>
</div>
</div>
</div>
<footer class="site-footer">
<div class="row">
<div class="col-sm-4 mb-3 mb-md-0">
<b>Eclipse MOSAIC</b>
<ul>
<li>
<a href="/mosaic/download/" title="Download Eclipse MOSAIC" >
Download Eclipse MOSAIC
</a>
</li>
<li>
<a href="/mosaic/docs/" title="Documentation" >
Documentation
</a>
</li>
<li>
<a href="/mosaic/tutorials/" title="Tutorials" >
Tutorials
</a>
</li>
<li>
<a href="/mosaic/community/#projects" title="Projects" >
Projects
</a>
</li>
<li>
<a href="/mosaic/publications/" title="Publications" >
Publications
</a>
</li>
</ul>
</div>
<div class="col-sm-4 mb-3 mb-md-0">
<b>Community</b>
<ul>
<li>
<a href="/mosaic/community/" title="Eclipse MOSAIC Community" >
Eclipse MOSAIC Community
</a>
</li>
<li>
<a href="/mosaic/contribution/" title="How to contribute" >
How to contribute
</a>
</li>
<li>
<a href="https://github.com/eclipse/mosaic" title="Github" target="_blank" rel="noopener">
Github
</a>
</li>
<li>
<a href="/mosaic/get_in_contact/" title="Contact &amp; Mailing list" >
Contact & Mailing list
</a>
</li>
</ul>
</div>
<div class="col-sm-4 mb-3 mb-md-0">
<b>Eclipse Foundation</b>
<ul>
<li>
<a href="https://www.eclipse.org/" title="About Eclipse Foundation" target="_blank" rel="noopener">
About Eclipse Foundation
</a>
</li>
<li>
<a href="https://www.eclipse.org/legal/privacy.php" title="Privacy Policy" target="_blank" rel="noopener">
Privacy Policy
</a>
</li>
<li>
<a href="https://www.eclipse.org/legal/termsofuse.php" title="Website terms of use" target="_blank" rel="noopener">
Website terms of use
</a>
</li>
<li>
<a href="https://www.eclipse.org/legal/copyright.php" title="Copyright" target="_blank" rel="noopener">
Copyright
</a>
</li>
<li>
<a href="https://www.eclipse.org/legal" title="Legal" target="_blank" rel="noopener">
Legal
</a>
</li>
</ul>
</div>
</div>
<div class="row justify-content-center mt-3 position-relative">
<p class="powered-by text-center font-italic mb-0 pb-0">
Powered by the
<a href="https://sourcethemes.com/academic/" target="_blank" rel="noopener">Academic theme</a> for
<a href="https://gohugo.io" target="_blank" rel="noopener">Hugo</a>.
<br>
Header image &#169; fanjianhua/ iStock
</p>
</div>
</footer>
</article>
</main>
</div>
</div>
<script src="https://code.jquery.com/jquery-3.4.1.min.js" integrity="sha384-vk5WoKIaW/vJyUAd9n/wmopsmNhiy+L2Z+SBxGYnUkunIxVxAv/UtMOhba/xskxh" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/2.6.0/umd/popper.min.js" integrity="sha512-BmM0/BQlqh02wuK5Gz9yrbe7VyIVwOzD1o40yi1IsTjriX/NGF37NyXHfmFzIlMmoSIBXgqDiG1VNU6kB5dBbA==" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery.imagesloaded/4.1.4/imagesloaded.pkgd.min.js" integrity="sha512-S5PZ9GxJZO16tT9r3WJp/Safn31eu8uWrzglMahDT4dsmgqWonRY9grk3j+3tfuPr9WJNsfooOR7Gi7HL5W2jw==" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery.isotope/3.0.6/isotope.pkgd.min.js" integrity="sha512-Zq2BOxyhvnRFXu0+WE6ojpZLOU2jdnqbrM1hmVdGzyeCa1DgM3X5Q4A/Is9xA1IkbUeDd7755dNNI/PzSf2Pew==" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/fancybox/3.5.7/jquery.fancybox.min.js" integrity="sha512-uURl+ZXMBrF4AwGaWmEetzrd+J5/8NRkWAvJx5sbPSSuOb0bZLqf+tOzniObO00BjHa/dD7gub9oCGMLPQHtQA==" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/mermaid/8.4.8/mermaid.min.js" integrity="sha512-1tS1YUns336Mtxl+vkaLcADPwE1CPNVy3WEf7nrI7DGMMb6/FAVBgL2IzAWVBkB6vVuK94s2zVoiXcw1QZ9S1g==" crossorigin="anonymous" title="mermaid"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.18.1/highlight.min.js" integrity="sha512-1LdB3V708w6G4QRl7NsVdTr7MDibyRXr9stQZ+EGjEE0ZPMZkA//ir7kCWmFyxdAJNIRXdR/ZeJmCV0boyiCXw==" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.18.1/languages/java.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.18.1/languages/json.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.18.1/languages/xml.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.18.1/languages/shell.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.18.1/languages/dos.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.5.1/leaflet.js" integrity="sha512-GffPMF3RvMeYyc1LWMHtK8EbPv0iNZ8/oTtHPx9/cc2ILxQ+u905qIwdpULaqDkyBKgOaB57QTMg7ztg8Jm2Og==" crossorigin="anonymous"></script>
<script>const code_highlighting = true;</script>
<script>const isSiteThemeDark = false;</script>
<script>
const search_config = {"indexURI":"/mosaic/index.json","minLength":1,"threshold":0.3};
const i18n = {"no_results":"No results found","placeholder":"Search...","results":"results found"};
const content_type = {
'post': "Posts",
'project': "Projects",
'publication' : "Publications",
'talk' : "Talks"
};
</script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/anchor-js/4.1.1/anchor.min.js" integrity="sha512-aZotBPy6dqn8yVaLJwSrkJ+QxuxV695A4dgodAMvTU5JyNi5mhrr+LeaD3GSS+lx1SMFKNs0tu5ZMJEgNZQP2Q==" crossorigin="anonymous"></script>
<script>
anchors.add();
</script>
<script id="search-hit-fuse-template" type="text/x-template">
<div class="search-hit" id="summary-{{key}}">
<div class="search-hit-content">
<div class="search-hit-name">
<a href="{{relpermalink}}">{{title}}</a>
<div class="article-metadata search-hit-type">{{type}}</div>
<p class="search-hit-description">{{snippet}}</p>
</div>
</div>
</div>
</script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/fuse.js/3.2.1/fuse.min.js" integrity="sha512-o38bmzBGX+hD3JHWUFCDA09btWaqrNmoJ3RXLlrysA7PP01Kgs4UlE4MhelE1v5dJR3+cxlR4qQlotsW7jKsnw==" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/mark.js/8.11.1/jquery.mark.min.js" integrity="sha512-mhbv5DqBMgrWL+32MmsDOt/OAvqr/cHimk6B8y/bx/xS88MVkYGPiVv2ixKVrkywF2qHplNRUvFsAHUdxZ3Krg==" crossorigin="anonymous"></script>
<script type="application/javascript" src="/mosaic/js/academic.min.0992ad8b8d033c3858bb90b03966346a.js"></script>
<script type="application/javascript" src="/mosaic/js/mosaic-wg-cards.js"></script>
<script type="application/javascript" src="/mosaic/js/mosaic-docs.js"></script>
<script>
var tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]'))
tooltipTriggerList.map(function (tooltipTriggerEl) {
return new window.bootstrap.Tooltip(tooltipTriggerEl)
})
</script>
<div id="modal" class="modal fade" role="dialog">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">Cite</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body">
<pre><code class="tex hljs"></code></pre>
</div>
<div class="modal-footer">
<a class="btn btn-outline-primary my-1 js-copy-cite" href="#" target="_blank">
<i class="fas fa-copy"></i> Copy
</a>
<a class="btn btn-outline-primary my-1 js-download-cite" href="#" target="_blank">
<i class="fas fa-download"></i> Download
</a>
<div id="modal-error"></div>
</div>
</div>
</div>
</div>
</body>
</html>