discrete-event-sim
Дискретный событийный симулятор имитирует радиосекцию программного обеспечения устройства. В настоящее время он основан на Meshtastic 2.1.
Использование
Пожалуйста, выполните git clone или скачайте этот репозиторий, перейдите в папку Meshtasticator (опционально создайте виртуальную среду) и установите необходимые зависимости с помощью:
pip install -r requirements.txt
Чтобы запустить одну симуляцию с настройками по умолчанию, выполните:
python3 loraMesh.py [nr_nodes]
Если аргумент не указан, сначала вам нужно разместить узлы на карте. После размещения узла вы можете опционально установить узел как маршрутизатор, изменить его лимит хопов, высоту (эlevation) и коэффициент усиления антенны. Эти настройки автоматически сохраняются при размещении нового узла или запуске симуляции.

Если указано количество узлов, они будут размещены случайным образом в области. Это гарантирует, что каждый узел может достичь как минимум одного другого узла. Кроме того, все узлы размещаются на настраиваемом минимальном расстоянии (MINDIST) друг от друга.
Если вы разместили узлы самостоятельно, после симуляции количество узлов, их координаты и конфигурация автоматически сохраняются, и вы можете повторно запустить сценарий с помощью:
python3 loraMesh.py --from-file
Если вы хотите изменить какие-либо конфигурации, отредактируйте файл out/nodeConfig.yaml перед запуском с помощью указанной выше команды.
Для запуска нескольких повторений симуляций для набора параметров, например, количества узлов, выполните:
python3 batchSim.py
После завершения симуляций отображаются соответствующие метрики, полученные из симуляций. Эти метрики сохраняются в /out/report/ для последующего анализа. См. plotExample.py для примера скрипта Python для построения графиков результатов.
Чтобы симулировать разные параметры, вам придется изменить скрипт batchSim.py самостоятельно.
Пользовательские конфигурации
Здесь перечислены некоторые конфигурации, которые вы можете изменить для моделирования вашего сценария в /lib/config.py. Они применяются ко всем узлам, за исключением тех, которые вы настраиваете для каждого узла при использовании карты.
Модем
Используемый LoRa-модем (см. настройки радиомодема Meshtastic), определенный ниже:
| Модем | Название | Полоса пропускания (кГц) | Кодовая скорость | Фактор распространения | Скорость данных (кбит/с) |
|---|---|---|---|---|---|
| 0 | Short Fast | 250 | 4/8 | 7 | 6.8 |
| 1 | Short Slow | 250 | 4/8 | 8 | 3.9 |
| 2 | Mid Fast | 250 | 4/8 | 9 | 2.2 |
| 3 | Mid Slow | 250 | 4/8 | 10 | 1.2 |
| 4 | Long Fast | 250 | 4/8 | 11 | 0.67 |
| 5 | Long Moderate | 125 | 4/8 | 11 | 0.335 |
| 6 | Long Slow | 125 | 4/8 | 12 | 0.18 |
| 7 | Very Long Slow | 62.5 | 4/8 | 12 | 0.09 |
Период
Средний период (в мс), с которым узлы генерируют новое сообщение, следуя экспоненциальному распределению. Например, если вы установите 300 с, каждый узел будет генерировать сообщение в среднем раз в пять минут.
Длина пакета
Размер полезной нагрузки каждого сгенерированного сообщения в байтах. Для пакета позиции это будет около 40 байт.
Модель
Эта функция относится к модели потери сигнала на пути, т. е. тому, что использует симулятор для расчета того, насколько хорошо сигнал будет распространяться. Обратите внимание, что это лишь грубая оценка физической среды и не будет на 100% точной, поскольку зависит от множества факторов. Реализованные модели потери сигнала на пути:
0устанавливает модель логарифмического расстояния1устанавливает модель Okumura-Hata для малых и средних городов2устанавливает модель Okumura-Hata для мегаполисов3устанавливает модель Okumura-Hata для пригородных районов4устанавливает модель Okumura-Hata для сельских районов5устанавливает модель 3GPP для пригородных макроячеек6устанавливает модель 3GPP для мегаполисных макроячеек
Широковещательные сообщения или прямые сообщения (DM)
По умолчанию DM установлено в False, что означает отправку только широковещательных сообщений. Если установить в True, каждый узел будет отправлять DM только случайному другому узлу в сети.
Объяснение
Дискретный событийный симулятор переходит от события к событию во времени, где событие — это изменение состояния системы. Поэтому он хорошо подходит для симуляции коммуникационных сетей.
Для каждого узла в симуляции создается экземпляр, имитирующий логику Meshtastic. Каждый узел запускает три параллельных процесса: generateMessage, transmit и receive. Первый создает событие, формируя новое сообщение с уникальным номером последовательности в случайное время, взятым из экспоненциального распределения. Пока что каждое сгенерированное сообщение имеет одинаковый размер полезной нагрузки. Второй и третий процессы моделируют соответственно поведение передачи и приема.
Модель физического (PHY) уровня LoRa находится в /lib/phy.py. В зависимости от используемого модема она рассчитывает время эфирного времени пакета. Уровень PHY использует настраиваемую модель потери сигнала на пути для оценки того, могут ли узлы на определенном расстоянии обнаруживать пакеты друг друга. Кроме того, она определяет, сталкиваются ли два пакета, что зависит от частоты, фактора распространения, времени приема и мощности приема двух пакетов.
Поведение маршрутизации реализовано в каждом из процессов узла. В generateMessage обрабатываются надежные повторные передачи, если не получено неявное подтверждение. Создается MeshPacket (определен в /lib/packet.py), чтобы передать сообщение. Обратите внимание, что может создаваться несколько пакетов, содержащих одно и то же сообщение, из-за повторных передач и повторного вещания. В receive решается, что делать при приеме пакета. Пакет заливается (flooded), если его лимит хопов не равен нулю и ранее не было услышано повторного вещания этого пакета. В transmit вызываются задержки уровня Medium Access Control (MAC) из /lib/mac.py. MAC использует механизм прослушивания перед передачей, включая введение (случайных или основанных на SNR) задержек перед передачей пакета. Когда пакет готов к передаче по эфиру, сначала проверяется, не получено ли в это время подтверждение; в противном случае передача отменяется.
Фактическая коммуникация между процессами разных узлов обрабатывается с помощью BroadcastPipe из SimPy. Это гарантирует, что пакет, переданный одним узлом, создает события (одно в начале пакета и одно в конце) на принимающих узлах.