17 KiB
SHiNE ESP32 Subserver UI Spec
Назначение
Этот документ описывает актуальный UI-прототип сабсервера SHiNE для платы Waveshare ESP32-S3-Touch-AMOLED-2.16.
Документ является источником истины для Arduino-скетча:
- если меняется этот документ, должен меняться и скетч;
- если меняется скетч, должен обновляться и этот документ;
- экраны, кнопки, поля, статусы, переходы и тексты не должны расходиться.
Текущий объём реализации
Текущая реализация является интерактивным прототипом экрана устройства, пригодным для ручной проверки на железе.
Что уже входит в прототип:
- локальный UI на тач-экране;
- хранение настроек и секретов во внутренней памяти
ESP32черезNVS; - русский текст на экране через
UTF-8+ кириллический шрифтU8g2; - экран пополнения с реальным
solana:URI и рисованием QR-кода; - реальное подключение к
Wi-Fiпо сохранённымSSID/паролю; - реальная проверка доступности
API,RPCиWS-адресов; - реальное чтение баланса кошелька из
Solana RPC; - проверка обязательных условий перед регистрацией;
- живая on-chain регистрация серверного
user_pdaвshine_usersчерезdevice keyустройства; - прототип входящих запросов с подтверждением и отклонением;
- PIN-блокировка;
- базовые настройки, статус и главный экран;
- сохранение
PDAиtx signatureпосле успешной регистрации.
Что пока считается именно прототипом, а не финальной интеграцией:
- приём реальных входящих запросов на вход/подпись пока не подключён к живой сети;
- входящие запросы пока демонстрационные, чтобы можно было проверить UX и логику подтверждения.
Основная идея устройства
Устройство работает как отдельный сабсервер:
- хранит секрет на самом устройстве;
- позволяет ввести логин, секрет и имя сабсервера;
- показывает адрес кошелька устройства;
- позволяет пополнить баланс перед регистрацией;
- после выполнения условий даёт зарегистрировать устройство как сабсервер;
- после регистрации может принимать входящие запросы на вход и на подпись.
SD-карта не нужна для постоянного хранения секрета в этом прототипе.
Основное сохранение идёт во внутреннюю flash-память через NVS.
Данные, которые хранятся на устройстве
Прототип хранит:
PIN;Wi-Fi SSID;Wi-Fi password;login;session/subserver name;master secret;wallet address;user pda address;registration signature;balance;server api url;server rpc url;server ws url;- флаги:
wifiReady,serversReady,secretReady,registered,online.
Правила готовности к регистрации
Кнопка регистрации доступна только если одновременно выполнены условия:
- настроен и подтверждён
Wi-Fi; - заполнены и подтверждены серверные адреса;
- задан логин;
- сгенерирован или введён секрет;
- баланс кошелька не меньше
0.20 SOL; - устройство ещё не зарегистрировано.
Если хотя бы одно условие не выполнено, главный экран показывает, чего именно не хватает.
Экранная модель
В прототипе используются следующие экраны:
LOCKHOMESTATUSCONNECTIONWIFI_EDITSERVERSACCOUNTWALLETWALLET_QRREQUESTSREQUEST_DETAILSETTINGSPIN_EDITTEXT_INPUTCONFIRM
Общие правила интерфейса
- Верхняя строка всегда показывает краткий статус устройства:
PIN,Wi-Fi,сервер,регистрация. - Основной язык прототипа: русский.
- Для вывода текста используется
UTF-8. - Для кириллицы используется
U8g2-шрифт с поддержкойCyrillic. - Кнопки крупные, с тач-ориентированным размером.
- Опасные действия подтверждаются отдельным диалогом.
- После изменения данных конфигурация сразу сохраняется в
NVS.
Экран LOCK
Назначение:
- блокировка устройства после запуска;
- вход по PIN.
Отображается:
- заголовок
SHiNE Device; - статус
Устройство заблокировано; - поле ввода PIN в виде маски;
- кнопки цифровой клавиатуры;
- кнопки
СтеретьиОткрыть.
Поведение:
- если PIN введён верно, открывается
HOME; - если PIN неверный, показывается ошибка
Неверный PIN.
Экран HOME
Это основной экран устройства.
Показывает:
- крупный статус регистрации;
- имя логина;
- имя сабсервера;
- короткий статус Wi-Fi;
- короткий статус сервера;
- короткий статус баланса.
Нижние кнопки:
СтатусПодключениеАккаунтКошелёкЗапросыНастройки
Дополнительная большая кнопка:
Зарегистрировать
Если регистрация уже сделана:
- вместо призыва к регистрации показывается статус
Сабсервер активен.
Экран STATUS
Показывает сводку:
- логин;
- сабсервер;
- есть ли секрет;
- зарегистрировано ли устройство;
- подключён ли Wi-Fi;
- доступны ли серверы;
- хватает ли баланса;
- находится ли устройство онлайн;
- краткий отпечаток
PDAилиtx.
Кнопки:
НазадОбновить статус
Обновить статус в прототипе не делает сеть, а просто перерисовывает текущие вычисленные состояния.
Экран CONNECTION
Показывает:
Wi-Fi: готов / не готов;Серверы: готовы / не готовы;Онлайн: да / нет.
Кнопки:
Wi-FiСерверыПодключитьОтключитьНазад
Поведение:
Подключитьпереводит устройство вonline=true, еслиWi-Fiреально подключён и серверы реально проверены;Отключитьпереводит устройство вonline=false.
Экран WIFI_EDIT
Поля:
SSIDПароль
Кнопки:
Изменить SSIDИзменить парольПроверитьСброситьНазад
Поведение:
Проверитьделает реальную попытку подключения кWi-Fi;Сброситьочищает обе строки и ставитwifiReady=false.
Экран SERVERS
Поля:
API URLRPC URLWS URL
Кнопки:
Изменить APIИзменить RPCИзменить WSПроверитьТестовыеНазад
Поведение:
Тестовыеподставляет дефолтные тестовые значения;Проверитьделает реальные сетевые проверки:API URLдолжен отвечать поHTTP/HTTPS;RPC URLдолжен отвечать наSolana JSON-RPC;WS URLдолжен приниматьTCP/TLS-соединение.
Экран ACCOUNT
Показывает:
- логин;
- имя сабсервера;
- статус секрета;
- короткий отпечаток секрета;
- статус регистрации;
- короткий отпечаток
PDAилиtx.
Кнопки:
Изменить логинСекретИмя сабсервераСгенерироватьОчиститьНазад
Поведение:
Сгенерироватьсоздаёт новыйmaster secretи пересчитывает из негоdevice-кошелёк;Очиститьудаляет секрет, адрес кошелька,PDA,tx, регистрацию и онлайн-статус;- логин приводится к нижнему регистру и trim.
Экран WALLET
Показывает:
- адрес кошелька устройства;
- баланс в
SOL; - минимально рекомендуемую сумму для регистрации;
- статус
Хватает / Не хватает.
Кнопки:
QR и URI+0.10 SOL+0.25 SOL-0.10 SOLПроверитьНазад
Поведение:
- кнопки пополнения/уменьшения нужны для теста сценариев;
Проверитьчитает реальный баланс изSolana RPC;- адрес кошелька должен совпадать с
device key, вычисленным из сохранённогоmaster secret; - отрицательный баланс не допускается.
Экран WALLET_QR
Показывает:
- QR-код для строки вида:
solana:<wallet>?amount=0.20&label=SHiNE%20Register; - адрес кошелька;
- сумму;
- текст URI.
Кнопки:
Назад
QR должен быть сканируемым, а не декоративным.
Экран REQUESTS
Показывает список демонстрационных запросов:
Вход в сессиюПодпись сообщения
Для каждого запроса:
- тип;
- источник;
- короткий статус.
Кнопки:
Открыть запрос 1Открыть запрос 2Назад
Экран REQUEST_DETAIL
Показывает детали выбранного запроса:
- тип запроса;
- кто запросил;
- время;
- описание;
- отпечаток/идентификатор.
Кнопки:
РазрешитьОтклонитьНазад
Поведение:
- после разрешения или отклонения запрос помечается обработанным;
- экран списка отражает новый статус.
Экран SETTINGS
Показывает:
- текущий PIN;
- базовые флаги безопасности;
- технические действия прототипа.
Кнопки:
Сменить PINСбросить онлайнПолный сбросНазад
Полный сброс очищает весь локальный конфиг и возвращает устройство к стартовому состоянию.
Экран PIN_EDIT
Используется для ввода нового PIN.
Правила:
- допустимы только цифры;
- длина PIN: 4..8 символов;
- после сохранения новый PIN немедленно пишется в
NVS.
Экран TEXT_INPUT
Это общий экран редактирования текстовых полей.
Используется для:
SSIDПароль Wi-FiЛогинИмя сабсервераAPI URLRPC URLWS URL
Состав экрана:
- заголовок поля;
- текущее значение;
- программная клавиатура;
- кнопки
Стереть,OK,Отмена.
Экран CONFIRM
Это модальный экран подтверждения.
Используется для:
- регистрации;
- очистки секрета;
- полного сброса.
Кнопки:
ПодтвердитьОтмена
Сценарий первой настройки
Ожидаемый путь пользователя:
- разблокировать устройство PIN-кодом;
- открыть
Подключение -> Wi-Fi; - ввести
SSIDи пароль, нажатьПроверить; - открыть
Подключение -> Серверы; - проверить или задать серверные адреса;
- открыть
Аккаунт; - ввести логин;
- задать имя сабсервера;
- сгенерировать секрет;
- открыть
Кошелёк; - при необходимости пополнить баланс;
- вернуться на
HOME; - нажать
Зарегистрировать; - после подтверждения увидеть статус
Сабсервер активен.
Примечание:
- устройство реально отправляет
create_user_pdaвshine_users, а после подтверждения сохраняетPDAиtx signature.
Сценарий входящего запроса
- открыть
Запросы; - выбрать один из запросов;
- прочитать детали;
- нажать
РазрешитьилиОтклонить; - убедиться, что статус запроса изменился.
Технические требования к кириллице
Для корректного русского текста скетч обязан:
- хранить строковые литералы в
UTF-8; - вызывать
gfx->setUTF8Print(true); - использовать шрифт
U8g2с поддержкойCyrillic; - не полагаться на стандартный
ASCII-шрифтArduino_GFXдля русского текста.
Если эти условия нарушены, UI считается сломанным даже при правильной логике экранов.
Критерии ручной проверки
Минимально нужно проверить:
- устройство загружается и показывает экран блокировки;
- русский текст отображается без кракозябр;
- ввод по экранной клавиатуре работает;
- после перезагрузки сохранённые поля остаются в памяти;
- секрет и адрес кошелька сохраняются на устройстве;
- экран
QR и URIрисует читаемый QR-код; - регистрация блокируется, пока условия не выполнены;
- после выполнения условий регистрация становится доступной;
- список запросов и экран подтверждения работают;
- полный сброс действительно очищает сохранённое состояние.