Интерактивный симулятор mesh-сети, визуализирующий принципы работы mesh-networking с реалистичной моделью распространения радиосигнала.
- 🗺️ Интерактивная карта - добавляйте узлы кликом по карте
- 📡 Реалистичная симуляция - распространение пакетов с учетом SNR (Signal-to-Noise Ratio)
- 🔄 Автоматическая ретрансляция - узлы автоматически переотправляют пакеты
- 🚫 Обнаружение коллизий - реализация CSMA (Carrier Sense Multiple Access)
- 📊 Визуальная индикация - анимация передачи и приема пакетов
- 🎯 Drag & Drop - перемещайте узлы для изменения топологии сети
- 📈 Статистика в реальном времени - покрытие сети, среднее количество хопов
- 📝 Панель логов - детальная информация о всех событиях симуляции
- ⚙️ Настройки симуляции - регулируйте hop limit и выбирайте типы узлов
- ⚙️ Настройка узлов - изменяйте мощность передатчика, высоту и лимит прыжков через контекстное меню
- 📱 Мобильная поддержка - долгое нажатие на узел для открытия меню на смартфонах
- 🪟 Многооконный интерфейс - перетаскиваемые информационные окна с управлением слоями
Симулятор реализует следующие механизмы mesh-networking:
Узлы проверяют, не занят ли канал перед передачей (Channel Activity Detection). Если канал занят, передача откладывается со случайной задержкой (backoff), после чего выполняется повторная попытка (до 5 попыток).
Вероятность успешного приема пакета зависит от отношения сигнал/шум:
- SNR > -7 dB: высокая вероятность приема (~98%)
- SNR ~ -11 dB: 50% вероятность
- SNR < -15 dB: низкая вероятность (~2%)
Уровень сигнала уменьшается с расстоянием по логарифмической модели:
- Влияние мощности на дальность: базовая дальность 600м на уровне земли при 20 дБм, рассчитывается по формуле Friis
Range = 600м × 10^((Power - 20дБм) / 20)- При мощности 20 дБм (на земле): 600 м
- При мощности 10 дБм (на земле): ~190 м
- При мощности 30 дБм (на земле): ~1.9 км
- Влияние высоты на дальность: линейная модель от 600м до 50км
- На высоте 0м: 600м (первые этажи)
- На высоте 20м: ~5.5 км (7-этажка)
- На высоте 50м: ~13 км (высотка)
- На высоте 100м: ~25 км (вышка)
- На высоте 200м: 50 км (максимум)
- Каждый метр высоты добавляет ~247 метров дальности
- Влияние высоты на затухание: средняя высота двух узлов снижает path loss exponent от 2.5 (земля) до 2.0 (высота 200м)
- Чем выше узлы, тем меньше влияние застройки на качество сигнала
- Влияние мощности на SNR: каждый дБм мощности добавляет 1 дБ к максимальному SNR
- Модель затухания:
PL(d) = 10 * n * log10(d/d0)где n зависит от высоты (2.0-2.5) - Случайный фединг: ±2 dB (log-normal shadowing)
- Диапазон SNR: от +15 dB (1 метр) до -10 dB (максимальная дальность) при базовой мощности 20 дБм
Пакеты имеют ограничение на количество переходов (по умолчанию 3 хопа), чтобы предотвратить бесконечное распространение.
Узлы отслеживают уже полученные пакеты и подавляют повторную ретрансляцию дубликатов:
- ClientNode: проверяет, слышал ли пакет повторно от других узлов
- RouterNode: проверяет, передавал ли уже этот пакет ранее
- Это предотвращает бесконечные циклы и снижает загрузку сети
Узлы с худшим SNR (дальше от источника) ретранслируют раньше, узлы с лучшим SNR (ближе) ждут дольше. Это вдохновлено протоколом Meshtastic.
Примечание: Алгоритм симуляции не полностью соответствует протоколу Meshtastic, но стремится к реалистичному моделированию основных принципов mesh-networking.
Симулятор поддерживает три типа узлов с разным поведением:
-
ClientNode (по умолчанию):
- Задержка ретрансляции зависит от SNR (0-2000 мс)
- Не ретранслирует повторно услышанные пакеты
- Уменьшает hopLimit при каждой ретрансляции
-
RouterNode:
- Мгновенная ретрансляция (0 мс задержка)
- Не ретранслирует уже переданные пакеты
- Особая логика hopLimit: не уменьшает счетчик для пакетов от "избранных" узлов
-
ClientMuteNode:
- Только принимает пакеты, никогда не ретранслирует
- Используется для моделирования конечных устройств без mesh-функционала
- Nuxt 4 - фреймворк для Vue.js
- TypeScript - типизация
- Nuxt UI - компоненты интерфейса + Tailwind CSS v4
- Leaflet - интерактивная карта
npm installЗапуск dev-сервера:
npm run devПриложение будет доступно по адресу http://localhost:3000
-
Добавление узлов:
- Нажмите кнопку с иконкой + (режим добавления)
- Выберите тип узла: CLIENT (оранжевый), CLIENT_MUTE (синий) или ROUTER (красный)
- Кликните на карте в нужном месте
-
Перемещение узлов:
- Включите режим просмотра (иконка руки)
- Перетаскивайте маркеры на карте
-
Передача пакета:
- Кликните левой кнопкой мыши по любому узлу для начала передачи пакета от него
- Или используйте кнопку "Передать пакет" в контекстном меню узла
-
Открытие меню узла:
- На компьютере: клик правой кнопкой мыши по узлу
- На смартфоне: долгое нажатие на узел (500 мс)
-
Управление окнами контекстного меню:
- Перетаскивайте окна за заголовок с иконкой ⋮⋮
- Клик по окну выдвигает его на передний план
- Повторный клик на узел с открытым окном подсвечивает окно
-
Настройка узла (через контекстное меню):
- Лимит прыжков: от 1 до 7 (по умолчанию 3)
- Мощность: от 1 до 30 дБм (по умолчанию 20 дБм)
- Высота: от 0 до 200 метров (по умолчанию 0м)
- Дальность передачи обновляется в реальном времени при изменении мощности или высоты
- Просмотр статистики: количество переданных и принятых пакетов
- Удаление узла кнопкой с иконкой корзины
-
Глобальные настройки (в боковой панели):
- Hop Limit: количество разрешенных ретрансляций (по умолчанию 3)
- Тип узла по умолчанию: выбирается при добавлении узлов
-
Просмотр логов:
- Нажмите "Показать панель логов" в левом нижнем углу
- Следите за событиями передачи, приема, коллизий и потерь пакетов в реальном времени
-
Статистика сети:
- В правой панели отображается:
- Номер последнего отправленного пакета
- Количество узлов, получивших пакет
- Процент покрытия сети
- В правой панели отображается:
- Передача пакета: от узла расходится большой круг, визуализирующий распространение радиосигнала
- Прием пакета: вокруг узла появляется небольшой круг, быстро исчезающий - индикация успешного приема
- Цветовая кодировка узлов:
- 🟠 Оранжевый - CLIENT (клиентский узел с ретрансляцией)
- 🔵 Синий - CLIENT_MUTE (только прием, без ретрансляции)
- 🔴 Красный - ROUTER (маршрутизатор с быстрой ретрансляцией)
Симулятор использует централизованную систему логирования, которая выводит события в панель логов (в нижней части экрана) и в консоль браузера:
- Передача пакетов: информация о попытках передачи и успешных отправках
- Прием пакетов: детали о полученных пакетах с SNR и количеством хопов
- Потери пакетов: уведомления о потерянных пакетах из-за низкого SNR
- CAD операции: информация о проверках занятости канала и повторных попытках
- Ретрансляция: запланированные и выполненные ретрансляции с задержками
- Дубликаты: обнаружение и подавление повторных передач
Все сообщения логов включают:
- Тип события (info/warning/error)
- Текст сообщения
- Информацию об узле (ID, роль, состояние)
- Временную метку
# Проверка типов
npm run typecheck
# Линтер
npm run lint
# Сборка для production (SSR режим)
npm run build
# Генерация статического сайта (для GitHub Pages)
npm run generate
# Просмотр production сборки
npm run previewПроект настроен для автоматического деплоя на GitHub Pages через GitHub Actions.
- Запушьте код в репозиторий на GitHub
- Перейдите в Settings → Pages
- В разделе "Build and deployment" выберите:
- Source: GitHub Actions
- После пуша в ветку
mainавтоматически запустится workflow деплоя
Приложение будет доступно по адресу: https://<username>.github.io/<repository-name>/
Деплой можно запустить вручную:
- Перейдите в Actions → Deploy to GitHub Pages
- Нажмите "Run workflow"
Для локальной разработки с кастомным baseURL:
NUXT_APP_BASE_URL=/my-custom-path/ npm run devПрисоединяйтесь к Telegram-группе для:
- Обсуждения симулятора и mesh-сетей
- Обмена опытом моделирования
- Вопросов по проекту
- Участия в развитии проекта
Нашли баг или несоответствие? Создайте issue на GitHub - любая обратная связь приветствуется!
MIT