M
MeshTRX
Все статьи

Тесный эфир: помехи, каналы и как перевести всю группу разом

5 мин чтения

Дальность зависит не только от мощности и антенны. Есть третий участник, о котором вспоминают в последнюю очередь, — сам эфир, в котором, кроме вас, живёт много кто ещё.

Кто ещё живёт на 868 МГц

Диапазон 863–870 МГц открыт для маломощных устройств, и этим пользуются не только радиолюбители. Там работают домофоны, метеостанции, счётчики воды и электричества, автомобильные сигнализации, датчики в квартирах. В городе это заметный фон, и он неравномерный: на одной частоте тихо, на соседней постоянно кто-то щёлкает.

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

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

Первый же замер на столе показал разницу в пятнадцать децибел между самым тихим и самым шумным каналом. Это много: пятнадцать децибел — это разница между связью и её отсутствием на дальней дистанции.

Почему один канал ничего не решает

Дальше выяснилось неприятное. Найти тихий канал мало — на него нужно перевести всех: рации, которые в этот момент у других людей, и ретранслятор, который может стоять на крыше или в другом конце города.

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

Команда, которая идёт по воздуху

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

Просто оно только на словах. Вот что пришлось учесть.

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

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

Отставшему нужен путь назад. Станция, перешедшая на новый канал и никого там не услышавшая, сама возвращается на прежний. Иначе одна потерянная команда означала бы поход к устройству руками.

Где мы ошиблись

Дальше началось то, ради чего эту статью и стоит читать.

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

Из группы это пришло одной фразой: на станциях канал поменялся, на ретрансляторе нет.

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

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

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

Что из этого следует

Главный вывод не про каналы. Он про страховки.

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

Поэтому вторая версия возврата устроена иначе: разные сроки для разных ролей, явная отметка в эфире после перехода и полный отказ от возврата там, где решение принял человек.

Подробности о поиске тихого канала и смене канала у всех — в документации. Что происходит в проекте сейчас — в группе.