Алгоритм широковещательной рассылки в Mesh-сетях

Протокол маршрутизации разработан для поддержки различных сценариев использования, включая работу с подвижными узлами. Он базируется на четырех концептуальных уровнях и использует разные подходы для общих (broadcast) и прямых (direct) сообщений.


Использование Protocol Buffers

Для обеспечения совместимости между устройствами разных производителей данные структурируются с помощью Protocol Buffers. В контексте работы сети наиболее важны типы сообщений MeshPacket и Sub-packet.


Уровень 0: Радиоканал LoRa

Все данные преобразуются в символы LoRa. В начале каждого пакета передается преамбула длиной 16 символов. Она позволяет приемникам синхронизировать часы. Такая длина выбрана для того, чтобы чипы SX126x могли дольше находиться в режиме сна для экономии энергии. За преамбулой следует физический заголовок с информацией о длине пакета и кодом синхронизации (sync word), который для данных сетей равен 0x2B.


Уровень 1: Ненадежная передача (Zero Hop)

На этом уровне происходит обычная передача пакетов без подтверждения доставки. Пакет имеет следующую структуру байтов:

СмещениеДлинаОписание
0x004 байтаID получателя: Уникальный номер узла (0xFFFFFFFF для всех)
0x044 байтаID отправителя: Уникальный номер узла-источника
0x084 байтаID пакета: Уникальный номер сообщения
0x0C1 байтФлаги: HopLimit, WantAck и др.
0x0D1 байтХеш канала: Подсказка для дешифрования
0x0E1 байтNext-hop: ID следующего узла для ретрансляции
0x0F1 байтRelay: Узел, передающий пакет в данный момент
0x10до 237 БПолезная нагрузка: Зашифрованные данные

Особенности заголовка:

  • NodeID: Формируется на основе MAC-адреса устройства.
  • Безопасность: Заголовок передается в открытом виде, чтобы радиомодуль мог фильтровать пакеты без участия центрального процессора. Шифруется только содержимое пакета (Payload).
Контроль доступа к эфиру (CSMA/CA)

Чтобы избежать столкновений сигналов, используется метод, схожий с Wi-Fi. Перед отправкой узел проверяет активность канала (CAD). Если эфир занят, узел ждет случайное количество временных слотов. Размер этого окна ожидания увеличивается при высокой загруженности сети.


Уровень 2: Надежная передача (Zero Hop)

Этот уровень обеспечивает подтверждение доставки между соседними узлами.

Если в пакете установлен флаг WantAck:

  1. Для прямых сообщений: Получатель отправляет ответный пакет подтверждения (ACK).
  2. Для широкого вещания: Чтобы не перегружать эфир массовыми подтверждениями, используется «неявное подтверждение». Отправитель слушает эфир: если он слышит, что хотя бы один соседний узел начал ретранслировать его пакет, доставка считается успешной.

Если подтверждение не получено, узел выполняет до трех повторных попыток отправки.


Уровень 3: Многоузловая маршрутизация

Управляемое лавинное заполнение (Managed Flooding)

Для общих сообщений используется метод «лавины»: каждый узел, получивший пакет, уменьшает его HopLimit (лимит переходов) и пересылает дальше.

Чтобы оптимизировать этот процесс:

  • Узлы, находящиеся дальше от отправителя (с низким показателем SNR), начинают ретрансляцию быстрее.
  • Узлы, находящиеся ближе, слышат эту ретрансляцию и отменяют свою очередь на отправку. Это позволяет сообщению быстрее распространяться на большие расстояния.
  • Устройства с ролями ROUTER и REPEATER имеют приоритет и ретранслируют пакеты в первую очередь.

Прямые сообщения и Next-Hop

Для адресных сообщений используется более умный подход. Сначала путь до цели ищется методом лавины, но система запоминает, через какой узел пришел ответ. В следующий раз пакет будет отправлен конкретно этому узлу (next-hop), а остальные участники сети не будут его дублировать. Если связь по этому пути пропадет, система автоматически вернется к методу лавины.


Регулярные интервалы передачи

Устройства автоматически рассылают служебную информацию с разной периодичностью:

  • Телеметрия: каждые 30 минут.
  • Местоположение: каждые 15 минут.
  • Данные пользователя (NodeInfo): каждые 3 часа.

Важное замечание: Если в сети становится более 40 узлов, прошивка начинает автоматически увеличивать эти интервалы, чтобы избежать «засорения» эфира. Расчет задержки производится по формуле:

$$ScaledInterval = Interval \times (1.0 + ((NumberOfOnlineNodes — 40) \times 0.075))$$

Вы не можете скопировать содержимое этой страницы