M
MeshTRX
Все статьи

Ретранслятор удваивает дальность и делит эфир

7 мин чтения

Ретранслятор кажется простым устройством: услышал пакет — повторил. На этом описания обычно и заканчиваются, а дальше начинается то, что видно только на работающей сети. Ниже — как пересылка устроена в MeshTRX, во что она обходится и почему сеть из трёх ретрансляторов не собирается сама собой.

Две защиты от лавины

Если ретранслятор просто повторяет всё услышанное, сеть умирает на втором устройстве: два ретранслятора начинают повторять друг друга, и один пакет ходит по кругу, пока кто-нибудь не выключится. Поэтому защит две, и они разные.

TTL — счётчик жизни пакета. В заголовке едет число, ретранслятор уменьшает его на единицу, и пакет с нулём дальше не идёт. В MeshTRX начальное значение равно двум: пакет проходит через два ретранслятора и останавливается. Это ограничивает глубину сети, но не защищает от дублей: два ретранслятора, слышащие один и тот же пакет, оба его повторят, и каждый повтор будет законным.

Память о переданном. От дублей спасает второе: ретранслятор помнит, что он уже пересылал, и повтор того же самого отбрасывает. Ключ памяти — отправитель, номер пакета и тип. Кольцевой кеш на 128 записей, срок жизни записи — тридцать секунд для текста и файлов и три секунды для голоса.

Почему для голоса срок другой, лучше всего объясняет ошибка, которую мы на этом допустили.

Как счётчик съедал каждую вторую фразу

Номер голосового пакета — один байт, и он сбрасывался в ноль на каждом нажатии кнопки. Казалось, что так удобнее: приёмник видит нулевой номер и понимает, что началась новая фраза.

Для ретранслятора это выглядело иначе. Он помнил переданные пакеты полминуты. Вы сказали фразу — в его памяти осели номера 0, 1, 2 и дальше. Через десять секунд сказали вторую — и её пакеты пришли с теми же номерами, от того же отправителя, того же типа. Совпадение по всем полям ключа. Вторая фраза отбрасывалась целиком, как дубль.

На стенде, где голос идёт редкими пакетами и потери исключены, это выглядит недвусмысленно:

пересланоотброшено
первая фраза10 из 100
вторая через 5 секунд0 из 1010
четвёртая через 40 секунд10 из 100

В живой сети эффект прятался за обычными потерями, и жалоба звучала как «через ретранслятор голос доходит через раз» — формулировка, по которой ничего не найдёшь.

Лечится это двумя правками. Номер стал сквозным: начало фразы приёмник узнаёт по отдельному флагу, а не по нулю. И память о голосе сократилась до трёх секунд — пакет живёт в сети доли секунды, трёх достаточно, чтобы отсечь эхо, и мало, чтобы забыть живую речь. Тридцать секунд для голоса опасны ещё и потому, что восьмибитный номер при двенадцати пакетах в секунду обходит круг за двадцать: в длинном разговоре свежий пакет совпал бы со старой записью.

Арифметика, которую стоит посчитать заранее

Теперь главное — во что пересылка обходится эфиру.

Голосовой пакет MeshTRX — 39 байт. На рабочих параметрах (SF7, полоса 250 кГц, избыточность 4/7) он занимает эфир около 53 миллисекунд. Отправляется такой пакет каждые 80 миллисекунд — этого требует кодек.

Отсюда всё и следует:

Кто в эфиреЗанято канала
одна говорящая станция67%
она же + один ретранслятор133%
+ два ретранслятора200%
+ три ретранслятора267%

Одна станция забирает две трети канала. Один повтор — и передача уже не помещается: на стенде через ретранслятор проходит около половины голосовых пакетов, и это не дефект прошивки, а деление ста тридцати трёх процентов на доступные сто.

Для речи потеря терпима: пропуск в 80 мс слышен как щелчок, а не как дыра в слове. Для файла это было бы катастрофой, поэтому файлы идут с подтверждением и дозапросом потерянных кусков — время растёт, зато доходит всё.

Почему три ретранслятора не собираются в сеть

В сообществе обсуждают треугольник: три ретранслятора на высотках, ребро четыре километра, между ними прямая видимость. Идея правильная — покрытие получается на порядок больше. Но если поставить три ретранслятора в один канал и включить, произойдёт не сеть, а взаимное глушение: 267 процентов в таблице выше.

Память о переданном здесь не поможет. Она убирает дубли, но не создаёт ёмкость: каждый ретранслятор всё равно обязан повторить чужой пакет хотя бы раз, а канал один на всех.

Значит нужно другое, и оно из двух частей.

Зоны. Станция принадлежит своему ретранслятору, и ретранслятор повторяет только своих. Тогда соседний ретранслятор не подхватывает чужой трафик, и лавина исчезает по построению, а не по счастливому стечению обстоятельств. Технически это идентификатор группы в пакете — то же поле, которое понадобится для «свой–чужой» при шифровании.

Магистраль вне общего канала. Зоны без связи между собой — это три независимые сети. Соединить их можно тремя способами, и они сильно разной цены:

  • по интернету. Ретранслятор на высотке почти наверняка окажется в сети — и тогда туннель между ретрансляторами не занимает эфир вообще и не имеет ограничений по ёмкости. Самый дешёвый вариант и самый неспортивный: сеть, которая задумывалась как независимая от инфраструктуры, в этом месте на неё опирается;
  • вторым радиомодулем. Отдельный приёмопередатчик на другом канале, направленная антенна на соседа. Честный off-grid, но это доработка железа, а не прошивки;
  • разделением по времени на одном радио. Ретранслятор часть времени слушает магистральный канал. Для текста, позиций и маяков сгодится; для голоса нет — поток непрерывный, и пропуски в нём складываются в шум.

Первый вариант проверяется за вечер, третий — тоже, второй требует железа. Начинать имеет смысл с того, что можно измерить.

Что из этого следует для практики

Три вывода, которые стоит держать в голове, ставя ретранслятор.

Он увеличивает охват, но не ёмкость. Если в вашей сети и так тесно — голос идёт, файлы ходят, — ретранслятор сделает хуже, а не лучше.

Он полезнее всего там, где иначе связи нет вовсе: на краю слышимости, за домом, в низине. Ровно поэтому его и поднимают на высокую точку — не чтобы усилить, а чтобы увидеть тех, кто друг друга не видит.

И он не бесплатен для тех, кто и так слышит друг друга напрямую: их пакеты он тоже повторит, отняв у канала те самые проценты. Зоны нужны в том числе поэтому.

Как включить ретранслятор и что показывает его страница — в документации. Числа выше получены на стенде из двух плат; замеры в поле, споры о треугольнике и всё остальное — в группе.