Регионы - это мощная функция MeshCore, которая позволяет администраторам сети организовывать mesh-сети в логические географические или функциональные зоны. Они обеспечивают контроль над распространением сообщений (flooding) и поведением ретрансляции, позволяя тонко настраивать, какие части сети пересылают (ретранслируют) сообщения своим соседям. Регионы Meshcore введены для ограничения нагрузки на mesh-сеть. Благодаря добавлению регионов сеть будет содержать меньше ненужных переходов (хопов).
Регион — это именованная организационная единица, представляющая логическую область или группу в вашей mesh-сети. Регионы обычно называются по географическим местоположениям или функциональным зонам, например:
#Europe, #NorthAmerica, #Asia#London, #Paris, #NewYork#Building1, #Floor2, #OfficeA#Warehouse, #StorageFacilityРегионы организованы в виде иерархического дерева с отношениями родитель-потомок:
* (wildcard — корень)
├── #Europe
│ ├── #UK
│ │ ├── #London
│ │ └── #Manchester
│ └── #France
│ ├── #Paris
│ └── #Lyon
└── #NorthAmerica
├── #USA
│ ├── #NewYork
│ └── #California
└── #Canada
├── #Ontario
└── #Quebec
Каждый регион имеет следующие свойства:
| Свойство | Описание |
|---|---|
| ID | Уникальный 16-битный идентификатор (назначается автоматически) |
| Имя | Человекочитаемое имя (до 30 символов) |
| ID родителя | Идентификатор родительского региона в иерархии |
| Флаги | Битовые флаги, управляющие поведением (например, ALLOW/DENY flooding) |
*)Wildcard-регион является корнем иерархического дерева. Он представляет:
По умолчанию wildcard-регион разрешает flooding (установлен флаг F).
Область региона (region scope) определяет, для какого региона(ов) предназначено сообщение. Это механизм, с помощью которого отправители сообщают ретрансляторам: «Это сообщение предназначено для региона Europe» или «Это сообщение предназначено для подрегиона London».
Транспортные коды — это технический механизм кодирования информации об области региона в пакетах. Каждый пакет может содержать два 16-битных транспортных кода:
uint16_t transport_codes[2];
Каждый транспортный код представляет собой криптографический хеш, вычисляемый на основе:
#)Когда отправитель хочет отправить сообщение в пределах определённого региона:
#Europe)transport_codes[0] пакетаallowf), ретранслятор пересылает пакетРетранслятор сопоставляет транспортный код следующим образом:
transport_codes[0] пакетаПример:
Поступает пакет с transport_codes[0] = 0x1A2B
Карта регионов ретранслятора содержит:
- #Europe (ID: 2) -> вычисляется как 0x1A2B ✓ СОВПАДЕНИЕ!
- #Asia (ID: 3) -> вычисляется как 0x3C4D
- #Africa (ID: 4) -> вычисляется как 0x5E6F
Результат: пакет относится к региону #Europe
allowf: разрешение floodingallowf?Флаг 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-регион * |
Корневой/регион по умолчанию, используемый для пакетов без области |
Основное правило: ретранслятор пересылает пакет тогда и только тогда, когда:
В обоих случаях для соответствующего региона должен быть включён флаг allowf.