Протокол маршрутизации разработан для поддержки различных сценариев использования, включая работу с подвижными узлами. Он базируется на четырех концептуальных уровнях и использует разные подходы для общих (broadcast) и прямых (direct) сообщений.
Использование Protocol Buffers
Для обеспечения совместимости между устройствами разных производителей данные структурируются с помощью Protocol Buffers. В контексте работы сети наиболее важны типы сообщений MeshPacket и Sub-packet.
Уровень 0: Радиоканал LoRa
Все данные преобразуются в символы LoRa. В начале каждого пакета передается преамбула длиной 16 символов. Она позволяет приемникам синхронизировать часы. Такая длина выбрана для того, чтобы чипы SX126x могли дольше находиться в режиме сна для экономии энергии. За преамбулой следует физический заголовок с информацией о длине пакета и кодом синхронизации (sync word), который для данных сетей равен 0x2B.
Уровень 1: Ненадежная передача (Zero Hop)
На этом уровне происходит обычная передача пакетов без подтверждения доставки. Пакет имеет следующую структуру байтов:
| Смещение | Длина | Описание |
0x00 | 4 байта | ID получателя: Уникальный номер узла (0xFFFFFFFF для всех) |
0x04 | 4 байта | ID отправителя: Уникальный номер узла-источника |
0x08 | 4 байта | ID пакета: Уникальный номер сообщения |
0x0C | 1 байт | Флаги: HopLimit, WantAck и др. |
0x0D | 1 байт | Хеш канала: Подсказка для дешифрования |
0x0E | 1 байт | Next-hop: ID следующего узла для ретрансляции |
0x0F | 1 байт | Relay: Узел, передающий пакет в данный момент |
0x10 | до 237 Б | Полезная нагрузка: Зашифрованные данные |
Особенности заголовка:
- NodeID: Формируется на основе MAC-адреса устройства.
- Безопасность: Заголовок передается в открытом виде, чтобы радиомодуль мог фильтровать пакеты без участия центрального процессора. Шифруется только содержимое пакета (Payload).
Контроль доступа к эфиру (CSMA/CA)
Чтобы избежать столкновений сигналов, используется метод, схожий с Wi-Fi. Перед отправкой узел проверяет активность канала (CAD). Если эфир занят, узел ждет случайное количество временных слотов. Размер этого окна ожидания увеличивается при высокой загруженности сети.
Уровень 2: Надежная передача (Zero Hop)
Этот уровень обеспечивает подтверждение доставки между соседними узлами.
Если в пакете установлен флаг WantAck:
- Для прямых сообщений: Получатель отправляет ответный пакет подтверждения (ACK).
- Для широкого вещания: Чтобы не перегружать эфир массовыми подтверждениями, используется «неявное подтверждение». Отправитель слушает эфир: если он слышит, что хотя бы один соседний узел начал ретранслировать его пакет, доставка считается успешной.
Если подтверждение не получено, узел выполняет до трех повторных попыток отправки.
Уровень 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))$$