наверх

Рация Duga

Полная инструкция пользователя для плат Heltec V3, Heltec V4 и Heltec T114. Сборки прошивки: V3 и V4 — 38, T114 — 97.

без интернета радиосвязь LoRa Bluetooth Wi-Fi у V3/V4 почта между рациями

1. Что это за вещь и что она умеет

Duga — это рация без интернета. Две платы слышат друг друга напрямую по радио (LoRa, диапазон 868 МГц и близкие к нему по региону), без вышек сотовой связи и без роутера между ними. У платы есть экран, одна кнопка, Bluetooth для телефона, а у Heltec V3 и Heltec V4 — ещё и Wi-Fi.

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

Письма — да. Интернета — нет. Вот почему

Если платы V3 или V4 подключить к домашнему Wi-Fi с интернетом, они смогут пересылать письма (Reticulum) через сервер в интернете и дальше — в поле, по радио, на вторую плату. Это работает. А вот открыть страницу браузера через рацию — нельзя, и это не недоделка, а голая арифметика радиоканала:

ВеличинаЗначениеОткуда
Скорость канала на умолчаниях (SF 8, полоса 125 кГц, код 4/5) 8 × 125000 / 256 × 4/5 = 3125 бит/с ≈ 391 байт/сиз кода прошивки
Законный предел эфира на 868 МГцне больше 1% временирегуляторное требование, зашито в прошивку
Реальная скорость с учётом предела1% от 391 байт/с ≈ 3.9 байта в секундурасчёт
Обычная веб-страница с картинками, ≈100 КБ 102400 / 3.9 ≈ 26 256 с ≈ 7.3 часа на одну страницурасчёт
Одно письмо в 200 байт (режим «Обычный», SF 8)≈51 секунда эфира на письмо, дальше — молчать в сто раз дольшерасчёт из кода
То же письмо в режиме «Быстрый» (SF 7, 250 кГц)≈15 секунд на письморасчёт из кода

Минута на сообщение — это плохо для чата и отлично для связи там, где нет никакой другой связи вообще. Плата честно говорит об этом в трёх местах: при включении (в самопроверке), на экране «шлюз» (строка только письма) и в подсказке меню под пунктом «Шлюз» (сайтов не будет).

Не обещайте себе браузер через рацию. Плата дома, подключённая к Wi-Fi с интернетом, донесёт письмо до сервера и обратно в эфир — но не «интернет» в привычном смысле. Это физика радиоканала, а не то, что можно исправить прошивкой.

Что рация умеет — коротко

2. Три платы: чем отличаются

Duga выпускается на трёх платах. У них общая логика меню и радио, но разное железо — и поэтому разные возможности.

Heltec V3Heltec V4Heltec T114
КристаллESP32-S3ESP32-S3nRF52840
ЭкранOLED 128×64, чёрно-белыйOLED 128×64, чёрно-белыйцветной, 135×240
Имя платы на экранеHeltec V3Heltec V4— (не печатается)
Мощность передатчика22 дБм у микросхемы 22 дБм у микросхемы + усилитель KCT8103L, около 28 дБм на антенне
Wi-Fiестьестьнет как явления
Шлюз в Reticulumестьестьнет
BluetoothBLE (NimBLE), сопряжение с кодомто жеBLE (Bluefruit)
Разъём GPSнет вовсеесть (L76K)есть (L76K)
Свободных контактов7 (пять с АЦП)3 (один с АЦП)— (см. раздел 14)
Шкала АЦП0…40950…40950…1023
Порт USBотдельная микросхема CP2102 — порт всегда на месте порт создаёт сам кристалл; при сбросе исчезает и возвращается через секунду
V3 и V4 внешне почти неотличимы, а прошивки у них разные. Плата V4 с залитой на неё прошивкой V3 поднимется, отчитается об успехе и не включит усилитель мощности — её просто никто не услышит на том расстоянии, на которое она рассчитана. Поэтому имя платы стоит и на заставке при включении, и на странице «о плате»: сверяйте его после прошивки.

3. Первое включение

Включите плату (кнопка питания на самой плате, если она есть, либо просто подайте питание по USB). Первое, что произойдёт, — заставка на экране, а следом плата сама поднимет радио, Bluetooth и, у V3/V4, Wi-Fi.

Заставка

Висит две с половиной секунды и убирается любым нажатием кнопки (само нажатие при этом страницу не листает — оно только гасит заставку).

Если прошлый подъём встал на какой-то ступени, вместо имени платы будет написано, например, стоп: экран — это не поломка новой попытки, а память о прошлой (подробно — в разделе «Если что-то пошло не так»).

Самопроверка (для тех, кто подключил провод к компьютеру)

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

Строка отчёта«да» означает«НЕТ» означает
экран SSD1306отозвался по адресу 0x3Cмолчит: проверьте питание Vext и шину I2C
свободные контактысписок выводов поднят, ни один не занят ничем другим— (эта строка всегда «да»)
книжка ключейподнята, известно сколько знакомыхиспорчена / обрублена / не та раскладка — знакомиться заново
радио SX1262поднялось и слушаетне отозвалось, антенный переключатель не настроился, приём не включился
батареянапряжение в пределах литиевой банкиноль (или банки нет — от USB это норма), либо делитель разомкнут/замкнут не так, либо банка ниже нормы
кнопка PRGсвободна или сейчас нажата— (всегда «да»)
усилитель V4 (только на V4)KCT8103L поднят, выводы включены— (проверить напрямую нечем — сказано честно «включён», а не «работает»)

В конце отчёта — три полезные строки:

Тот же отчёт можно затребовать позже командой 0xAB — например, на V4, где порт при сбросе на секунду исчезает и легко пропустить вывод. Команда не измеряет заново, а повторяет то, что было измерено при включении, — это сказано в заголовке самого отчёта.

4. Экран и кнопка (Heltec V3 / V4)

У платы один экран (128×64 точки, чёрно-белый) и одна кнопка — она же PRG, она же BOOT. Всё управление — короткое и длинное нажатие этой одной кнопки.

Разметка экрана

Экран построен из трёх полос по высоте, и это не произвольный выбор, а арифметика шрифтов:

СтрокиЧто там
0–14 (15 точек)шапка: имя страницы слева, значки справа
15разделительная черта во всю ширину
17–61 (45 точек)поле страницы — крупная величина и подпись под ней (третьей строки арифметически не помещается; если нужно три строки, все они идут мелким шрифтом на высотах 17, 32, 47)
62–63точки текущей страницы

Значки в шапке

МестоЗначокКогда виденСмысл
x = 2имя страницывсегдакакая страница сейчас открыта
x = 84Wтолько когда Wi-Fi включён обычная буква — своя точка доступа; буква навыворот (белая плашка) — плата ушла в домашнюю сеть. У T114 значка нет — там нет Wi-Fi
x = 99Э (R)только когда включена эстафетаплата повторяет чужие кадры в эфир
x = 110BTвсегда, разными видами перечёркнут — Bluetooth выключен; обычный — включён; навыворот — идёт сопряжение или телефон подключён

Bluetooth показывается даже выключенным, а «Э» и «W» — только включёнными, потому что Bluetooth включён у платы из коробки, и его пропажа — это уже беда; эстафета и Wi-Fi выключены из коробки, и их появление означает, что человек сам что-то включил. Показывать стоит то, что отличается от обычного. Заряда батареи в шапке нет — он живёт на своей странице «питание».

Точки страниц

Внизу экрана — ряд прямоугольников: широкий (6 точек) — текущая страница, узкие (2 точки) — остальные. Точек ровно столько, сколько страниц в круге сейчас: страницы «Wi-Fi», «шлюз» и «где я» появляются и пропадают из круга сами, когда включена или выключена соответствующая возможность.

Круг страниц по порядку

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

Страница 1 — «связь» (link)

Крупно — состояние одним словом: ЗАГРУЗКА, В СЕТИ, ЖДЁТ (нужен телефон), СВЯЗЬ (идёт сопряжение), НЕТ РАДИО, ОБНОВЛ. (не выключайте), ТИШИНА (приём был и пропал). Под словом — либо короткое пояснение, либо, если пояснения нет (обычная работа), — пять полосок сигнала и число дБм справа.

Страница 2 — «сигнал» (signal)

Крупно — число и единица вместе, например -119 дБм. Мелко под ним — качество N (это SNR, отношение сигнал/шум). Если приёма ещё не было — крупно НЕТ, мелко приёма не было. Полосок сигнала на этой странице нет — не помещаются вместе с числом и подписью.

Страница 3 — «рядом N» (near N)

N в шапке — число соседей. Поле — до трёх строк: номер платы (четыре шестнадцатеричные цифры), уровень сигнала в дБм, давность — сколько назад слышали. Свежие соседи идут первыми. Список честен: строится только по собственным маячкам «я здесь» соседних плат, где номер платы идёт открытым текстом — по чужому зашифрованному письму Reticulum плата не может сказать, чьё оно.

Страница 4 — «принято» (received)

Крупно — число пакетов, мелко под ним — байты (после миллиона — в КБ, где килобайт равен 1024 байтам). Порядок именно такой (пакеты крупно, байты подписью) — исправление ошибки старой рации T114: там крупно стояли байты, и человек читал их как число сообщений и ошибался на порядок.

Страница 5 — «питание» (power)

Крупно — заряд в процентах, либо НЕТ, если измерить нечем (ноль здесь был бы враньём — плата может питаться от USB). Мелко — одна величина, выбранная по важности: от провода (если питание внешнее), N ч ещё (если остаток часа и больше), N мин ещё (меньше часа), либо напряжение, 3.9 В (и температура, если есть датчик), либо нет батареи (если на выводе меньше 2500 мВ). Полосы заряда на этой странице нет — на чёрно-белом экране она была бы вторым изображением того же самого числа.

Страница 6 — «радио» (radio)

Крупно — частота с единицей, мелко под ней — SF N полоса кГц. Мощности здесь нет намеренно: платы с разной мощностью друг друга слышат, а платы с разным SF — нет, поэтому именно SF и полоса важны для связи, а мощность — не про совместимость, её видно в самопроверке при включении.

Страница 7 — «эфир» (air time)

Крупно — занятость эфира в процентах за последний час, с одним знаком после запятой. Мелко — режим отношения к закону: по закону: ждёт (заняли уже 1% и ждём), по закону: 1% (ещё есть запас), предупредили / скажем у 1% (режим «предупреждать»), без узды (границ нет). «Ждёт» относится только к своему маячку и эстафете — тревога, маяк спасения, ответ хозяину и то, что человек послал сам, уходят даже при достигнутом пределе.

Страница 8 — «журнал» (log)

Три строки: слева — имя события, справа, прижато к краю, — давность. Свежее сверху. Записей в памяти ровно три. Дословные имена событий: включена, радио, телефон +, телефон -, сопряж., моя тревога, чужая SOS, режим, частота, антенна, сосед, копилка. Пустой журнал: крупно ПУСТО, мелко ничего не было.

Страница 9 — «о плате» (about)

Три строки: номер платы в эфире (шестнадцатеричный), номер сборки и дата, и какая это плата. Номер платы — единственное число, по которому две рации узнают друг друга: оно же в маячке «я здесь», оно же в списке «рядом» у соседа, оно же в имени Wi-Fi-сети и Bluetooth.

Страница 10 — «Wi-Fi»

Появляется в круге только пока поднята своя точка доступа. Крупно — пароль точки, восемь цифр (ведущие нули не теряются — пароль хранится строкой). Мелко под ним — имя сети, ещё ниже — адрес панели. Страница исчезает, если плата ушла в домашнюю сеть: показывать ключ от несуществующей двери хуже, чем не показывать ничего.

Страница 11 — «шлюз» (gateway)

Появляется, только когда шлюз включён. Строка 1 (прописными) — состояние: ВЫКЛ, НЕТ СЕТИ, ИЩЕМ, В СЕТИ. Строка 2 — то, что нужно именно сейчас: подсказка что включить, либо адрес платы в домашней сети (единственное место, где его вообще можно прочесть через неделю после установки), либо, если очередь занята, — эфир занят или число писем в очереди. Строка 3 стоит всегда: только письма — граница-напоминание, что это не браузер.

Страница 12 — «где я» (where am I)

Появляется, только когда включён модуль GPS и страница не отключена. У платы V3 разъёма GNSS нет вовсе — на ней этот файл даже не собирается в прошивку, и страница никогда не появится. У V4 разъём есть (модуль L76K). Пока модуля нет — крупно ВЫКЛ; пока ищет спутники — ИЩУ, мелко число спутников; когда точка есть — широта крупно, долгота мелко, по пять знаков после точки — «в таком виде число вбивается в карту как есть».

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

Перебивающий экран — «ПРИЁМ»

Показывается пару секунд сразу после принятого пакета и уходит сам, не дожидаясь нажатия. Верхняя полоса залита белым, на ней чёрными буквами — ПРИЁМ дБм, ниже, во весь экран — число RSSI самым крупным шрифтом прошивки (45-й кегль — он используется только тут).

Кнопка: короткое и длинное нажатие

Граница короткого и длинного нажатия — 600 мс. Длинное нажатие срабатывает, не дожидаясь отпускания кнопки — иначе человек держит кнопку и не знает, сработало ли уже. Нажатие короче 30 мс считается дребезгом и не считается вовсе.

ГдеКороткоДолго
обычная страницаследующая страница по кругуоткрыть меню
менюследующий пункт по кругувыбрать
список / вопросследующий вариантпринять
экран параметровизменить значениеследующий параметр
экран погашентолько зажигает, ничего не выбираеттоже только зажигает
заставкаубрать заставку (страницу не листает)убрать заставку
экран кода сопряженияубрать код (сопряжение не отменяется)тоже убрать код
ввод пароля знакомства+1 к цифре под курсоромследующая цифра, с восьмой — начать знакомство
работающая тревоганичего (нарочно)отбой тревоги
вопрос (тревога, маяк, завод, круг, приглашение)«нет» / отказ«да» / согласие
чужая тревога на экранеубрать сообщение (вернётся, если маячок придёт снова)то же
проверка дальностисменить роль (шлём ↔ приём), счёт начинается занововыйти
проверка антеннызакрытьзакрыть

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

Как гаснет экран и как будится

Минута без нажатий — экран гаснет (то же число, 60000 мс, что и у T114: «минута» здесь не число, а обещание пользователю). Экран не гаснет, пока: висит заставка; показан код сопряжения (шесть цифр, которые человек прямо сейчас набирает в телефоне); держится чужая тревога; идёт своя тревога или висит вопрос о ней.

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

Экран сам зажигается ровно от одного события — чужой тревоги. Обычный принятый пакет экран не зажигает: человек гасил экран, чтобы тот не светил, а не чтобы светил пореже.

Погасить руками — пункт меню «Погасить экран». Разбудить — любое нажатие, либо с телефона настройкой 31 (только на T114 — у ESP-плат такой настройки нет, там дистанционного пробуждения не сделано).

Признак того, что плата жива при погашенном экране: светодиод мигает раз в две секунды — так и написано в самопроверке при включении.

Долгое нажатие на любой обычной странице открывает меню. Список занимает весь экран, видно три строки сразу. Выбранная строка инвертируется целиком (белая плашка, чёрные буквы) — стрелки слева нет намеренно, она отняла бы столбец точек у каждой строки. Справа, если пунктов больше трёх, — узкая полоска прокрутки. Внизу, на высоте 47, — подсказка мелким шрифтом, по умолчанию долго — выбор.

Полный список пунктов по порядку

#Имя (RU)Имя (EN)ХвостЧто делает долгое нажатие
1ЯркостьBrightness1/4…4/4Меняет ступень контраста по кругу (20, 80, 160, 255 — из коробки самая яркая). Меню не закрывается.
2Погасить экранScreen offЗакрывает меню и гасит экран. Будится любым нажатием.
3BluetoothBluetoothвкл / выклПереключает Bluetooth без вопроса «точно?». Меню не закрывается.
4СопряжениеPairingСначала включает Bluetooth, если был выключен, затем забывает все прежние пары. Меню закрывается. Код появится сам, когда его попросит телефон.
5ДальностьRange testОткрывает проверку дальности с роли передатчика.
6АнтеннаAntennaЗапускает проверку антенны (двенадцать замеров шума).
7МаячокBeaconвкл / выклВключает/выключает маячок «я здесь» (раз в 2 минуты). Из коробки включён.
8ЭстафетаRelay hopвкл / выклПовтор чужого кадра в эфир. Из коробки выключена.
9ТревогаAlarmОткрывает вопрос «подать сигнал?».
10РегионRegionимя страны или частотаОткрывает список регионов.
11Свои каналыMy channelsОткрывает список из трёх ячеек.
12ПочтаCourierвыкл / память / флешПеребирает три состояния почтальона по кругу.
13Знаком.Introduce120с…1с, иначе выклВключает/выключает знакомство по радио на две минуты.
14ПарольPasswordОткрывает ввод восьми цифр — знакомство по паролю. Плата сама предлагает случайные восемь цифр.
15ЗнакомыеKnownОткрывает список знакомых из книжки ключей.
16Круг своихMy circleОткрывает страницу круга.
17Режим радиоRadio modeОткрывает вопрос о смене режима.
18МАЯК SOSSOS BEACONвкл / выклОткрывает вопрос о маяке спасения.
19Ретранс.Repeaterвкл / выклОбряд «плата на столбе»: эстафета и маячок подняты, почта в память, Bluetooth снят, экран погашен. Без подтверждения.
20ЯзыкLanguageRU / ENОткрывает список языков.
21ПараметрыParametersОткрывает редактор шести ручных параметров.
22Wi-FiWi-Fiвыкл / вкл / точка / дом / число гостейПереключает Wi-Fi по кругу. Меню не закрывается.
23ШлюзGatewayвыкл / нет сети / ищем / в сетиПереключает шлюз. Меню не закрывается.
24ЭфирAirtimeпо закону / предупр. / без уздыПеребирает три режима отношения к закону по кругу.
25Поднять всёFull startЗабывает счёт неудачных подъёмов и сразу перезагружает плату. Без подтверждения — действие ничего не теряет.
26К заводскомуFactory resetОткрывает вопрос «стереть всё?».
27ПерезагрузкаRestartГасит экран, закрепляет почту во флеш и перезагружает плату.
28ВыходExitЗакрывает меню.

Хвосты-переключатели нужны потому, что «Эстафета» сама по себе не говорит, включит нажатие или выключит, и человек жмёт наугад. Хвост у пункта «Знаком.» — оставшиеся секунды, а не «вкл»: «вкл» у пункта, который через минуту сам станет «выкл», человек прочтёт как заевшую кнопку.

Подсказки внизу экрана меню — дословно

Обычная подсказка — долго — выбор. На четырёх пунктах она заменяется на более полезную:

ПунктСостояниеПодсказка внизу
Wi-Fiрежим домашней сетиимя домашней сети, либо «сеть не задана»
поднята своя точкакод 12345678 — единственное место в прошивке, кроме страницы «Wi-Fi», где виден пароль точки
Wi-Fi выключенпанель в сети
Шлюзвключёнсайтов не будет
выключенписьма серверу
Эфирвсегдаживое измерение, например 0.3% из 1% (в законном режиме) или 0.3% за час (в остальных двух)
Почтанесём письманесу N
флеша нет, режим не «флеш»флеша нет
иначецена состояния: «чужое не носим» / «в памяти, спасу» / «во флеш, износ»

Экраны, которые открываются из меню

Выбор региона

Список тем же видом, что и меню. У текущего региона — галочка «✓». Подсказка внизу — главное слово экрана: менять у ВСЕХ! — регион уводит рацию на другую частоту, и пока туда не перейдут остальные, связи не будет.

РегионЧастота, кГц
RU 868868900
EU 868869525
EU 433433875
US 915915000
ANZ 915915000
CN 470470000
JP 923923000
KR 920921900
IN 865866000
TW 923923000

Ручные параметры

Список из шести строк «имя — значение», окно прокрутки на три строки: SF, Полоса, Кодир., Мощн., МГц, кГц. Подсказка внизу: коротко менять.

Это единственный экран прошивки, где кнопка работает иначе: короткое нажатие меняет значение, длинное переходит к следующему параметру.
ПараметрДопустимые значения (по кругу)
SF5, 6, 7, 8, 9, 10, 11, 12
Полоса, кГц62, 125, 250, 500
Кодирование5, 6, 7, 8 (то есть 4/5…4/8)
Мощностьот 2 дБм шагом 2 до предела платы (22 дБм), затем снова с 2
МГцпо кругу 150…960 (весь диапазон SX1262)
кГцшаг 100, по кругу 0…900

Свои каналы

Три строки: «Свой 1», «Свой 2», «Свой 3». Занятая ячейка подписана частотой (Свой 1 868.9), пустая — Свой 1 пусто. Долгое нажатие открывает экран действия с ячейкой:

Подписи снизу: у «ОТМЕНА» — «как было»; у «ВКЛЮЧИТЬ» — что лежит в ячейке или «ячейка пуста»; у «ЗАПИСАТЬ» — что именно ляжет (нынешние настройки радио).

Выбор языка

Список из двух строк, каждая написана на своём языке; у текущего — галочка «✓».

Вопрос о смене режима радио

РежимSFПолосаКодПримечание
Дальний (Far)12125 0004/8
Обычный (Normal)8125 0004/5умолчание
Быстрый (Fast)7250 0004/5
Спасение (Rescue)1231 2504/8в меню не предлагается — только маяком SOS или по проводу

Круг своих

Крупно — восьмизначная метка круга (шестнадцатеричная), мелко — сверьте вслух или был чужой круг. Если круга нет: крупно НЕТ, мелко заведётся при знакомстве.

Знакомые (книжка ключей)

Список до восьми строк: номер знакомого, и если помечен «беречь» — приписка « берегу». Если знакомых нет: крупно НЕТ, мелко меню «Пароль». Долгое нажатие на знакомом открывает вопрос: отмена / БЕРЕЧЬ / ЗАБЫТЬ — порядок начинается с отмены нарочно: первое долгое нажатие не должно стирать ключ. «Забыть» стирает ключ насовсем и сразу кладёт книжку во флеш: «рацию теряют, а не выключают».

Вопрос «к заводскому»

Крупно: СТЕРЕТЬ ВСЁ. Мелко: знакомства, круг, почта. Заводской сброс необратим — читайте раздел «Если что-то пошло не так» перед тем как соглашаться.

6. Подключение телефона по Bluetooth

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

Имя платы в списке телефона

Плата видна как Duga XXXX, где XXXX — четыре шестнадцатеричные цифры заводского номера платы (то же самое число, что на странице «о плате», в маячке «я здесь» и в имени Wi-Fi-сети).

Как подключить телефон — по шагам

  1. Включите плату. Bluetooth поднимается сам, спрашивать не нужно.
  2. В телефоне найдите в списке Bluetooth-устройство Duga XXXX.
  3. Телефон запросит код. В этот момент плата сама покажет шесть цифр на экране — поверх любой страницы, экран при этом зажжётся, если был погашен.
  4. Наберите эти шесть цифр в телефоне.
  5. Значок BT в шапке страниц станет навыворот (белая плашка) — телефон подключён.
Плата — то единственное устройство ввода-вывода в этой паре, поэтому код показывает плата, а набирает человек в телефоне (режим passkey entry). Значения 0 и 123456 исключены из генератора нарочно.

Если сопряжение не идёт — откройте меню и выберите пункт «Сопряжение»: он включит Bluetooth (если был выключен) и сотрёт все прежние пары. Это нужно, в частности, после перепрошивки: плата ключи потеряла, а телефон свою запись помнит и предъявляет старый ключ — Android при этом честно ошибается и говорит «неверный PIN-код» про код, который на самом деле верен.

Значения значка BT в шапке

ЧислоСостояниеКак выглядит
0выключенBT перечёркнутое
1включёнBT обычное
2идёт сопряжениеBT навыворот (но на V3/V4 в этот момент виден отдельный экран кода)
3телефон подключёнBT навыворот

Что заперто до сопряжения

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

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

Если экрана нет (нестандартная сборка без дисплея) — код показать негде, и он один на всё время работы платы. В порт печатается: ЭКРАНА НЕТ — код сопряжения показывать негде. код на всё время работы платы: 482913. запишите его: после перезагрузки он будет другим.

Выключить Bluetooth

Отдельной настройки-выключателя для Bluetooth в списке настроек нет — переключить можно только пунктом меню «Bluetooth». Его же полностью снимает режим ретранслятора. При бережном подъёме (две неудачи подряд) Bluetooth пропускается, и в порт печатается: Bluetooth ПРОПУЩЕН: бережный подъём.

7. Wi-Fi (только Heltec V3 / V4)

У T114 Wi-Fi нет как явления — у кристалла nRF52840 нет такого радио вовсе. Всё, что ниже, касается только V3 и V4.

Три режима — переключаются одним пунктом меню по кругу

выкл  →  своя точка  →  домашняя сеть  →  выкл

Третье состояние («домашняя сеть») появляется в круге только тогда, когда домашняя сеть уже задана. Пока не задана — состояний два: выкл/вкл.

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

Своя точка доступа

Имя сетиDuga XXXX — «Duga», пробел, четыре шестнадцатеричные цифры номера платы
Пароль8 цифр, рождается сам при первом подъёме точки, потом хранится строкой (ведущие нули не теряются)
Адрес панели192.168.4.1

Где увидеть пароль своей точки — ровно в трёх местах: на странице круга «Wi-Fi» (крупно, восемью цифрами), в подсказке под пунктом меню «Wi-Fi» (код 12345678) и в порту при включении. Больше нигде.

Плата умеет портал захвата (captive portal): она отвечает на проверки телефона своей панелью, поэтому iPhone сам предложит открыть окно входа в сеть, и адрес набирать не придётся. Если окно закрыть — панель открывается руками, по адресу http://192.168.4.1/.

Домашняя сеть

Имя и пароль домашней сети задаются в панели или командой по проводу 0xAC. Одной кнопкой на плате их не задать — кнопка одна, а пароль бывает в шесть десятков знаков.

Пароль домашней сети никогда не выходит из платы — ни на экран, ни в порт, ни по радио. Наружу отдаётся только его длина (настройка 71).

Адрес, который выдал роутер, читается тремя способами: на экране страницы «шлюз» (вторая строка), в панели, и в порту при включении.

Настройки Wi-Fi по номерам

СмыслЗначения
43Wi-Fi включён0/1. У T114 этого номера нет и не будет.
44пароль точки доступа числомтолько чтение (ведущий ноль в числе теряется — читайте лучше страницу «Wi-Fi» на экране)
70режим Wi-Fi0 своя точка, 1 домашняя сеть
71длина пароля домашней сетичтение; запись разрешена ровно одна — ноль: «забудь сеть»

8. Шлюз в интернет-сервер (только Heltec V3 / V4)

Шлюз — это мост между радиоэфиром и сервером Reticulum в интернете. Плата дома подключается к домашнему Wi-Fi, оттуда — к серверу, и всё, что она слышит в эфире, уносит на сервер, а всё, что приходит с сервера, отдаёт в эфир.

Что даёт шлюз: письма (Reticulum) с рации в поле — до сервера в интернете и обратно.
Чего не даёт: «доступ в интернет» в смысле «открыть страницу в браузере». Причина и арифметика — в разделе 1.

Как включить

Пункт меню «Шлюз» (или настройка 61). Меню при этом не закрывается — хвост строки меняется на глазах: нет сети → ищем → в сети. Шлюзу нужна домашняя сеть, поэтому пункт «Wi-Fi» стоит соседней строкой: чаще всего «нет сети» лечится именно им.

Состояния шлюза

ИмяЗначит
0ВЫКЛчеловек не включал
1НЕТ СЕТИWi-Fi выключен или плата не в домашней сети
2ИЩЕМсеть есть, до сервера не достучались
3В СЕТИсоединение с сервером стоит

Настройки шлюза

ЧтоЗначения
61шлюз включён0 выкл, 1 вкл
62что со шлюзом сейчастолько чтение
63обрамление кадров в TCP0 HDLC, 1 KISS, 2 «сам» (умолчание)
64доля эфира шлюзу1..10 тысячных долей часа, умолчание 5 (половина законного процента)
65занятость эфира за частолько чтение; 10 = ровно 1%
66кадров ушло из эфира на сервертолько чтение
67кадров пришло с сервератолько чтение
68из них уехало в эфиртолько чтение
69из них выброшено (эфир занят/тесно)только чтение
72режим отношения к эфиру0 по закону, 1 предупреждать, 2 без границ
91адрес сервера4 байта IPv4, старшим вперёд; 0 — «бери вшитый»
92порт сервера0 — «бери вшитый»

Вшитые по умолчанию значения: адрес 83.171.203.245, порт 4965 (умолчание TCPServerInterface у Reticulum). Свой адрес нужен на случай, когда не работает ничего, включая сеть до общего сервера — с настройками 91/92 шлюз доходит до сервера, поднятого на ноутбуке в той же комнате, без единого байта из интернета. Имени сервера (DNS) в прошивке нет намеренно: DNS сам требует работающей сети провайдера.

Обрамление кадров — почему их три вида

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

Поэтому умолчание — «сам»: оба варианта обрамления начинают кадр своим знаком границы (0x7E у HDLC, 0xC0 у KISS), и первый пришедший знак отвечает на вопрос однозначно. Пока сервер молчит, плата пробует HDLC; если за 20 секунд она отправила кадр и не получила ни одной границы — меняет предположение и переподключается. Определённое сохраняется во флеш.

Лимит эфира — три режима (настройка 72, пункт меню «Эфир»)

РежимЧто делает
по законудержим 1% и не выпускаем ни миллисекунды сверх
предупреждатьсчитаем и говорим вслух, подходя к пределу (порог 0.7%)
без границне спрашиваем ничего

Умолчание при первом включении — «по закону»: плата из коробки должна быть законной у любого, кто включил её не задумываясь. Выйти за предел — осознанное действие в меню. Круг замкнут (по закону → предупреждать → без границ → по закону) — дорога назад к закону обязана быть не длиннее дороги от него.

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

9. Знакомство плат между собой

В меню рядом стоят два пункта — «Знаком.» и «Пароль», и их легко перепутать. Разница простая:

«Знаком.» ищет, кто вокруг, и предлагает перейти на его канал (настройки радио).
«Пароль» заводит общий ключ шифрования и записывает знакомого в книжку ключей. Разные последствия — разные пункты.

Механизм первый — обмен радионастройками (пункт «Знаком.»)

Способ передать соседу свои настройки радио, чтобы он перешёл на ваш канал. Ключей это не заводит и переписку не закрывает.

  1. Откройте меню, дойдите до пункта «Знаком.» (Introduce), долгое нажатие.
  2. Хвост строки становится обратным отсчётом: 120с, 119с
  3. Второй человек делает то же самое на своей рации.
  4. Ждите — процесс идёт до двух минут.

Внутри: плата уходит с рабочего канала на общий «канал знакомства» (частота региона + 300 кГц) и на это время глуха на своём канале — приёмник один. Раз в 6…13 секунд (у каждой платы период свой, из заводского номера кристалла — чтобы две платы не накладывались передачами систематически) плата шлёт зов с меткой DUGA+ и своим профилем: регион, частота, полоса, SF. Через 120 секунд плата возвращается на свой канал сама.

На второй рации, как только зов услышан, поверх любой страницы появляется вопрос:

Чужой профиль не применяется сам никогда: решение уйти в чужую сеть принимает человек, а не пакет из эфира.

Чего у V3/V4 нет: ближнего знакомства по Bluetooth. У T114 знакомство умеет ещё и через объявления BLE — здесь этой половины нет вовсе.

Механизм второй — знакомство по паролю (пункт «Пароль»)

Двое заводят общий ключ, которым потом закрывается переписка. Знакомый записывается в книжку ключей — это то, ради чего вообще существует пункт «Знакомые».

«Двое стоят рядом. Каждый выбирает в меню „знакомство с паролем“ и набирает одни и те же восемь цифр — их произносят вслух или шлют сообщением. Дальше рации делают всё сами; человек видит на экране ход и через несколько секунд — „получилось“ или „не тот пароль“.»
  1. Меню → «Пароль» (Password), долгое нажатие.
  2. Плата сама предлагает восемь случайных цифр (пароли, выдуманные людьми на месте, — это «12345678» и год рождения). Их можно оставить или набрать свои.
  3. Набор одной кнопкой: коротко — прибавить единицу к цифре под курсором, долго — перейти к следующей цифре. С восьмой цифры долгое нажатие начинает знакомство.
  4. Второй человек набирает те же восемь цифр у себя.
  5. Ждите несколько секунд. Всё знакомство отменяется само через 60 секунд, если не дойдёт до конца.
ШагСтрока хода (RU)
0 — наборкорот +1, долго дальше
1 — зовузову...
2 — отвечаюотвечаю...
3 — подтверждаюподтверждаю...
4 — успехПОЗНАКОМИЛИСЬ
6 — нет случайностинет случайности
прочее (5)не тот пароль

Короткое нажатие на идущем или закончившемся знакомстве закрывает страницу; само знакомство при этом не отменяется — оно живёт своей минутой и кончится само.

Если источник случайности не работает — знакомство не начинается вовсе, и об этом говорится прямо («нет случайности»). Такую поломку нельзя заметить в работе никогда, поэтому она не замалчивается: ключ иначе подбирался бы перебором за минуты.

Шаги 1–3 идут открытым текстом (половины X25519 и созданы, чтобы ходить открыто). Единственный закрытый шаг — четвёртый, про общий круг: ключ круга открытым текстом в эфир не выходит ни разу. Если оба нажали одновременно — у кого номер платы меньше, тот продолжает звать, у кого больше — переходит в ответ, без лишних переговоров.

Где потом смотреть знакомых

Меню → «Знакомые». Там же их можно беречь (не вытеснять при переполнении книжки) или забыть. Забытый стирается сразу, и книжка тут же кладётся во флеш — рацию теряют, а не выключают.

10. Тревога, маяк спасения и проверка связи

Тревога (сигнал бедствия)

Плата шлёт в эфир восемь байт DUGA-SOS и свой номер раз в тридцать секунд, пока человек не отменит. Ни телефон, ни Reticulum для этого не нужны — передатчик тот же, что у обычного маячка «я здесь».

Как включить: меню → «Тревога» → вопрос → долгое нажатие. Или настройка 13 с телефона.

Тревога сама поднимает модуль GPS, даже если человек выключал его ради батареи: батарея дешевле человека.

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

Маяк спасения («МАЯК SOS»)

Одно нажатие вместо шести настроек — маяк спасения сразу:

Чего маяк не делает: не переходит на 433 МГц. Ниже частота — дальше связь, но антенна сделана под 868, и на чужой частоте она отражает мощность обратно в передатчик: связь стала бы хуже, а на пределе мощности можно сжечь выходной каскад.

Как включить: меню → «МАЯК SOS» → вопрос → долгое нажатие. Или настройка 32. Экран вопроса — не инвертирован, в отличие от тревоги: белое поле здесь означало бы «беда прямо сейчас», а маяк включают и заранее, уходя в лес.

Выключение возвращает всё как было — до последнего числа: частоту, полосу, SF, код, мощность, режим и состояние маячка. Пока маяк включён, это видно только хвостом пункта меню «МАЯК SOS вкл» — единственное такое место, не заходя в «режим радио».

Проверка дальности (пункт «Дальность»)

Вдвоём и никак иначе: одна плата шлёт маячок раз в пять секунд, вторая считает, сколько дошло. Начинается всегда с роли передатчика — если обе платы начнут приёмниками, в эфире не будет ничего, и обе покажут «ЖДЁМ». Роль меняется коротким нажатием и видна в шапке справа.

Проверка антенны (пункт «Антенна»)

Честно о том, что это за проверка: измерить КСВ плата не может — у радиочипа SX1262 нет измерителя отражённой мощности. Что она действительно умеет — послушать канал и посмотреть на уровень шума: с антенной эфир шумит (−115…−100 дБм), без неё шуметь нечему. Двенадцать замеров, порог −118 дБм.

Итог висит пять секунд от готовности; закрыть можно любым нажатием.

11. Настройки по номерам (команда 0xA5)

Эта таблица — не для повседневного чтения глазами, а справочник для того, кто управляет платой с телефона или скриптом по проводу/Bluetooth. Формат команды:

[0xA5][номер]запрос — сколько сейчас
[0xA5][номер][4 байта, старший вперёд]запрос — поставить столько
[0xA5][номер][4 байта]ответ — сколько СТАЛО (не то, о чём просили)
[0xA5][номер][0xFF 0xFF 0xFF 0xFF]ответ — такой настройки нет

Отвечать «нет» честнее, чем отвечать нулём: ноль человек и скрипт читают как измерение. Номера обязаны совпадать у V3/V4 и T114 — приложение и скрипты написаны один раз на два изделия, и совпадение проверяется сборкой прошивки, а не честным словом.

СмыслЗначенияESP (V3/V4)T114
Радио
1частотаГц, 150 000 000…960 000 000дада
2полосаГц; 62000, 125000, 250000, 500000дада
3SF5…12дада
4скорость кода5…8 (4/5…4/8)дада
5мощностьдБм, 2…22 (у V4 в эфире на ~6 дБ больше — усилитель)дада
6регион0…9 по таблице регионовдада
7режим радио0 Дальний, 1 Обычный, 2 Быстрый, 3 Спасениедада
Экран и поведение
8яркость0..255нет (на ESP четыре ступени в меню)да
9экономия0/1нетда
10эстафета0/1, из коробки 0дада
11маячок «я здесь»0/1, из коробки 1дада
12почтальон0 выкл, 1 память, 2 флеш; из коробки 1дада
13тревога0/1дада
14радио включено0/1дада
Знакомство
15приглашениечтение 0/1 «ждёт ответа»; запись 1 принять, 0 отброситьдада
16знакомство по радиочтение — сколько секунд осталось; запись 1 начать (120с), 0 прекратитьдада
Счётчики знакомства по Bluetooth (17..30)
17..30знакомство по BT и его счётчикиотвечают нулями (пути по BLE нет)да
19есть ли соединение по BT0/1дада
Прочее
31разбудить экранчтение 1 свет/0 темно; запись — разбудитьнетда
32маяк спасения0/1дада
33ретранслятор0/1дада
34номер сборки прошивкитолько чтениедада
35язык0 русский, 1 английскийдада
36сколько контактов у платычтение (V3: 7, V4: 3)дада
37какой контакт настраиваем (курсор)0..N−1дада
38номер вывода выбранногочтениедада
39роль контакта0 не занят, 1 выход, 2 вход, 3 вход с подтяжкой, 4 датчик, 5 плавнодада
40значение контактавыход — задать, вход — прочитатьдада
41чем стать при включениикак рольдада
42есть ли у вывода АЦПчтениедада
43Wi-Fi включён0/1данет (Wi-Fi нет как явления)
44пароль точки доступа числомтолько чтениеданет
45номер платы в эфиретолько чтениеданет
Хозяева и команды по радио (46..60)
46сколько мест в списке хозяевчтениедада
47какое место сейчас настраиваемдада
48номер платы-хозяина0 — вычеркнутьдада
49рубеж счётчиказапись 0 — сброситьдада
50слушаться команд из эфира0/1дада
51длина пароля командтолько чтениедада
52..60счётчики исполнения и отказов командтолько чтение (кроме 49)дада
Шлюз и Wi-Fi (61..72) — только V3/V4
61шлюз включён0/1данет
62что со шлюзом0 выкл, 1 нет сети, 2 ищем, 3 в сетиданет
63обрамление кадров TCP0 HDLC, 1 KISS, 2 «сам»данет
64доля эфира шлюзу1..10 тысячных, умолчание 5данет
65..69счётчики эфира и кадров шлюзатолько чтениеданет
70режим Wi-Fi0 своя точка, 1 домашняя сетьданет
71длина пароля домашней сетичтение; запись только 0данет
72режим эфира0 по закону, 1 предупреждать, 2 без границдада
Шифрование и книжка ключей (73..77)
73как поднялась книжка ключей0 цела, 1 первый раз, дальше — бедадада
74сколько знакомых в книжкедада
75закрывать ли маячки и тревогу0/1дада
76ход знакомства по паролю0 не идёт, 1 зову, 2 отвечаю, 3 подтвердил, 4 вышло, 5 не вышло, 7 про кругдада
77номер следующей посылкидада
GPS (78..87)
78модуль включён0/1да (V4)да
79состояние GPS0 выключен, 1 ищет, 2 точка естьда (V4)да
80класть координаты в маячок0/1да (V4)да
81показывать страницу «где я»0/1да (V4)да
82отдавать телефону и по проводу0/1да (V4)да
83широтастотысячные доли градуса, со знакомда (V4)да
84долготатам жеда (V4)да
85спутниковда (V4)да
86строк NMEA разобраночтениеда (V4)да
87отброшено по контрольной суммечтениеда (V4)да
Круг своих (88..90)
88заведён ли круг0/1дада
89метка кругачетыре байта одним числомдада
90встретился чужой круг при знакомстведада
Шлюз: адрес/порт и сторож подъёма (91..95) — только V3/V4
91адрес сервера4 байта IPv4 старшим вперёд; 0 — «бери вшитый»данет
92порт сервера0 — «бери вшитый» (4965)данет
93бережный подъёмчтение: 0 прошлый подъём дошёл до конца, 1..250 — столько неудач подряд. Запись: только ноль — «поднять всё»данет
94причина прошлого сбросачтение (1 питание, 3 из прошивки, 4 падение, 6 сторож задач, 9 просело питание)данет
95на какой ступени встал прошлый подъёмчтение: 0 дошёл, иначе 1 начало, 2 экран, 3 радио, 4 Bluetooth, 5 Wi-Fi, 6 шлюз, 15 готоводанет

Спросив 61..71 или 91..95 у T114, человек получит честное «такой настройки нет» — это не ошибка связи, а честный ответ прошивки.

Другие команды по проводу и Bluetooth (те же кадры KISS)

КомандаЧто делает
0xA0счётчики Bluetooth
0xA2числа копилки почты: сколько несём, байт, теряли ли, повторов отсеяли, когда трогали кнопку
0xA5настройка по номеру (таблица выше)
0xA7имя контакта текстом
0xA8правило «если — то», восемь байт (раздел 14)
0xA9команда контактам чужой платы по радио
0xAAпароль на такие команды
0xABповторить отчёт о подъёме — не измеряет заново, повторяет измеренное при включении
0xACдомашняя сеть Wi-Fi (раздел 7)
0xADзнакомство по паролю (раздел 9)
0xAEуйти в загрузчик; требует слова DFU в теле кадра
0xAFвернуть к заводскому

12. T114: что иначе

T114 — младшая по радио (нет Wi-Fi и шлюза), но с более крупным и цветным экраном. Логика меню и радио та же, что у V3/V4, но многое устроено иначе — ниже только отличия.

Экран

Цветная панель 135×240 точек (у V3/V4 — чёрно-белый OLED 128×64). Экран физически стоит «набок»: строки текста пишутся вдоль длинной стороны, чтобы получить 240 точек длины вместо 135 — на 78% больше места. Ниже картинки нарисованы для читаемости горизонтально; на самой плате те же надписи идут вдоль длинного бокового края экрана.

ЦветЧто значит
белый (CV_TEKST)обычный текст
коралловый (CV_KORAL)фирменный акцент
серый (CV_SERYY)приглушённый, второстепенный текст
зелёный (CV_ZELENYY)всё хорошо
красный (CV_KRASNYY)тревога
жёлтый (CV_ZHELTYY)внимание

В боковой шапке: слово duga, где буква «u» коралловая, остальные белые; имя страницы серым по центру; значок BT цветом (зелёный — телефон подключён, жёлтый — сопряжение, серый — включён, красный и перечёркнутый — выключен); «Э» зелёным — только когда эстафета включена. Значка Wi-Fi нет и быть не может. Инверсия тревоги здесь — не белый фон, а заливка красным.

Кнопка

Кнопка тоже одна, правило то же, тайминги те же: граница короткого и длинного нажатия — 600 мс, минута без нажатий гасит подсветку. В режиме глубокой экономии подсветка гаснет уже через 20 секунд.

Числа 600 и 60000 мс совпадают с V3/V4 намеренно: палец у человека один и привычка одна, а «минута» здесь — не число, а обещание пользователю, одно на два изделия.

Страницы круга у T114

#Страница
1главная
2сигнал
3соседи (шесть строк, у V3/V4 — три)
4принято
5питание
6радио
7эфир
8журнал (полные имена событий, а не сокращённые)
9о плате
10ПОДЕЛИТЬСЯ — QR-код с настройками канала
11где я (только когда модуль GPS есть)

Страниц «Wi-Fi» и «шлюз» нет — нечему их наполнять. На странице «принято» помещаются ещё две величины: «+N» эстафеты и «ждёт N» почтальона (на 128 точках V3/V4 они не влезли). На странице «эфир» есть вторая строка — наработка «сколько плата не выключалась».

Меню T114 — двадцать семь пунктов

Порядок первых пунктов у обеих плат одинаков намеренно — человек, пришедший с той рации, находит нужное на ощупь. «Wi-Fi», «Шлюз», «Эфир» и «Поднять всё» у V3/V4 приписаны за концом общего порядка, а не вставлены в середину.

T114V3/V4Почему отличается
Экономия (Power save)глубокой экономии на ESP не сделано: экран сам не гаснет иначе, а «реже маячок» стоит сотых долей процента тока — пункт, который ничего не меняет, хуже отсутствующего
Нагрев (Heat)тепловая защита nRF52; человек выбирает, жалеть плату или нет
ПочтальонПочта«Почтальон память» — 140 точек при 122 доступных, хвост пропадал бы
ЗнакомствоЗнаком.то же — не помещался хвост с числом секунд
РетрансляторРетранс.«Ретранслятор выкл» — 150 точек при 122
Wi-Fiу nRF52840 Wi-Fi нет как явления
Шлюзшлюзу нужен Wi-Fi
Поднять всёсторож подъёма написан только для ESP

Экономия на T114: экран гаснет втрое быстрее, маячок уходит впятеро реже. Маяк спасения на T114 ещё и сам включает глубокую экономию, чтобы экран гас за двадцать секунд — на V3/V4 экономии нет вовсе, включать там нечего.

GPS на T114

Модуль L76K, разъём GNSS разведён заводом, скорость 9600 (заводская скорость модуля).

У T114 отдельного вывода питания модуля GPS нет — выключить его совсем нельзя, можно только увести в сон. Во сне модуль берёт меньше тока, но берёт — об этом сказано прямо, а не сделан вид, что модуль выключен. У V4 разъём даёт настоящее отключение питания модуля (ключ на землю) и вывод сброса. У V3 разъёма GNSS нет вовсе.

Прошивка T114 — двойной RESET и файл .uf2

nRF52840 несёт загрузчик Adafruit, и он поднимает плату съёмным диском.

Способ 1 — двойной RESET.
Быстро нажмите кнопку RESET два раза подряд. Плата поднимется съёмным диском с меткой HT-n5262 (встречаются также T114, BOOT), на котором лежат INFO_UF2.TXT и CURRENT.UF2 — слепок того, что прошито сейчас.
Способ 2 — «1200-baud touch».
Откройте порт платы на скорости 1200 бод и сразу закройте. Загрузчик Adafruit ловит это и уходит в режим UF2. Обратимо: он сам вернётся в приложение после сброса или после записи нового .uf2.
Способ 3 — команда 0xAE.
Требует слова DFU в теле кадра, иначе не исполняется. Плата отвечает до ухода, закрепляет почту во флеш и уходит в режим UF2 сама.
  1. Войдите в режим загрузчика одним из трёх способов выше.
  2. Скопируйте файл .uf2 прямо на появившийся съёмный диск.
Плата перезагружается сама посреди копирования — диск пропадает, и Windows сообщает об ошибке. Это нормально: успех проверяется не по итогу копирования, а по тому, что диск исчез, а устройство вернулось с идентификатором приложения (PID_8071), а не загрузчика (PID_0071); изготовитель в идентификаторе — VID_239A (Adafruit).

Заводской сброс на T114 сносит файловую систему целиком (настройки, контакты, правила, почту, книжку ключей и круг), затем идёт обязательный перезапуск платы.

Обновление по Bluetooth — есть у T114, но не в прошивке, а в загрузчике

Новый факт, уточняющий прежнюю версию инструкции. Сама прошивка Duga обновления по Bluetooth по-прежнему не даёт: в её исходниках нет ни службы Nordic DFU, ни OTA-обновления по BLE — это верно и для T114, и для V3/V4. Но на T114 стоит не самодельный, а штатный загрузчик Adafruit nRF52, и этот загрузчик, отдельно от прошивки Duga, умеет OTA DFU по Bluetooth сам.

Как это выглядит:

  1. Перевести плату в режим загрузчика одним из трёх способов выше (двойной RESET, «1200-baud touch» или команда 0xAE со словом DFU).
  2. В этом режиме плата видна в списке Bluetooth телефона или компьютера под именем вида <плата>_DFU.
  3. Обновляют приложением nRF Connect (или nRF Device Firmware Update), передавая ему готовый файл .zip.
  4. Собранный пакет для T114 лежит на сайте: duga_t114_sborka97_dfu.zip.
Честная оговорка. Это свойство загрузчика Adafruit nRF52, проверенное по его документации — Adafruit_nRF52_Bootloader и OTAFIX, — а не измеренное на живой плате: на вашей T114 путь по Bluetooth не испытывался. Способ через USB (двойной RESET и файл .uf2) остаётся основным и проверенным.

У V3 и V4 обновления по Bluetooth по-прежнему нет ни в прошивке, ни в загрузчике: у ESP32-S3 стоит штатный ПЗУ-загрузчик Espressif, и по воздуху он не работает. Единственная дорога к загрузчику, которую даёт прошивка V3/V4, — команда 0xAE со словом DFU, и она уводит плату в USB-режим, а не в беспроводное обновление.

13. Если что-то пошло не так

Откуда взялся бережный режим

«Главный вывод не в том, что я ошибся трижды. Он в том, что плата при этом молчала. Она вставала посреди самопроверки и не оставляла ни одного следа: ни на экране (до него не дошло), ни в порту (порт читать было некому), ни во флеше (туда никто не писал).»

Отсюда — сторож подъёма (только у V3/V4, сборки 33 и новее): плата запоминает, докуда дошёл прошлый подъём, и, если он не дошёл до конца, следующий раз поднимается бережно — по нарастающей отключая необязательное.

Что запоминает сторож

Ступень
1начало — setup начался, экран ещё не трогали
2экран — шина I2C и микросхема экрана
3радио — SX1262
4Bluetooth — стек NimBLE
5Wi-Fi — точка доступа или домашняя сеть
6шлюз — сетевая задача моста
15готово — подъём дошёл до конца

Плата, вставшая на Bluetooth, при следующем включении честно скажет на заставке стоп: Bluetooth — не «что-то не так», а имя ступени.

Что не поднимается в бережном режиме

Неудач подрядЧто не поднимается
0всё поднимается
1Wi-Fi и шлюз
2плюс Bluetooth
3плюс печать в порт (порт замолкает совсем)
Радио не отключается никогда: рация без радио — не рация, и молчащая связь хуже тёмного экрана. Экран, кнопка и меню при этом работают всегда.

Не всякий оборванный подъём считается неудачей — только те причины, за которыми стоит сама прошивка (паника, сторож прерываний, сторож задач, просадка питания). Обычный сброс кнопкой или новая прошивка счётчик не наращивают. Счётчик привязан к номеру сборки: обновление прошивки списывает старые неудачи.

Как понять, что плата в бережном режиме

Как вернуть полный режим

Способ 1 — с платы.
Меню → «Поднять всё» → долгое нажатие. Вопроса «точно?» нет: действие ничего не теряет, оно лишь разрешает следующему включению снова попробовать поднять сеть и Bluetooth. Плата сразу перезагружается (настройки и почта перед этим кладутся во флеш).
Способ 2 — по проводу или с телефона.
Запишите ноль в настройку 93. Любое другое число отвергается.

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

Плата не видна компьютеру

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

V3 / V4 — зажать BOOT (подписана PRG) при подключении.
Держите кнопку PRG (она же BOOT) нажатой, подключите USB-кабель, отпустите кнопку. Плата поднимается в ПЗУ-загрузчике вне зависимости от того, что происходит с прошивкой.
T114 — двойной RESET.
Два быстрых нажатия кнопки RESET — плата поднимется съёмным диском с прошивкой внутри (раздел 12.7).

Ещё один путь для V3/V4, если плата ещё отвечает на команды: команда 0xAE со словом DFU в теле кадра взводит бит «поднимайся в режим загрузки» и сама перезагружает плату в ПЗУ-загрузчик — заливщику не нужно ни дёргать линии, ни угадывать их порядок (у V4 это особенно кстати: линии автосброса у неё обрабатывает сам кристалл, и порядок сигналов иной, чем у V3, где автосброс идёт через два транзистора).

Где взять прошивку

Актуальные сборки заливаются через прошивальщик в браузере:

https://duga.pw/proshivalshchik/
V3 и V4 — сборка 38, T114 — сборка 97

14. Контакты платы, почта и правила «если — то»

Свободные контакты

На плате есть несколько свободных выводов, которые можно превратить в реле, вход кнопки/геркона, датчик или плавную регулировку (ШИМ).

ПлатаВыводовС АЦПСписок
V375GPIO 2, 4, 5, 6, 7 (АЦП), 47, 48 (без АЦП)
V431GPIO 6 (АЦП), 47, 48 (без АЦП)

Все аналоговые выводы — ADC1, и это не совпадение: ADC2 отдан Wi-Fi. V3 — самая щедрая из трёх плат на свободные контакты: усилителя нет, разъёма GNSS нет, и всё это досталось умному дому.

Роль (настройка 39)Что это
0 — не занятвывод отпущен
1 — выходреле, лампа, клапан
2 — входцифровой вход без подтяжки
3 — вход с подтяжкойкнопка, геркон
4 — датчикАЦП, шкала 0..4095 (у T114 — 0..1023)
5 — плавноШИМ

Настраиваются контакты не отдельным номером на каждый вывод, а курсором: сначала «выбери контакт номер N» (настройка 37), затем читай и пиши его поля (38..42). Номеров ровно семь при любом числе выводов. Имя контакта задаётся отдельной командой 0xA7 текстом в UTF-8.

Почтальон — копилка чужих писем

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

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

ЗначениеИмя на экранеЧто значит
0выклчужого не носим вовсе
1памятьдержим в оперативной памяти; во флеш уходит один раз, когда плату просят замолчать. Из коробки — это состояние.
2флешпереживает даже вырванную батарею, но тратит ресурс памяти

Размер копилки — 48 КБ, кадр до 512 байт (около сотни пакетов — кусок картинки или полминуты голоса). У T114 копилке отдано вдвое больше (96 КБ из 248): на ESP-платах NimBLE забирает свои десятки килобайт из той же кучи именно тогда, когда телефон подключается, — то есть ровно тогда, когда копилка полна и её начинают отдавать.

Почта уходит во флеш при пункте меню «Перезагрузка» (до сброса, а не после — после некому), при «Поднять всё», при уходе в загрузчик и при просьбе замолчать. При заводском сбросе почту не закрепляют — её как раз стирают.

Ретранслятор — обряд из четырёх действий

Пункт меню «Ретранс.» / настройка 33 — одним нажатием без подтверждения:

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

Правила «если — то»

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

Правил у платы восемь. Каждое — восемь байт: источник (контакт-условие), условие, порог, цель (контакт-действие), действие, значение, пауза в секундах после срабатывания.

УсловияДействия
0 — никогдаправило выключено0 — включить выход
1 — вышепоказание стало больше порога1 — выключить
2 — нижепоказание стало меньше порога2 — переключитьна противоположное
3 — стал вклвход замкнулся (кнопка, геркон)3 — задать числодля роли «плавно» — яркость
4 — стал выклвход разомкнулся

Правило пишется командой 0xA8 (не настройкой — восемь байт не влезают в четыре). Конструктор в приложении и текстовая запись правила — одно и то же: текст вида если 0 ниже 300 то 4 вкл разбирается в приложении и превращается в те же восемь байт.

Три ловушки, которые уже обезврежены

  1. Дребезг. Срабатывание идёт по фронту, а не по уровню — иначе датчик у порога щёлкал бы реле по десять раз в секунду.
  2. Слишком часто. У каждого правила есть пауза после срабатывания.
  3. Петля. Правило А включает контакт Б, правило Б — контакт А: за один проход исполняется не больше одного срабатывания на правило.
Четвёртая ловушка — пороги правил не переносятся с T114 на V3/V4. Шкала АЦП разная: у T114 — 0..1023 при полной шкале 3.6 В, у V3/V4 — 0..4095 при примерно 3.1 В. «Ниже 300» на T114 — это около 1.06 В, а на V3/V4 — около 0.23 В. Правило, перенесённое числом в число, соберётся, запишется, запустится — и будет молчать. Пороги задаются заново, по собственным показаниям каждой платы.

15. Панель в браузере (только Heltec V3 / V4)

У T114 браузерной панели нет вовсе. В прошивке T114 нет ни Wi-Fi, ни веб-сервера — слов WiFi и WebServer там нет вообще. Контактами T114 управляют с экрана, по Bluetooth и, при отдельно включённой настройке, по радио (раздел 19). Всё, что описано в этом разделе, работает только на Heltec V3 и Heltec V4.

Как до неё добраться

  1. На рации: меню → пункт «Wi-Fi» → нажать. Пункт переключается по кругу: пока домашняя сеть не задана — выкл → вкл → выкл; как только задана — выкл → точка → дом → выкл. Из выключенного состояния плата всегда поднимает свою точку доступа, а не последний использованный режим.
  2. Пока в меню выбран пункт «Wi-Fi», нижняя строка экрана показывает пароль точки надписью код 12345678. Хвост самой строки меню — состояние: выкл/вкл/точка/дом или число подключённых телефонов.
  3. Имя сети — Duga XXXX, где XXXX — тот же номер платы, что на экране и в эфире. Пароль — восемь цифр, рождается один раз случайным образом и больше не меняется, даже после перезагрузки.
  4. Подключитесь к сети, наберите пароль, откройте http://192.168.4.1/.

Портал захвата — телефон открывает панель сам

Плата поднимает DNS-сервер, который на любое имя отвечает своим адресом, и на любой незапрошенный путь отдаёт саму панель вместо ошибки 404. Отсюда — поведение телефонов:

ТелефонЧто происходит
iPhone / iPadсам дёргает /hotspot-detect.html, получает панель и сам открывает окно «вход в сеть» — набирать адрес не нужно. Если окно закрыть — оно у Apple урезанное и второй раз само не откроется, тогда панель открывают руками
Androidдёргает /generate_204, показывает уведомление «сеть без доступа в интернет» / «войти в сеть»
Ноутбукпортал обычно не всплывает — адрес набирают руками

Захват DNS работает только в режиме своей точки: в домашней сети его нарочно нет — отвечать своим адресом на любое имя в чужой сети значит сломать интернет всему дому.

Общий вид: одна страница, четыре раздела

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

РольЦвет
Фон страницы#12151a
Фон карточки#1b2028
Рамка#2c3440
Зелёный («включено»)#4fbf7a
Оранжевый (ошибки, ползунок, кнопки с подтверждением)#ff7a59
Голубой (АЦП, полоска датчика)#7fd0f5

Порядок сверху вниз: заголовок с номером платы → строка «плата, сборка N» → плашки состояния → раздел «Контакты» → раздел «Правила «если — то»» → раздел «Домашняя сеть и шлюз» → раздел «Точка доступа» (последний).

Раздел «Контакты»

Карточек столько, сколько у платы свободных выводов: семь у V3, три у V4 — разметка строится из ответа платы, а не написана руками под каждую плату отдельно. У каждой карточки сверху — поле имени (до 12 байт UTF-8: латиницей 12 знаков, кириллицей 6 букв) и справа ярлычок с именем вывода (GPIO 6): голубая рамка — у вывода есть АЦП, серая — нет. Ниже — список ролей: не занят, выход, вход, вход с подтяжкой, датчик (только если есть АЦП), плавно. Тело карточки меняется по роли.

Полная перерисовка карточек идёт только при смене состава (роли, имена, число контактов) — иначе браузер каждые три секунды ронял бы фокус в поле имени и ползунок под пальцем.

Раздел «Правила «если — то»»

Одна широкая карточка, восемь мест под правила. Конструктор — источник, условие (стало выше/стало ниже/замкнулся/разомкнулся) и порог сверху, цель, действие (включить/выключить/переключить/задать), значение и пауза снизу. Кнопка «Записать правило» ищет первое свободное место; если все восемь заняты, под ней появляется: все восемь мест заняты — уберите лишнее.

Раздел «Домашняя сеть и шлюз»

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

Ниже, на той же карточке, — необязательные поля адреса и порта сервера (для случая, когда сервер поднят рядом, а не в интернете): адрес принимается только четырьмя числами через точку, имя вида buhta.example.net не годится — оно требует DNS, а DNS требует той самой сети, которой нет.

Раздел «Точка доступа» (последний)

Служебные адреса — не страницы, а вызовы самой панели

Всё это дёргает сама страница через fetch(); ходить по ним руками не нужно, таблица — на случай, если панель разбирают:

АдресЧто делает
GET /dснимок платы целиком: контакты, правила, сеть, состояние (JSON)
GET /v?k=N&z=Vзначение контакта
GET /r?k=N&r=Rроль контакта
GET /b?k=N&z=Vбезопасное состояние при включении платы
GET /i?k=N&t=имяимя контакта
GET /p?n=N&u=…правило целиком; u=0 убирает правило
GET /w?v=0выключить Wi-Fi
GET /n?s=имя&k=пароль&r=1домашняя сеть; r=1 — сразу перейти
GET /g?a=адрес&p=портадрес и порт сервера
любой другой путьотдаёт саму страницу (портал захвата)

Опрос идёт раз в 3 секунды одним запросом GET /d, а не шестью по отдельности: соединений у точки доступа всего четыре, и страница, дёргающая несколько адресов трижды в минуту, устроила бы очередь на ровном месте.

Если панель не открывается

  1. Wi-Fi на рации выключен. Хвост строки меню «Wi-Fi» должен быть «вкл» или «точка».
  2. Плата ушла в домашнюю сеть. Хвост показывает «дом», сети «Duga XXXX» в списке нет. Открыть панель по адресу с экрана рации (страница «шлюз») или вернуть свою точку тем же пунктом меню.
  3. Неверный пароль домашней сети. На экране «ищем сеть …» — лечится тем же способом.
  4. Пароль от точки набран неверно. Он виден только на экране рации, пока выбран пункт «Wi-Fi».
  5. Телефон не показал портал сам. Набрать руками 192.168.4.1.
  6. Телефон ушёл в сотовую сеть. Выключить в его настройках автопереключение для этой сети.
  7. Гостей уже четверо — пятый не подключится (видно по хвосту строки меню).
  8. Сеть видна, пароль подошёл, страница не грузится. Единственный случай, для которого в прошивке заведён отдельный отказ: если не хватило памяти на задачу панели, плата снимает точку доступа целиком, а не показывает пустую панель.
  9. Пропала уже открытая страница. Плата ушла в домашнюю сеть или Wi-Fi выключили кнопкой — см. пп. 1–2.

16. Колодки и свободные выводы

Честно об именах. У V3 и V4 в источниках нет отдельных имён колодок — только общая надпись «колодка платы». У T114 колодки поимённые: «разъём P1», «разъём P2» — так их называет карта выводов Heltec. Придумывать имена для V3/V4 значило бы послать человека с отвёрткой не туда: точнее любого имени — номер GPIO, на него и стоит ориентироваться.

Общее правило для всех трёх плат

Heltec V3 — семь свободных выводов

№ в панелиВыводАЦПГде искать
0GPIO 2да, ADC1 канал 1колодка платы
1GPIO 4да, ADC1 канал 3колодка платы
2GPIO 5да, ADC1 канал 4колодка платы
3GPIO 6да, ADC1 канал 5колодка платы
4GPIO 7да, ADC1 канал 6колодка платы
5GPIO 47нетколодка платы
6GPIO 48нетколодка платы

Все пять аналоговых выводов — ADC1. Это не совпадение: ADC2 отдан Wi-Fi, и при поднятом Wi-Fi чтение с него не удаётся — не «шумит», а именно не удаётся.

Heltec V4 — три свободных вывода

№ в панелиВыводАЦПГде искать
0GPIO 6да, ADC1 канал 5колодка платы
1GPIO 47нетколодка платы
2GPIO 48нетколодка платы

Втрое меньше, чем у V3, потому что лишние 6 дБм у V4 даёт отдельная микросхема усилителя, и управляют ею GPIO 7, 2 и 5 — ровно те выводы, что у V3 свободны и годятся под датчики. Аналоговый вход на V4 один на всю плату — GPIO 6; тратить его на реле, когда рядом есть чисто цифровые 47 и 48, значит израсходовать то, чего больше не будет.

Прошивка знает ревизию платы 4.3 (KCT8103L). У ревизии 4.2 (GC1109) третий вывод усилителя — 46, а не 5; для такой платы список выводов нужно поправить в прошивке, иначе включённый «свободный» GPIO 46 будет управлять усилителем.

Как плата сама себя проверяет

При включении, в отчёте самопроверки в USB-порт, плата печатает список свободных контактов дословно (пример для V4):

свободные контакты этой платы: 0 — GPIO 6, АЦП (ADC1 канал 5), роль: не занят 1 — GPIO 47, без АЦП, роль: не занят 2 — GPIO 48, без АЦП, роль: не занят шкала датчиков здесь 0..4095 (у T114 было 0..1023): пороги правил с той рации сюда не переносятся.

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

Heltec T114 — шесть свободных выводов, с именами колодок

№ в панелиВыводПорт nRF52АЦПКолодка
0GPIO 28P0.28да, AIN4разъём P2
1GPIO 29P0.29да, AIN5разъём P2
2GPIO 30P0.30да, AIN6разъём P2
3GPIO 31P0.31да, AIN7разъём P2
4GPIO 8P0.08нетразъём P2
5GPIO 33P1.01нетразъём P1
Выводы 5, 7, 44, 45, 46, 47 на T114 тоже выведены на разъём и в карте Heltec честно названы GPIO — но это шина внешней флеш-памяти, где живёт журнал писем. Команда «включи вывод 46» от опечатки в телефоне убила бы почту не сразу и молча, поэтому в списке свободных их нет.

Занятые выводы — куда подключаться нельзя

Чем занято (V3/V4, ESP32-S3)Выводы
Радио SX12628, 9, 10, 11, 12, 13, 14
Экран OLED17 (SDA), 18 (SCL), 21 (RST)
Питание периферии (Vext)36 — включается низким уровнем
Светодиод / кнопка PRG35 / 0
Батарея1 (АЦП), 37 (ключ делителя)
Усилитель — только V47, 2, 5 (у ревизии 4.3; у 4.2 вместо 5 — 46)
Разъём GNSS — только V438, 39, 34, 42, 40, 41
Страппинг / UART прошивки / флеш и PSRAM / USB 0, 3, 45, 46 · 43, 44 · 26, 33…38 · 19, 20

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

Чем занято (T114, nRF52840)Выводы
Радио SX126224, 20, 17, 25; шина SPI0: 19, 22, 23
Экран ST778911, 12, 2, 3 (низкий), 15 (низкий), 40, 41
Питание периферии (Vext)21 — включается высоким уровнем
Светодиод / кнопка35 (низкий) / 42
Внешняя флеш (журнал писем), QSPI46, 47, 44, 45, 7, 5
I²C (две шины)26, 27 · 16, 13
Второй последовательный порт9, 10
Батарея4 (измерение), 6 (ключ делителя)
GPS (L76K)39, 37, 34, 36

Шкала АЦП, пределы напряжения

V3 / V4T114
Разрядность12 бит, 0…4095 (задано явно в коде) 10 бит, 0…1023 (задано явно в коде со сборки 96)
Полная шкала≈3.1 В (ослабление 11 дБ)3.6 В
Соответствие300 отсчётов ≈ 0.23 В, 1000 ≈ 0.76 В, 2000 ≈ 1.51 В 300 отсчётов ≈ 1.06 В, 600 ≈ 2.11 В, 900 ≈ 3.17 В
До сборки 96 шкала АЦП у контактов T114 была чужой. Контакты читались тем, что оставляло после себя измерение батареи: analogReadResolution(12) и analogReference(AR_INTERNAL_3_0) ставятся глобально на весь АЦП каждые десять секунд, а своей настройки у контактов не было вовсе. То же напряжение давало число примерно в 4.8 раза больше расчётного, и порог «ниже 300» молча превращался в «ниже 0.22 В». Со сборки 96 шкала объявляется заново перед каждым обходом контактов — 10 бит, 3.6 В, — и числа в строке «Соответствие» стали верны.

Пороги, подобранные на T114 до сборки 96 по живым показаниям панели, после обновления придётся пересмотреть: при том же напряжении плата покажет другое число. Всё это прочитано в коде; вольтметром на живой плате не проверялось.

Чего нельзя подключать (обе платформы)

17. Как защищена переписка

Речь не про меню «Пароль» (раздел 9) — там описано, как завести общий ключ. Здесь — чем и насколько этот ключ на самом деле защищает переписку.

Чем закрыто содержимое

Содержимое посылки шифрует ChaCha20 (ключ 32 байта, разовое число 12 байт) и подписывает HMAC-SHA256 — обе вещи написаны в прошивке своими руками, а не взяты из готовых библиотек платформы. Причина простая: у ESP32-S3 и nRF52840 разные аппаратные ускорители шифрования, и брать у каждой платы свой значило бы завести две дороги к одному результату и надеяться, что они не разойдутся. Сперва шифруют, потом подписывают (encrypt-then-MAC) — так подделку можно отбросить, не тратя время на попытку её расшифровать.

Что видно постороннему с приёмником — честно

ЧтоБайтЗначит
метка DUGA-SHF8«это закрытая посылка Дуги»
номер отправителя4видно, чья посылка
счётчик4видно, сколько посылок эта рация уже отправила
вид содержимого1видно, что это: письмо / тревога / маячок / команда / знакомство / координаты
длина сообщениявидна всегда: набивки до постоянной длины нет, длина закрытой посылки равна длине письма плюс 25 байт

Формулировка из самого кода: «закрыто содержимое, а не сам факт разговора». Номер получателя в конверте не пишется, но переписка идёт на парных ключах, и по ответной посылке (номер отправителя которой тоже открыт) пара восстанавливается наблюдением за эфиром.

Защита от повтора

Подпись доказывает, что посылку сочинил свой, но не доказывает, что её не записали вчера и не проиграли сегодня. От этого — окно повторов: для каждого соседа плата помнит самый большой виденный счётчик и битовую карту 64 номеров ниже него. Окна во флеш не пишутся (флеш выдержит не любое число записей), поэтому после перезагрузки счётчик стартует не с нуля, а с «брони» — забронированного числа плюс запас в тысячу; это стоит одну запись во флеш на тысячу посылок и до тысячи потерянных номеров при каждом включении. Номеров четыре миллиарда, и при десяти включениях в день запас кончится через миллион лет.

Где лежат ключи и что с ними бывает

Что случилосьЧто с ключами
Обычное выключениеничего — книжка ключей во флеше, окна повторов теряются (так и задумано)
Перепрошивкакнижка лежит в NVS/файле, а не в области программы; явного стирания при обновлении в коде нет. Это вывод из кода, не проверка на живой плате.
Заводской сбросстирает всё: настройки, контакты, правила, почту, книжку ключей, круг и пароль домашней сети. Знакомиться заново
Потеряли рациюключи из неё читает тот, у кого она в руках. Лечится на остальных рациях: меню «Знакомые» → номер → долгое → ЗАБЫТЬ

Тревога не закрывается — никогда

Это решение, а не недоделка. Рядом с бедой может оказаться незнакомая рация — турист, спасатель, любой человек с такой же коробочкой, и именно он может оказаться единственным, кто дойдёт. Переключателя у тревоги нет и не будет. А вот обычный маячок «я здесь», который говорит, где вы, каждые несколько минут, годами, — закрыть можно (настройка 75, по умолчанию выключено), потому что его незачем знать чужому.

Чего шифрование не защищает — сказано авторами прямо

18. Конверт переписки

Раскладка того, что летит по воздуху, когда содержимое закрыто. Человеку конверт не показывается — он видит письмо, маячок или результат команды.

БайтыЧто там
0…7метка DUGA-SHF, открытым текстом
8…11номер отправителя
12…15счётчик посылки
16вид содержимого (письмо, тревога, маячок, команда, знакомство, координаты)
17…закрытое содержимое, ровно столько байт, сколько было
хвостподпись — 8 байт HMAC-SHA256
Накладные расходы на посылку25 байт
Содержимого не больше200 байт
Вся посылка не больше225 байт

Подпись усечена до восьми байт нарочно: это одна подделка из 18 миллиардов на попытку, а полные 32 байта отняли бы у письма ещё 24 байта на каждой посылке. Правило простое: знакомы — закрываем, не знакомы — шлём по-старому, открыто, иначе новая плата перестала бы слушаться старой.

Как режется длинное — и почему не здесь

Конверт длинное не режет. Содержимое длиннее 200 байт просто не принимается — запечатывание отказывает нулём. Резка идёт на радио-слое, уже с готовой посылкой целиком, кусками до 254 байт с битом «продолжение». Значит письмо длиннее 200 байт закрытым конвертом Дуги не уйдёт — оно пойдёт как обычное письмо Reticulum со своей защитой, к этому конверту отношения не имеющей.

19. Команды по радио и хозяева

Управление по радио выключено из коробки (настройка 50 = 0), и экранного меню для хозяев и пароля команд нет вовсе — ни на V3/V4, ни на T114. Всё делается только по проводу или Bluetooth: настройками 46…60 и двумя кадрами KISS (0xA9, 0xAA).

Зачем это нужно

«Команда по радио» — когда одна рация щёлкает контактом (реле, выходом) на другой плате: открыть ворота, включить насос. «Хозяин» — это не человек, а рация в его руках: список хранит номера плат, мест четыре. Не шестнадцать — потому что каждая запись это ещё одна рация, которой можно открыть ворота, а список, который не помещается на один экран, вычёркивают только тогда, когда помнят, кто там есть. Не одна — потому что поломка единственной рации хозяина означала бы, что до ворот не достучаться вовсе.

Как плата проверяет, что команда от хозяина

Пароль команд (до 16 байт, общий на все платы дома) в эфир не уходит никогда — уходит только подпись, 8 байт HMAC-SHA256. Номер получателя лежит внутри подписи — иначе команду «открой ворота», подписанную для платы у ворот, можно было бы дословно переслать плате в гараже. Проверки идут по возрастанию цены — дешёвые впереди дорогих:

  1. нам ли адресована команда;
  2. разрешено ли слушаться эфира и задан ли пароль;
  3. хозяин ли отправитель — есть в списке?;
  4. сошлась ли подпись;
  5. счётчик — не повтор ли это (проверяется после подписи нарочно: иначе по ответу «повтор» можно узнавать, не зная пароля, какие номера уже прошли);
  6. исполнение — и только на команду с верной подписью плата отвечает.

Отвечает плата не словом «принято», а тем, что реально стоит на контакте сейчас — разница между «я послал единицу» и «на выводе единица» и есть то, ради чего вся эта проверка затевалась.

Если счётчик разошёлся

Бывает после перепрошивки хозяина с полным стиранием, заводского сброса или подмены платы с тем же номером: команды уходят, светодиод мигает, а реле не щёлкает. Чинится на плате-исполнителе, руками, двумя путями:

СпособКак
Вычеркнуть хозяина и завести зановонастройка 47 — место, настройка 48 — 0, затем снова номер
Сбросить счётчик прямонастройка 47 — место, настройка 49 — записать 0
Настройка 49 принимает в запись только ноль. Задать счётчику любое другое число значило бы завести дверь, через которую его можно опустить, — а опущенный счётчик и есть разрешение на повтор.

Настройки 46…60 — полный список

СмыслЧтениеЗаписьЗначения
46сколько мест в списке хозяевданет всегда 4
47какое место сейчас настраиваемдада 0…3, во флеш не пишется
48номер платы-хозяина на местедада 0…65535; 0 — вычеркнуть. Отказ, если это свой номер или он уже стоит на другом месте
49счётчик выбранного хозяинадада читается последний принятый; запись — только 0
50слушаться ли команд из эфирадада 0/1, по умолчанию 0
51длина пароля командданет 0…16; сам пароль не читается никогда
52свой счётчик исходящих командданет 0…4294967295
53исполнено команд из эфираданет счётчик
54отказов всегоданетсчётчик
55из них: отправитель не хозяинданет счётчик
56из них: подпись не сошласьданет счётчик
57из них: счётчик не вырос (повтор)данет счётчик
58подписанных ответов принятоданет счётчик
59итог последнего ответаданет 0 исполнено, 1 контакт не выход, 2 нет контакта, 255 ответа ещё не было
60значение контакта из того ответаданет 0…255

Записываемых всего четыре — 47, 48, 49, 50. Остальные — только чтение, попытка записи вернёт отказ. Пароля в этом списке нет и не будет.

Что человек делает руками

Всё — по проводу или Bluetooth, из эфира этой двери нет:

  1. Задать общий пароль команд — кадр KISS 0xAA (тот же пароль — на рации хозяина).
  2. Настройка 47 — выбрать место, настройка 48 — записать номер рации хозяина. Повторить для остальных (до четырёх).
  3. Настройка 50 = 1 — разрешить управление по радио. Без этого шага плата команд не слушается: «плата, которая слушается эфира сразу после заливки, — это плата, которую хозяин не просил об этом».
  4. По желанию — познакомить обе рации (меню «Пароль», раздел 9): тогда команды пойдут закрытым конвертом, и содержимое (какой контакт, какое значение) не будет видно постороннему. Со сборок 38 и 96 тем же конвертом уходит и ответ исполнителя. Раньше он летел открытым — а в ответе стоят номер платы, номер контакта и то, что на нём сейчас: закрыть вопрос и оставить открытым ответ значит не закрыть ничего, слушателю хватит половины разговора. Не знакомы — команда и ответ по-прежнему идут открыто, иначе новая плата перестала бы отвечать старой. Вид конверта взят прежний, поэтому рация, оставшаяся на 37 или 95, такой ответ распечатает и поймёт — это следует из кода, на паре живых плат не проверялось.

Отправка команды — кадр KISS 0xA9, требует только заданного пароля и номера получателя, не равного своему. Настройка 50 на неё не влияет: та запирает дверь В плату, а не ИЗ неё — рации, которой запрещено слушаться эфира, всё равно можно самой командовать другими.

20. Что важно запомнить

  1. Частота, полоса и SF обязаны совпадать у всех раций. LoRa слышит только точное совпадение. Разошлись — рация исправна, счётчики в порядке, а связи нет, и понять это по экрану нельзя. Отсюда надпись менять у ВСЕХ! на экранах региона и режима.
  2. Шлюз даёт письма, но не даёт браузера. Это физика радиоканала, а не недоделка (расчёт — в разделе 1).
  3. Маяк спасения уводит рацию на канал, где её не услышит никто из своих, пока они туда не перейдут сами.
  4. Регион меняет частоту — то же предупреждение, что и у режима радио.
  5. Пароль домашней сети из платы не выходит никогда; пароль своей точки, наоборот, показывается на своей странице и в подсказке меню — чтобы прочесть эти цифры, нужно держать плату в руках.
  6. Пороги правил с T114 на V3/V4 не переносятся — разная шкала АЦП.
  7. V3 и V4 внешне почти неотличимы, а прошивки у них разные. Не та сборка — исправная плата с мёртвым усилителем.
  8. Экран гаснет через минуту сам — это не поломка. Что плата жива, видно по светодиоду: он мигает раз в две секунды.
  9. Проверка антенны не измеряет КСВ. «ЕСТЬ» и «ТИХО» — это про уровень шума, а не приговор антенне.
  10. На V4 порт исчезает при сбросе — вывод самопроверки можно не поймать; для этого есть команда 0xAB.
  11. Забытый знакомый стирается насовсем и сразу — рацию теряют, а не выключают.
  12. Заводской сброс стирает знакомства, круг и почту — так и написано на экране вопроса.

21. Чего нет в этой инструкции

Честно о границах материала, из которого она собрана: