Всё то же самое, что делает экран радио, плюс измерительные инструменты, которыми носитель проверяли. Что делают сами действия и почему — в документе Подключить радио; здесь только как их вызвать.
Запустить узел с радио
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. Здесь они перечислены только для того, чтобы их не искали в этом файле.