Руководство по регионам: управление областями сообщений в MeshCore

Обзор

Регионы - это мощная функция MeshCore, которая позволяет администраторам сети организовывать mesh-сети в логические географические или функциональные зоны. Они обеспечивают контроль над распространением сообщений (flooding) и поведением ретрансляции, позволяя тонко настраивать, какие части сети пересылают (ретранслируют) сообщения своим соседям. Регионы Meshcore введены для ограничения нагрузки на mesh-сеть. Благодаря добавлению регионов сеть будет содержать меньше ненужных переходов (хопов).

Что такое регион?

Регион — это именованная организационная единица, представляющая логическую область или группу в вашей mesh-сети. Регионы обычно называются по географическим местоположениям или функциональным зонам, например:

Структура регионов

Регионы организованы в виде иерархического дерева с отношениями родитель-потомок:

*  (wildcard — корень)
├── #Europe
│   ├── #UK
│   │   ├── #London
│   │   └── #Manchester
│   └── #France
│       ├── #Paris
│       └── #Lyon
└── #NorthAmerica
    ├── #USA
    │   ├── #NewYork
    │   └── #California
    └── #Canada
        ├── #Ontario
        └── #Quebec

Основные свойства региона

Каждый регион имеет следующие свойства:

Свойство Описание
ID Уникальный 16-битный идентификатор (назначается автоматически)
Имя Человекочитаемое имя (до 30 символов)
ID родителя Идентификатор родительского региона в иерархии
Флаги Битовые флаги, управляющие поведением (например, ALLOW/DENY flooding)

Wildcard-регион (*)

Wildcard-регион является корнем иерархического дерева. Он представляет:

По умолчанию wildcard-регион разрешает flooding (установлен флаг F).

Области регионов и транспортные коды

Что такое область региона?

Область региона (region scope) определяет, для какого региона(ов) предназначено сообщение. Это механизм, с помощью которого отправители сообщают ретрансляторам: «Это сообщение предназначено для региона Europe» или «Это сообщение предназначено для подрегиона London».

Понимание транспортных кодов

Транспортные коды — это технический механизм кодирования информации об области региона в пакетах. Каждый пакет может содержать два 16-битных транспортных кода:

uint16_t transport_codes[2];

Каждый транспортный код представляет собой криптографический хеш, вычисляемый на основе:

  1. Уникального ID региона
  2. Имени региона (с автоматически добавляемым префиксом #)
  3. Данных пакета

Как работают транспортные коды

Когда отправитель хочет отправить сообщение в пределах определённого региона:

  1. Отправитель выбирает регион (например, #Europe)
  2. Отправитель генерирует транспортный код путём хеширования ID/имени региона вместе с данными пакета
  3. Отправитель включает этот транспортный код в поле transport_codes[0] пакета
  4. Ретрансляторы в mesh-сети получают пакет
  5. Каждый ретранслятор проверяет, соответствует ли этот транспортный код одному из его настроенных регионов
  6. Если совпадение найдено И регион разрешает flooding (установлен allowf), ретранслятор пересылает пакет
  7. Если совпадение не найдено или flooding запрещён, ретранслятор отбрасывает пакет

Сопоставление транспортных кодов

Ретранслятор сопоставляет транспортный код следующим образом:

  1. Проверяет каждый регион в своей карте регионов
  2. Вычисляет, каким должен быть транспортный код для каждого региона
  3. Сравнивает его со значением transport_codes[0] пакета
  4. Если найдено совпадение, этот регион становится областью региона пакета

Пример:

Поступает пакет с transport_codes[0] = 0x1A2B
Карта регионов ретранслятора содержит:
  - #Europe (ID: 2) -> вычисляется как 0x1A2B  ✓ СОВПАДЕНИЕ!
  - #Asia (ID: 3) -> вычисляется как 0x3C4D
  - #Africa (ID: 4) -> вычисляется как 0x5E6F
Результат: пакет относится к региону #Europe

Флаг allowf: разрешение flooding

Что такое allowf?

Флаг allowf (allow flood) определяет, разрешает ли регион распространение (flooding) сообщений на соседние узлы. Это основной механизм управления поведением ретранслятора.

Состояние флага Поведение Значение
Установлен (включён) Сообщения МОГУТ ретранслироваться/распространяться Ретрансляторы пересылают сообщения для этого региона
Не установлен (выключен) Сообщения НЕ МОГУТ ретранслироваться Ретрансляторы отбрасывают сообщения для этого региона

Как ретрансляторы используют регионы и транспортные коды

Решение о пересылке пакета

Когда ретранслятор получает flood-пакет, решение о пересылке принимается по следующей логике:

1. Извлечь transport_codes[0] из входящего пакета
2. Попытаться найти регион, соответствующий этому транспортному коду
   - Использовать region_map.findMatch(packet, REGION_DENY_FLOOD)
   - Это возвращает первый регион, транспортный код которого совпадает
3. Если соответствующий регион найден:
   - Сохранить его как recv_pkt_region
   - Проверить, установлен ли флаг DENY_FLOOD
   - Если DENY_FLOOD УСТАНОВЛЕН: заблокировать пакет (не пересылать)
   - Если DENY_FLOOD НЕ УСТАНОВЛЕН: разрешить пересылку
4. Если соответствующий регион НЕ найден:
   - Проверить флаги wildcard-региона
   - Если wildcard разрешает flooding: переслать пакет
   - Если wildcard запрещает flooding: заблокировать пакет

Краткое резюме

Понятие Определение
Регион Именованная организационная зона в mesh-сети
Область региона (Region Scope) Регион, для которого предназначено сообщение, закодированный в транспортных кодах
Транспортный код 16-битный хеш, вычисляемый из ID региона и данных пакета
Флаг allowf Определяет, разрешает ли регион flooding/ретрансляцию (противоположность REGION_DENY_FLOOD)
Ретранслятор Узел, пересылающий сообщения соседям на основе области региона и настроек allowf
Wildcard-регион * Корневой/регион по умолчанию, используемый для пакетов без области

Основное правило: ретранслятор пересылает пакет тогда и только тогда, когда:

  1. Транспортный код пакета соответствует одному из настроенных на ретрансляторе регионов, ИЛИ
  2. Пакет не имеет области региона, а wildcard-регион разрешает flooding

В обоих случаях для соответствующего региона должен быть включён флаг allowf.


Основано на материалах оригинальной статьи - https://github.com/luckystriike22/meshcore_region_info/blob/main/regions_guide.md