DOCS / сеть и радио

Радио из командной строки

Всё то же самое, что делает экран радио, плюс измерительные инструменты, которыми носитель проверяли. Что делают сами действия и почему — в документе Подключить радио; здесь только как их вызвать.


Запустить узел с радио

terminal ui \
  --passphrase P --data ~/.quiet-places --name myname \
  --rnode /dev/cu.usbserial-0001 \
  --mesh-seed "одна общая фраза сегмента"
флаг что делает
--rnode PATH подключить модем RNode по этому пути. Именно путь, без префикса serial:
--mesh-seed "…" фраза сегмента, минимум 16 символов
--no-lan не искать никого по локальной сети
--no-browser не открывать браузер (для headless)
--port N порт локального API и интерфейса
--data DIR папка данных; она заблокирована на один процесс

Два правила, которые сборка проверяет и объясняет отказом:

  • --rnode без --mesh-seed — отказ. Сегмент — это то, что делает два радио одним сегментом; без него ни один кадр не проверится.
  • --rnode и --mesh вместе — отказ. Это два разных радио, а узел подключает одно.

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


Через локальный API

Узел печатает свой токен при старте (token=… в логе). Дальше — обычный curl с заголовком:

T=<токен>; U=http://127.0.0.1:8801
A(){ curl -s -H "X-QP-Token: $T" "$@"; }
действие вызов
что на портах A -X POST $U/api/gateway/scan
подключить радио A -X POST $U/api/radio/attach -d '{"port":"/dev/cu.usbserial-0001","phrase":"…"}'
подключить, когда сегмент уже известен то же с "phrase":""
отключить и забыть A -X POST $U/api/radio/detach
объявить себя в эфире A -X POST $U/api/radio/announce
кого слышно A $U/api/radio/neighbours
проба, а потом приглашение A -X POST $U/api/radio/meet -d '{"device":"<device id>"}'
пригласить в конкретное пространство A -X POST $U/api/radio/invite -d '{"space":"<hex>","device":"<hex>"}'
что ждёт моего ответа A $U/api/radio/invitations
принять A -X POST $U/api/radio/invitations/accept -d '{"id":"<hex>"}'
состояние радио A $U/api/status → поле radio
экран радио целиком A $U/api/gateway

/api/radio/meet — одна ручка на два действия, и она сама решает, какое сейчас уместно: если линка нет, уходит проба в один кадр (в ответе state: probing); если линк есть — уходит приглашение (в ответе space). Смысл этого разделения — в документе Подключить радио.


Измерительные инструменты

Три уровня, ровно те, которыми проверяли носитель (Радио в quite.space). Каждый отвечает на свой вопрос и не отвечает на чужой.

rnode-probe — одна плата крупным планом

Единственный инструмент здесь, который намеренно не делит ни строчки кода с драйвером: когда носитель ничего не доставляет, драйвер — подозреваемый.

rnode-probe -dev /dev/cu.usbserial-0001

Открывает порт напрямую, настраивает радио и печатает каждый KISS-кадр, который видит, расшифровывая известные. Полезные флаги: -send — передать пробный кадр после настройки; -watch 20s — сколько слушать; -freq/-bw/-sf/-cr/-txp — физика.

Чем это ценно: у RNode есть состояние «настройки приняты, радио не включилось». Без такого взгляда оно неотличимо от «вокруг никого» — и это была самая дорогая по времени ошибка во всей работе с радио.

rnode-baseline — доходит ли один кадр

Уровень носителя и ничего больше: по одному самодостаточному пронумерованному пакету, ничего не фрагментируется и не пересобирается.

rnode-baseline \
  -a /dev/cu.usbserial-0001 -b /dev/cu.usbserial-9 \
  -count 30 -interval 3s

Печатает долю доставленных, p50/p95, отказы модема и номера потерянных пакетов, и заканчивает словами PASSES или DOES NOT PASS — порог 98% доставки при нуле отказов. Порог записан в самой программе, потому что критерий, который никто не записал, не заканчивается ни «да», ни «нет».

Зачем разделять этот уровень и следующий:

кадры доходят, а сообщения нет   → виновато то, что ВЫШЕ:
                                   фрагментация, сборка, синхронизация
кадры не доходят                 → строить надёжность поверх нечего

rnode-transfer — доходит ли сообщение

Целые передачи: фрагментация, окно выборочного повтора, SACK’и, сборка. Собирает эндпоинты ровно так же, как это делает узел, — то есть меряет форму продакшна с другим носителем под ним.

rnode-transfer \
  -a /dev/cu.usbserial-0001 -b /dev/cu.usbserial-9 \
  -reps 2 -trace /tmp/transfer.trace

В выводе — таблица по размерам: сколько кадров, сколько передач пришло целыми, медианное время. Заголовок — complete_transfer_rate, и рядом с ним «layer says»: то, что насчитал сам слой. Эти два числа могут расходиться, и расхождение честное — слой считает подтверждённые завершения, а сообщение может прийти байт-в-байт и остаться неподтверждённым. Гейт строгий: любая передача, пришедшая повреждённой, проваливает прогон целиком, какой бы ни была доля.

Полезные флаги: -size N — только один размер; -window, -ack, -gap — переопределить параметры слоя (по умолчанию — продакшновые); -between — тишина между передачами.

Живой прогон целиком

В репозитории с исходниками есть готовый скрипт scripts/radio/livegate.sh. Он прогоняет обе половины продуктового сценария через API, без единого клика: шесть пространств, знакомство по радио, приглашение, текст в обе стороны без реле — и отдельно проверку отказа интернета, когда установленная через реле связь продолжается по эфиру и ничего не задваивается при его возвращении.

Пути к платам зашиты в начале скрипта — поправьте под свои. Папка прогона задаётся QUIET_GATE_DIR.

Трассировка слоя передачи

QUIET_RADIO_TRACE=/tmp/alice.trace terminal ui

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


Инструменты для Meshtastic

Все они — про другой носитель. С платой, прошитой в RNode, они работать не будут: terminal radio list ищет узлы Meshtastic и модем радиом не назовёт.

команда что делает
terminal radio list что на каждом последовательном порту
terminal radio flash поставить на плату Meshtastic (стирает её)
terminal radio region прочитать или задать регион и пресет
quiet-radio прочитать конфигурацию, сверить с профилем, снять снимок, восстановить
terminal meshhub поддельная сеть Meshtastic локально — отладка без железа

Подробно — в документе путь Meshtastic. Здесь они перечислены только для того, чтобы их не искали в этом файле.