Emane基础使用

CORE/EMANE

Emane模型调研

无线仿真基本内容学习:

  • 衰落模型

    emane只能使用事件或nakagami模型

    core设定的默认值是有问题的,m值越大信道越理想

  • 路径损耗

    emane可设定为2-RAY、freespace

    注意:针对大尺度场景下的路径损耗需要使用freespace,例如高度变化差异大的场景,否则效果不明显。

    propagationmodel设置为precomputed 预定义模型,其路径损耗通过pathloss事件触发。

    上述概念切勿混淆,其本质为信道衰落反映的是接收机观察到的信道强弱变化。

    它通常是大尺度衰落(路径损耗、阴影)和小尺度衰落(多径效应)的综合。

  • emane无线干扰

    根据下面的式子无线物理层处理是否接受该数据包(rxPower > rxSensitivity 即接收)

    rxPower = txPower + txAntennaGain + rxAntennaGain − pathloss`
    rxSensitivity = −174 + noiseFigure + 10log(bandWidth)
    

    对于frequencyofinterest监视的频率接收到后,根据设定不同的subid然后区分为带内外信号。

    节点设定noisemod会设定物理层能够根据噪声模式配置参数记录所有信号能量、带外信号能量或无信号能量(即该节点是否接受带内外信号影响造成干扰)。当在给定的请求间隔内没有记录信号能量或没有发生信号能量时,接收机灵敏度被用作底噪。802.11abg 具体例子

    最后计算信噪比SINR在mac层对应具体模型(例如rfpipe模型)再得到丢包率,采集有效包向core传输。

emane相关注意点:

  1. 场景配置中的云并不是类似有线场景的路由器,仅仅是配置链接上的节点的ip、无线模型、等phy mac的默认配置。关于节点是否可通信除了上面信号强度要达到rxSensitivity外,还要监听频率符合。所以发射频率和接收频率(phy层的frequency和frequencyofinterest)不同会组成上行下行信道,这样就不产生带内干扰。

Emane 介绍

EMANE 源码

Emane 架构

EMANE 教程测试

可扩展移动自组织网络仿真器 (The Extendable Mobile Ad-hoc Network Emulator) 允许使用可插拔 MAC 和 PHY 层架构进行异构网络仿真。EMANE是由美国海军研究实验室(NRL)代号5522和 Adjacent Link 有限责任公司开发的。EMANE 框架提供了一种实现架构,用于以网络仿真模块 (NEM: Network Emulation Modules) 的形式对不同的无线电接口类型进行建模,并将这些模块合并到在分布式环境中运行的实时仿真中。

可以使用 EMANE 绑定到虚拟设备的 EMANE 来模拟高保真无线网络,而不是使用 CORE 构建 Linux 以太网网桥。CORE 仿效第 3 层及以上(网络、会话、应用程序)及其虚拟网络堆栈和处理空间,用于协议和应用程序,而 EMANE 则使用其可插入的 PHY 和 MAC 模型模拟物理层和数据链路层。它为无线网络实验人员提供了一个高度灵活的模块化环境,用于设计、开发和测试简单和复杂的网络架构。EMANE采用物理层模型来考虑信号传播、天线轮廓效应和干扰源,以便为无线实验提供一个真实的环境。单个无线电模型插件用于模拟波形的最低层,并可以与现有的软件定义无线电(SDR)相结合。

Core和 EMANE 之间的接口是 TAP 设备。CORE 使用 Linux 网络名称空间构建虚拟节点,将 TAP 设备安装到名称空间中,并在名称空间中即时化一个 EMANE 过程。EMANE 过程将用户空间Socket与 TAP 设备绑定,以便从 CORE 发送和接收数据。

EMANE 实例通过控制端口(例如ctrl0 ,ctrl1)发送和接收 OTA(空中)流量来往于其他 EMANE 实例。它还使用相同或不同的控制端口发送和接收事件来回事件服务。通过 CORE 的WLAN配置对话配置 EMANE 模型。每个支持的 EMANE 模型都有相相应的Emane Python 子类,以提供配置项目及其对 XML 文件的映射。这样,新配置就可以很容易地得到支持。当 CORE 开始模拟时,它会生成指定 EMANE NEM 配置的相应 XML 文件,并启动 EMANE daemon

某些 EMANE 模型支持位置信息,以确定何时应丢弃数据包。EMANE 具有一个事件系统,其中位置事件广播给所有 NEM。当节点在画布上移动时,CORE 可以生成这些位置事件。画布大小和比例对话具有将 X,Y 坐标系统映射到 EMANE 使用的纬度、经度地理系统的控件。还可以在core.conf配置文件设定CORE订阅 EMANE 位置事件,这样core gui画布上的节点与EMANE 仿真中时节点的会同步移动。例如,当模拟脚本生成器运行移动脚本时,就会发生这种情况。

下面的每个主题都假设已经安装了CORE、EMANE和OSPF MDR。演示文件将在 core-pygui 中找到

主题模型描述总结
XML FilesRF Pipe概述生成的用于驱动EMANE的XML文件XML Files
GPSDRF Pipe概述gpsd与EMANE的运行和集成gpsd
PrecomputedRF Pipe概述如何使用预计算传播模型预计算传播模型
EELRF Pipe概述如何使用仿真事件日志(EEL)生成器EEL生成器
Antenna ProfilesRF Pipe概述如何在EMANE中使用天线配置文件天线配置

EMANE Configuration 及 事件监听

CORE 配置文件 /etc/core/core.conf 包含EMANE特有选项,如下所示:

# EMANE 配置
emane_platform_port = 8101
emane_transform_port = 8201
emane_event_monitor = False
# emane_models_dir = /home/username/.core/myemane
# EMANE log 范围[0,4] 默认: 2
emane_log_level = 2
emane_realtime = True
# emane安装地址前缀
# emane_prefix = /usr

可以手动拖动画布上的节点来更新它们在EMANE中的位置,会将core 的 xy 换算为 emane的经纬度事件发送。ns-2移动脚本改变gui会同步发送emane事件触发emane gps数据的同步 可以不修改改此项, 但是发送的emane事件无法触发gui的变化。

如果你有一个EMANE事件生成器(例如移动或pathloss脚本),并且想让CORE订阅EMANE位置事件,即后台发送emane位置事件更新,ui界面刷新其映射的xy坐标。在 CORE.conf 配置文件中把emane_event_monitor设置为 True,默认是 False。

如果是通过core安装的emane 就会自动安装emane目录下的python包,可以调用这些包装好的包去执行一些emane事件的api。emane事件监听的接口使用grpc实现的。例如这里的emane位置事件,可以调用 /usr/bin/emaneevent-location 下的python代码 使用的话 看看源码大概就明白了。自己发送emane事件更新位置。

如果core装在虚拟环境包 执行emaneevent-location 里的的python执行器路径要改为你的core-python路径,而不是默认python3的路径 不然是没有那么emane依赖包的 emane_event_monitor设置为 True

如果报这个错ERROR - emanemanager:starteventmonitor - Warning: EMANE events will not be generated because the emaneeventservice binding was unable to load (install the python-emaneeventservice bindings) 且确保安装了emane的支持包,可以试着如下修改源码:

# 文件 core/daemon/core/emane/emanemanager.py

***
self.starteventmonitor()
self.buildeventservicexml()

# 修改执行顺序 如下所示 确保 emanemangeer先初始化 event_service 再执行开启监听命令

self.buildeventservicexml()
self.starteventmonitor()
***

另一个常见的问题是,如果从源代码安装EMANE,默认配置前缀将把DTD文件放在 /usr/local/share/emane/dtd
而core.com希望他们在 /usr/share/emane/dtd

更新EMANE前缀配置可以解决此问题。

emane_prefix = /usr/local

自定义EMANE模型

CORE通过动态加载用户创建的表示模型的python文件来支持自定义开发的EMANE模型。
自定义的EMANE模型应该放在CORE配置文件中 emane_models_dir 所定义的路径中。这个路径不能以 /emane 结尾。

下面是一个用文档描述功能的示例模型:

"""
Example custom emane model.
"""
from typing import Dict, List, Optional, Set

from core.config import Configuration
from core.emane import emanemanifest, emanemodel


class ExampleModel(emanemodel.EmaneModel):
    """
    自定义 emane 模型.

    :cvar name: 定义将在GUI中显示的emane模型名称

    Mac Definition:
    :cvar mac_library:  定义模型将引用的MAC库
    :cvar mac_xml:      定义MAC清单文件,它将被解析以获得配置选项,这将在GUI中显示
    :cvar mac_defaults: 允许您重写上面清单文件中维护的选项
    :cvar mac_config:   解析清单文件并将配置转换为core支持的格式

    Phy Definition:
    注意: Phy配置将默认为通用模型如下所示,下面的部分非必须包括在内
    :cvar phy_library:  定义模型将引用的phy库,在需要提供自定义phy时使用
    :cvar phy_xml:      定义phy清单文件,该文件将被解析以获得配置选项,将在GUI中显示
    :cvar phy_defaults: 允许您重写上面清单文件中维护的选项或默认通用模型的选项
    :cvar phy_config:   解析清单文件并将配置转换为Core心支持的格式

    Custom Override Options:
    注意: 这些选项默认为下面所见的内容,不需要包括在内
    :cvar config_ignore: 允许您忽略phy/mac中的选项,通常在您需要添加一个自定义选项以在GUI中显示时使用
    """

    name: str = "emane_example"
    mac_library: str = "rfpipemaclayer"
    mac_xml: str = "/usr/share/emane/manifest/rfpipemaclayer.xml"
    mac_defaults: Dict[str, str] = {
        "pcrcurveuri": "/usr/share/emane/xml/models/mac/rfpipe/rfpipepcr.xml"
    }
    mac_config: List[Configuration] = emanemanifest.parse(mac_xml, mac_defaults)
    phy_library: Optional[str] = None
    phy_xml: str = "/usr/share/emane/manifest/emanephy.xml"
    phy_defaults: Dict[str, str] = {
        "subid": "1", "propagationmodel": "2ray", "noisemode": "none"
    }
    phy_config: List[Configuration] = emanemanifest.parse(phy_xml, phy_defaults)
    config_ignore: Set[str] = set()

单主机EMANE

本节描述在单个机器上运行CORE和EMANE。这是使用CORE构建EMANE网络时的默认操作模式。
OTA管理器和Event服务接口被设置为使用ctrl0,虚拟节点使用主控制通道进行相互通信。
当涉及到EMANE的场景时,主控制通道会自动激活。使用主控制通道可以防止模拟会话在本地
网络上发送多播流量,并干扰其他EMANE用户。

EMANE是通过一个WLAN节点配置的,因为它完全是关于模拟无线无线电网络的。
一旦节点连接到使用EMANE模型配置的WLAN云,该节点上的无线电接口也可以单独配置(除了云之外)。

双击WLAN节点以调用WLAN配置对话框。单击EMANE选项卡;正确安装EMANE后,EMANE无线模块应列在
EMANE型号列表中。(如果在安装EMANE Python绑定之前运行CORE守护进程,则可能需要重新启动它)
单击一个模型名称来启用它。

当在 EMANE Models 列表中选择一个EMANE模型时,单击 model options 按钮导致GUI查询
CORE daemon 以获取配置项。每个模型都会有不同的参数,请参考每个项目的解释的EMANE文档。
默认值显示在对话框中。单击 Apply 将存储EMANE模型选择。

EMANE options 按钮允许指定一些Emane 全局参数,其中一些是分布式操作所必需的。

RF-PIPE 和 IEEE 802.11abg 模型使用支持地理位置信息的通用PHY来确定节点之间的路径损耗。
一个默认的经纬度位置由CORE提供,这个基于位置的路径损耗默认启用;这是通用PHY的路径损耗模式设置。
在模拟运行时移动画布上的节点将为EMANE生成位置事件。
要查看或更改画布的地理位置或比例,请使用画布菜单中的“画布大小和比例”对话框。

注意,地理坐标系和笛卡尔坐标系之间的转换是使用通用墨卡托投影(UTM: Universal Transverse Mercator)完成的,
其中定义了6层不同的经度带区域。对于跨越多个UTM区域的非常大的场景,CORE生成的位置事件在区域边界附近可能变得不准确。
在这种情况下,建议使用EMANE位置脚本来实现地理位置的准确性。

单击绿色的 Start 按钮将启动模拟,并导致在连接到EMANE WLAN的虚拟节点中创建TAP设备。
这些设备显示为接口名称,如eth0、eth1等。EMANE进程现在应该在每个名称空间中运行。如下为四个节点的场景:

ps -aef | grep emane
root  1063 969 0 11:46 ? 00:00:00 emane -d --logl 3 -r -f /tmp/pycore.59992/emane4.log /tmp/pycore.59992/platform4.xml
root  1117 959 0 11:46 ? 00:00:00 emane -d --logl 3 -r -f /tmp/pycore.59992/emane2.log /tmp/pycore.59992/platform2.xml
root  1179 942 0 11:46 ? 00:00:00 emane -d --logl 3 -r -f /tmp/pycore.59992/emane1.log /tmp/pycore.59992/platform1.xml
root  1239 979 0 11:46 ? 00:00:00 emane -d --logl 3 -r -f /tmp/pycore.59992/emane5.log /tmp/pycore.59992/platform5.xml

上面的示例显示了CORE启动的EMANE进程。要查看CORE生成的配置,请查看/tmp/pycore。
这是一个用于存放 platform.xml 文件和其他 XML文件的 session目录。
查看这些信息的一种简单方法是双击其中一个虚拟节点,然后键入cd ..在shell中转到会话目录。

分布式 EMANE

在两个或多个模拟服务器中运行CORE和EMANE与在单个机器上运行类似。 为了仿真能够运行,需要设置一些关键的配置项,这里概述了这些配置项。

维护 数据(OTA流量)和控制流量为独立的网络是一个好主意。例如,控制网络可能是一个共享的实验室网络, core不希望数据网络上的多播通信干扰其他EMANE用户。此外,控制流量可能会干扰OTA延迟和吞吐量, 并可能影响仿真的保真度。这里描述的示例将使用eth0作为控制接口,使用eth1作为数据接口, 尽管并不严格要求使用单独的接口。注意,这些接口名称指的是物理主机上的接口,而不是节点内的虚拟接口。

重要事项:如果使用了辅助控制网络,则需要将主机上的一个接口分配给该网络

作为模拟服务器的每台机器都需要安装CORE和EMANE。

可用服务器的IP地址从核心仿真服务器对话框中配置(选择 Session 然后 Emulation servers… )。 这个服务器列表存储在*~/.core/servers.conf*文件中。对话框显示了可用的服务器, 其中的一部分或全部可以分配给画布上的节点。

需要将节点分配给仿真服务器。选择几个节点,右键单击它们,选择Assign to和所需服务器的名称。 当未将节点分配给任何仿真服务器时,将在本地对其进行仿真。GUI连接的本地机器被认为是“主”机器, 而主机器又连接到其他模拟服务器的“从属”。应该配置从主服务器到从服务器的公钥SSH登录 具体请看分布式

注意 下面是使用EMANE进行分布式模拟的快速检查表。

  1. 遵循常规CORE的步骤。
  2. 在EMANE WLAN的 EMANE 标签下,单击 EMANE options
  3. 打开 OTA Manager channel ,设置 OTA Manager device 。同时设置 Event Service device
  4. 选择节点组,右键单击它们,并使用 assign to 菜单将它们分配给主或从服务器。
  5. 在开始模拟之前,使用 ntpptp 同步机器的时钟。一些EMANE模型对时间很敏感。
  6. Start 按钮启动分布式仿真。

现在,当使用Start按钮实例化模拟时,本地CORE Python守护进程将连接到已分配给节点的其他模拟服务器。 每个服务器都有自己的会话目录,其中生成platform.xml文件和其他EMANE XML文件。NEM id在服务器之间自动协调, 因此没有重叠。每个服务器还获得自己的平台ID。

以太网设备用于传播组播EMANE事件,如 configure EMANE 对话框中所指定的。EMANE的事件服务可以通过移动性 或路径损耗脚本运行,如单主机Emane所述。 如果CORE没有订阅位置事件,它将在画布上移动节点时生成这些事件。

在运行时双击节点将导致GUI尝试SSH到该节点的仿真服务器,并运行交互式shell。在启动模拟之前, 应该使用所有模拟服务器对公钥SSH配置进行测试。

Emane架构

Emane架构主要由三部分组成:

Emulation Processing(仿真服务过程)

Emulation Processing 由 物理层模型 实例与一个或多个 无线电(波形)模型 实例配对。仿真器处理XML 配置文件以确定要实例化的无线电模型插件类型、应如何配置模型和物理层实例以及应用什么通用业务设置。

EMANE 分布包括三种无线电模型:

和一个实用新型:

当模拟器即时化模型插件时,它将每个插件放置在 网络模拟模块(NEM) 以及模拟器物理层的专用实例中。物理层实例使用 Over-The-Air (OTA)多广播通道相互连接。所有 OTA 消息均由每个模拟器实例使用相同的 OTA 多广播通道进行处理。这就是模拟器物理层如何负责异构无线电模型的信号传播、天线效应和干扰源。

每个无线电模型的运行方式不同,但一般的想法是,模型从应用空间接收消息,进行空中传输,并将消息发送到其物理层实例,以便通过 OTA 多播通道传输(可能在无线电模型执行通道访问功能之后)。使用同一 OTA 多播通道的所有模拟器实例都会接收消息并执行接收功率测试。根据消息接收功率的物理层实例是否大于接收器灵敏度,可将消息归类为噪声或有效的带内波形信号。有效的波形信号被发送到接收无线电模型进行额外的处理。大多数无线电模型使用基于消息 Signal to Noise and Interference Ratio(SINR) 的 Bit Error Rate (BER) 曲线,作为决定是否将消息传递到相应的应用空间过程的决定的一部分。

术语 application space process (应用空间过程)不应与内核和应用/用户空间的概念混淆。所有 EMANE 进程都在用户空间中运行。我们使用术语应用程序空间(通常作为 application/emulation boundary 主题的一部分)表示任何进程,该过程不是作为模拟器中的插件运行,而是以某种方式连接到(使用)模拟器。

我们使用 下游 术语来表示所有指向 OTA 多播通道的消息,以及所有向应用空间过程交付的消息的 上游 术语。这并不意味着 OTA 多播通道或应用空间过程必须是最终消息目的地。当无线电模型向其相应的物理层实例发送控制消息时,我们称之为下游控制消息,当物理层实例向无线电模型发送数据包消息时,我们称之为 上游数据包消息 。一旦你开始分析无线电模型性能统计,你会理解其中的区别。

Application/Emulation Transport Boundary Processing (传输边界过程)

应用/模拟传输边界是负责在模拟器实例和一个或多个应用空间过程之间传递消息的仿真组件。我们称这个组件为 运输 工具。为模拟器和应用空间消息提供出入口点。

运输插件可以作为模拟器过程的一部分在内部即时化,也可以作为其他应用的一部分在外部即时化。Transport DaemonEMANE 应用程序处理配置 XML,以确定要即时的外部传输插件类型、应如何配置插件以及应用什么一般应用级别设置。

EMANE 包含两种传输数据的方式:

EMANE 支持 IP 和非 IP 无线仿真,因此个人传输支持的应用空间消息类型差异很大。但是,一旦传输有消息要传递,它们通常都必须做同样的事情。在下游方向,传输必须确定下一跳消息的 NEM ID(这可能是 NEM 广播地址),并将消息与源和目的地 NEM ID 一起发送到已连接的 NEM。在上游方向,传输必须确定应用空间过程才能接收并发送消息。

当应用程序空间消息通过Transport传输时,它们将失去其形式,并作为指定大小的不透明有效负载通过仿真器发送。Transport是模拟器中唯一可以读写应用程序空间消息细节的组件。

例如,Virtual Transport使用TUN/TAP接口创建 虚拟接口 (vif) 作为应用程序/模拟边界入口/出口点。在下游方向上,由内核路由到 vif 的以太网框架被打包成消息并发送到适当的 NEM 进行处理。在上游方向,NEM 消息被拆包并作为以太网帧写入到 TUN/TAP 界面。

应用/模拟边界不限于由仿真器内部加载的插件或由运输守护进程从外部加载的插件。当将 软件定义无线电(SDR)波形连接到 EMANE 时,应开发自定义传输并嵌入*Modem Hardware Abstraction Layer *(MHAL) 的 SDR 中。EMANE 提供应用级别的 API,使开发自定义传输非常容易。

Event Processing (仿真事件过程)

为了有趣,运行模拟需要一个场景。场景是发送到一个或多个 NEM 以更改环境特征的一组事件。事件不透明地传递给注册的无线电模型实例,因此单个无线电模型可能需要自己的专业活动。只要有可能,我们主张重复使用 EMANE 标准事件,而不是创建做同样的事情的新事件。

EMANE 分布包括以下事件:

  • Antenna Profile Event
  • Comm Effect Event
  • Location Event
  • Pathloss Event
  • TDMA Schedule Event
  • Fading Selection Event

事件由事件生成器创建。Event ServiceEMANE 应用程序处理XML配置文件以确定要即时处理的事件生成器插件的类型、应如何配置插件以及应用什么业务。

EMANE 分布包含一个事件生成器,将创建所有标准事件:

并提供python modules,让您创建自己的事件生成器应用程序:

  • emane.events.EventService
  • emane.events.AntennaProfileEvent
  • emane.events.CommEffectEvent
  • emane.events.LocationEvent
  • emane.events.PathlossEvent
  • emane.events.TDMAScheduleEvent
  • emane.events.FadingSelectionEvent

Emane教程及测试

本教程中的每个演示都旨在突出显示模拟器的特定功能。本教程提供了一个使用LXC Containers 创建一组测试节点的简单测试流,这些测试节点运行模拟器实例以及MANET(移动自组网)世界中通常使用的应用程序和服务。

其中关于环境和测试用例的配置方法为了方便省事,直接用官方给的虚拟机来做测试。

教程虚拟机 (Tutorial VM) 是一个CentOS 7 VirtualBox镜像,带有EMANE 1.2.1。教程演示的保真度将根据主机系统配置的不同而变化。

  • 用户名:emane
  • 密码: emanedemo
  • 虚拟机sha1sum: 9fb689eff14b43f700935e8514abb62aebc13761
# 首先进行编译安装
cd ~/emane-tutorial
make

教程中有9个demo测试:

Demo容器数模型传输描述
02BypassVirtual介绍仿真器子系统和应用程序
110RF PipeVirtual介绍事件生成、EMANE Shell和一般物理层的概念
27RF PipeVirtual介绍射频管无线电模型(RF Pipe radio)
310IEEE 802.11abgVirtual介绍IEEE 802.11abg无线模型
54IEEE 802.11abg, RF PipeVirtual了解仿真器频谱监测和噪声处理
64RF PipeVirtual如何使用物理层天线配置文件
710Comm EffectRaw介绍了Comm Effect实用模型和黑盒测试
810TDMAVirtual介绍TDMA事件调度器无线电模型
  • 注意:

    此教程仅仅展示Emane工作流程无需专门学习其配置流程,在core中配置节点Emane等操作有专门的控制流程。并且Emane的实现并不一定需要LXC容器,但是这里展示和core的节点实现是采用lxc容器做的。

注意:之后的几章节测试使用corepygui打开图片路径不会报错,这几个emane测试场景路径为 ~/.coregui/xmls 注意:emane 的几个python程序默认用的是主机python,安装在虚拟环境的core需要将python运行路径替换为core-python,或者使用core-python运行。其使用说明在emane介绍中可以看到。

XML Files

在配置好emane的场景或直接运行 emane-demo-files.xml 后,在会话的临时目录(例如/tmp/pycore.44151/n8.conf) 中就会生成对应emane配置的xml文件。就像 emane-demo 中配置的xml文件那样。(emane demo0

用于节点运行EMANE的根配置文件是 platform.xml 文件。其作用为:

  • 列出为Emane设定的所有总配置值
  • 为节点创建的每个接口给定的唯一的 nem id
  • 用于定义使用的 nem.xml 路径

nem.xml文件定义将包含对给定nem所使用的 transport mac phy xml文件的的定义及引用。

文件名描述
-platform.xmlemane仿真实例化的配置文件
-nem.xml创造NEM的配置文件 (NEM: Network Emulation Modules)
-mac.xml用于定义NEMs MAC层的配置
-phy.xml用于定义NEMs PHY层的配置
-trans-virtual.xml使用 virtual 传输时的配置
-trans.xml使用 raw 传输时的配置

Gpsd

GPSD是一个计算机软件程序,从全球定位系统(GPS)接收器收集数据,并通过互联网协议(IP)网络向服务器-客户端应用程序架构中潜在的多个客户端应用程序提供数据。Gpsd 可以作为一个daemon运行,以透明的方式运行为服务器的后台任务。网络界面为多个并发客户端应用程序(如Kismet或 GPS导航软件)提供了标准化的数据格式。Emane的位置数据就是如此获取的(EMANE仿真中运行gpsd位置代理,该代理将把位置输出到伪终端文件gps.pty。gpsd服务器可以读入该文件,使gpsd客户机可以使用EMANE位置事件。)

物理机上安装gpsd软件:

sudo apt-get install gpsd
sudo apt-get install gpsd-clients 

gpsd客户端及daemon的官方介绍

运行示例 emane-demo-gpsd.xml(emane demo0

EMANE GPSD Event Daemon 具体流程:

  1. 首先在会话目录对应的n1节点文件夹下创建emane 的事件守护进程配置文件 eventdaemon.xml。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE eventdaemon SYSTEM "file:///usr/share/emane/dtd/eventdaemon.dtd">
<eventdaemon nemid="1">
 <param name="eventservicegroup" value="224.1.2.8:45703"/>
 <param name="eventservicedevice" value="ctrl0"/>
 <agent definition="gpsdlocationagent.xml"/>
</eventdaemon>
  1. 上面的配置会生成如下的 gpsdlocationagent.xml 文件。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE eventagent SYSTEM "file:///usr/share/emane/dtd/eventagent.dtd">
<eventagent library="gpsdlocationagent">
  <param name="pseudoterminalfile" value="gps.pty"/>
</eventagent>
  1. 启动EMANE事件代理。这将有助于将位置事件输出到上面定义的伪终端文件。
    emaneeventd eventdaemon.xml -r -d -l 3 -f emaneeventd.log
  1. 启动gpsd,读取伪终端文件。
    gpsd -G -n -b $(cat gps.pty)

EMANE EEL Event Daemon 具体流程:

EEL 事件将通过指定的控制网络接口从实际主机运行。在主机上的同一目录中创建以下文件,在主机终端打开对应文件夹

注意:确保以下 eventservicedevice 与主机上用于 EMANE 的控制网络设备匹配

  1. 创建 eventservice.xml 文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE eventservice SYSTEM "file:///usr/share/emane/dtd/eventservice.dtd">
<eventservice>
  <param name="eventservicegroup" value="224.1.2.8:45703"/>
  <param name="eventservicedevice" value="b.9001.1"/>
  <generator definition="eelgenerator.xml"/>
</eventservice>
  1. 创建 eelgenerator.xml 文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE eventgenerator SYSTEM "file:///usr/share/emane/dtd/eventgenerator.dtd">
<eventgenerator library="eelgenerator">
    <param name="inputfile" value="scenario.eel" />
    <paramlist name="loader">
      <item value="commeffect:eelloadercommeffect:delta"/>
      <item value="location,velocity,orientation:eelloaderlocation:delta"/>
      <item value="pathloss:eelloaderpathloss:delta"/>
      <item value="antennaprofile:eelloaderantennaprofile:delta"/>
    </paramlist>
</eventgenerator>
  1. 创建 scenario.eel 文件
0.0  nem:1 location gps 40.031075,-74.523518,3.000000
0.0  nem:2 location gps 40.031165,-74.523412,3.000000
  1. 启动 EEL 事件服务,它将通过控制网络将上述文件中定义的事件发送到所有 EMANE 节点。这些位置事件将被接收并提供给 gpsd。这允许 gpsd 客户端连接并获取 gps 位置。
emaneeventservice eventservice.xml -l 3

预计算传播模型

物理层模型中的路径损耗基于位置或路径损耗事件。当传播模型配置参数设置为2ray或freespace时,路径损耗是基于位置事件动态计算的,这将分别在2-ray flat earth或freespace传播模型之间进行选择。也可以使用外部传播的路径损耗事件计算实时的路径损耗,需要将propagationmodel参数设置为预先计算模型precomputed,以处理接收的路径损耗pathloss事件。

介绍预先计算模型(EMANE Demo 1),运行 emane-demo-precomputed.xml 场景,(相对于上面的场景即改变rf-pipe选项->PHY Parameters->propagationmodel->precomputed)

打开n1中终端,由于使用了预计算的路径损耗事件,并且还没有发送任何路径损耗事件,节点之间还不能ping通。

您可以利用 EMANE Shell 来调查数据包被丢弃的原因。

root@n1:/tmp/pycore.46777/n1.conf# emanesh localhost get table nems phy BroadcastPacketDropTable0 UnicastPacketDropTable0
nem 1   phy BroadcastPacketDropTable0
| NEM | Out-of-Band | Rx Sensitivity | Propagation Model | Gain Location | Gain Horizon | Gain Profile | Not FOI | Spectrum Clamp | Fade Location | Fade Algorithm | Fade Select |
| 2   | 0           | 0              | 169               | 0             | 0            | 0            | 0       | 0              | 0             | 0              | 0           |

nem 1   phy UnicastPacketDropTable0
| NEM | Out-of-Band | Rx Sensitivity | Propagation Model | Gain Location | Gain Horizon | Gain Profile | Not FOI | Spectrum Clamp | Fade Location | Fade Algorithm | Fade Select |

在上面的例子中,我们可以看到数据包被丢弃的原因是由于传播模型,这是因为我们没有发出任何路径损耗事件。您可以运行另一个命令来验证您是否收到了任何路径损耗事件。

root@n1:/tmp/pycore.46777/n1.conf# emanesh localhost get table nems phy  PathlossEventInfoTable
nem 1   phy PathlossEventInfoTable
| NEM | Forward Pathloss | Reverse Pathloss |

Pathloss Events

在主机上,我们将从所有nem向所有其他nem发送路径损耗事件。

注意:确保正确指定控制网络设备

emaneevent-pathloss 1:2 90 -i <controlnet device>

现在,如果我们检查n2上的路径损耗事件,我们将看到刚才发送的内容。

root@n1:/tmp/pycore.46777/n1.conf# emanesh localhost get table nems phy  PathlossEventInfoTable
nem 1   phy PathlossEventInfoTable
| NEM | Forward Pathloss | Reverse Pathloss |
| 2   | 90.0             | 90.0

这之后就可以 ping 通n1 n2。(需要两边都添加默认网关路由 ip link default add 10.0.0.2[1])

其实直接看gui上有无绿线就知是否联通,有绿线ping不通大概率是路由问题。

EEL生成器

这里将介绍如何使用EMANE事件服务和eel文件提供事件。可以加载一个初始场景 emane-demo-eel.xml(EMANE Demo 1

在n1上,我们将使用 EMANE event dump utility 监听事件。

root@n1:/tmp/pycore.46777/n1.conf# emaneevent-dump -i ctrl0

发送事件

使用以下内容创建eventservice.xml。(在外部主机创建运行)

测试发现 如果 emane_event_monitor 没有设置为 True, 发送改变节点gps位置事件,节点GPS的确改变,但是对应core UI不会改变。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE eventservice SYSTEM "file:///usr/share/emane/dtd/eventservice.dtd">
<eventservice>
  <param name="eventservicegroup" value="224.1.2.8:45703"/>
  <param name="eventservicedevice" value="b.9001.f"/>
  <generator definition="eelgenerator.xml"/>
</eventservice>

接下来,我们将创建eelgenerator.xml文件。

EEL Generator实际上是一个sentence加载并解析的插件。 解析插件知道如何将某些指令(commeffect、location、velocity、orientation、pathloss和antennaprofile )转换成相应的emane事件。

  • commeffect : eelloadercommeffect : delta
  • location, velocity, orientation : eelloaderlocation:delta
  • pathloss : eelloaderpathloss : delta
  • antennaprofile : eelloaderantennaprofile : delta

这些配置项告诉EEL Generator 哪些 sentences 要映射到哪个插件,以及是发布增量更新还是完整更新。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE eventgenerator SYSTEM "file:///usr/share/emane/dtd/eventgenerator.dtd">
<eventgenerator library="eelgenerator">
    <param name="inputfile" value="scenario.eel" />
    <paramlist name="loader">
      <item value="commeffect:eelloadercommeffect:delta"/>
      <item value="location,velocity,orientation:eelloaderlocation:delta"/>
      <item value="pathloss:eelloaderpathloss:delta"/>
      <item value="antennaprofile:eelloaderantennaprofile:delta"/>
    </paramlist>
</eventgenerator>

最后,创建 scenario.eel

0.0  nem:1 pathloss nem:2,90.0
0.0  nem:2 pathloss nem:1,90.0
0.0  nem:1 location gps 40.031075,-74.523518,3.000000
0.0  nem:2 location gps 40.031165,-74.523412,3.000000
emaneeventservice eventservice.xml -l 3

如果我们返回查看原始终端,我们将看到事件注销到终端。

root@n1:/tmp/pycore.46777/n1.conf# emaneevent-dump -i ctrl0
[1601858142.917224] nem: 0 event: 100 len: 66 seq: 1 [Location]
 UUID: 0af267be-17d3-4103-9f76-6f697e13bcec
   (1, {'latitude': 40.031075, 'altitude': 3.0, 'longitude': -74.823518})
   (2, {'latitude': 40.031165, 'altitude': 3.0, 'longitude': -74.523412})
[1601858142.917466] nem: 1 event: 101 len: 14 seq: 2 [Pathloss]
 UUID: 0af267be-17d3-4103-9f76-6f697e13bcec
   (2, {'forward': 90.0, 'reverse': 90.0})
[1601858142.917889] nem: 2 event: 101 len: 14 seq: 3 [Pathloss]
 UUID: 0af267be-17d3-4103-9f76-6f697e13bcec
   (1, {'forward': 90.0, 'reverse': 90.0})

天线配置

介绍在CORE中使用EMANE天线剖面,基于下面链接的EMANE演示示例。(EMANE Demo 6

在开始这个会话之前,我们需要创建一些文件。创建目录放置天线配置文件。

mkdir /tmp/emane

创建 /tmp/emane/antennaprofile.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE profiles SYSTEM "file:///usr/share/emane/dtd/antennaprofile.dtd">
<profiles>
  <profile id="1"
	  antennapatternuri="/tmp/emane/antenna30dsector.xml"
	   blockagepatternuri="/tmp/emane/blockageaft.xml">
    <placement north="0" east="0" up="0"/>
  </profile>
  <profile id="2"
	   antennapatternuri="/tmp/emane/antenna30dsector.xml">
    <placement north="0" east="0" up="0"/>
  </profile>
</profiles>

创建 /tmp/emane/antenna30dsector.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE antennaprofile SYSTEM "file:///usr/share/emane/dtd/antennaprofile.dtd">

<!-- 30degree sector antenna pattern with main beam at +6dB and gain decreasing by 3dB every 5 degrees in elevation or bearing.-->
<antennaprofile>
  <antennapattern>
    <elevation min='-90' max='-16'>
      <bearing min='0' max='359'>
        <gain value='-200'/>
      </bearing>
    </elevation>
    /* 略 */
    <elevation min='16' max='90'>
      <bearing min='0' max='359'>
        <gain value='-200'/>
      </bearing>
    </elevation>
  </antennapattern>
</antennaprofile>

创建 /tmp/emane/blockageaft.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE antennaprofile SYSTEM "file:///usr/share/emane/dtd/antennaprofile.dtd">

<!-- blockage pattern: 1) entire aft in bearing (90 to 270) blocked 2) elevation below -10 blocked, 3) elevation from -10 to -1 is at -10dB to -1 dB 3) elevation from 0 to 90 no blockage-->
<antennaprofile>
  <blockagepattern>
    <elevation min='-90' max='-11'>
      <bearing min='0' max='359'>
        <gain value='-200'/>
      </bearing>
    </elevation>
    /* 略 */
      </bearing>
    </elevation>
  </blockagepattern>
</antennaprofile>

加载场景 emane-demo-antenna.xml,双击 n1终端

本演示将介绍如何运行EMANE事件服务来提供天线、位置和路径损耗事件,以演示如何使用天线剖面。

与之前类似的配置文件 eventservice.xml eelgenerator.xml (外部主机运行emaneeventservice -l 3 eventservice.xml)

scenario.eel 内容为

0.0 nem:1 antennaprofile 1,0.0,0.0
0.0 nem:4 antennaprofile 2,0.0,0.0
#
0.0 nem:1  pathloss nem:2,60  nem:3,60   nem:4,60
0.0 nem:2  pathloss nem:3,60  nem:4,60
0.0 nem:3  pathloss nem:4,60
#
0.0 nem:1  location gps 40.025495,-74.315441,3.0
0.0 nem:2  location gps 40.025495,-74.312501,3.0
0.0 nem:3  location gps 40.023235,-74.315441,3.0
0.0 nem:4  location gps 40.023235,-74.312501,3.0
0.0 nem:4  velocity 180.0,0.0,10.0
#
30.0 nem:1 velocity 20.0,0.0,10.0
30.0 nem:1 orientation 0.0,0.0,10.0
30.0 nem:1 antennaprofile 1,60.0,0.0
30.0 nem:4 velocity 270.0,0.0,10.0
#
60.0 nem:1 antennaprofile 1,105.0,0.0
60.0 nem:4 antennaprofile 2,45.0,0.0
#
90.0 nem:1 velocity 90.0,0.0,10.0
90.0 nem:1 orientation 0.0,0.0,0.0
90.0 nem:1 antennaprofile 1,45.0,0.0

发送的事件将触发4种不同的状态。

  • 状态1
    • N2和N3相互看到
    • N4和N3指向外
  • 状态2
    • N2和N3相互看到
    • N1和N2相互看到
    • N4和N3相互看到
  • 状态3
    • N2和N3相互看到
    • N4和N3正对着对方,但是被阻塞了
  • 状态4
    • N2和N3相互看到
    • N4和N3相互看到