27 KiB
SHiNE ESP32 Homeserver UI Spec
Назначение
Этот документ описывает актуальный UI-прототип homeserver SHiNE для платы Waveshare ESP32-S3-Touch-AMOLED-2.16.
Актуальный основной Arduino-скетч лежит в ../main-device/shine_homeserver_main/.
Документ является источником истины для Arduino-скетча:
- если меняется этот документ, должен меняться и скетч;
- если меняется скетч, должен обновляться и этот документ;
- экраны, кнопки, поля, статусы, переходы и тексты не должны расходиться.
Текущий объём реализации
Текущая реализация является интерактивным прототипом экрана устройства, пригодным для ручной проверки на железе.
Что уже входит в прототип:
- локальный UI на тач-экране;
- хранение настроек и секретов во внутренней памяти
ESP32черезNVS; - русский текст в логике интерфейса; в текущей временной сборке отображение на экране идёт через ASCII-транслитерацию, потому что
U8g2-шрифты на устройстве временно не рисуются; - экран пополнения с реальным
solana:URI и рисованием QR-кода черезLVGL; - реальное подключение к
Wi-Fiпо сохранённымSSID/паролю; - реальная проверка доступности
API,RPCиWS-адресов; - реальное чтение баланса кошелька из
Solana RPC; - проверка обязательных условий перед регистрацией;
- живая on-chain регистрация серверного
user_pdaвshine_usersпо нажатию кнопки на главном экране; - живой экран заявок на подключение новых устройств через доверенную homeserver-сессию;
- PIN-блокировка (в текущей временной сборке вход по PIN отключён, устройство открывает
HOMEсразу после старта); - базовые настройки, статус и главный экран;
- сохранение
PDAиtx signatureпосле успешной регистрации. - создание и возобновление серверной сессии
SHiNEчерез WebSocket сsessionType = 100иclientPlatform = "ESP32".
Что пока считается именно прототипом, а не финальной интеграцией:
- пока реализован только сценарий заявок на подключение устройств через доверенную сессию;
- другие типы входящих запросов на подпись и произвольные approval-flow на этом устройстве ещё не подключены.
Основная идея устройства
Устройство работает как отдельный homeserver:
- хранит секрет на самом устройстве;
- позволяет ввести логин, секрет и имя homeserver;
- показывает адрес кошелька устройства;
- позволяет пополнить баланс перед регистрацией;
- после выполнения условий даёт зарегистрировать устройство как homeserver;
- после авторизации в SHiNE может подтверждать заявки на подключение новых устройств пользователя.
SD-карта не нужна для постоянного хранения секрета в этом прототипе.
Основное сохранение идёт во внутреннюю flash-память через NVS.
Данные, которые хранятся на устройстве
Прототип хранит:
PIN;Wi-Fi SSID;Wi-Fi password;login;session/homeserver 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.
Правило серверной сессии SHiNE
При подключении к серверу SHiNE устройство должно авторизовываться как homeserver-сеанс:
sessionType = 100clientPlatform = "ESP32"clientInfo = "ESP32 homeserver"
Это относится и к CreateAuthSession, и к SessionLogin.
Правила готовности к регистрации
Кнопка регистрации доступна только если одновременно выполнены условия:
- настроен и подтверждён
Wi-Fi; - заполнены и подтверждены серверные адреса;
- задан логин;
- сгенерирован или введён секрет;
- баланс кошелька не меньше
0.20 SOL; - устройство ещё не зарегистрировано.
Если хотя бы одно условие не выполнено, главный экран показывает, чего именно не хватает.
Экранная модель
В прототипе используются следующие экраны:
LOCKHOMESTATUSCONNECTIONWIFI_EDITSERVERSACCOUNTWALLETWALLET_QRREQUESTSREQUEST_DETAILSETTINGSPIN_EDITTEXT_INPUTCONFIRMREGISTER_ACCOUNT_CONFIRMREGISTER_ACCOUNT_RESULT
Общие правила интерфейса
- Верхняя строка всегда показывает краткий статус устройства:
PIN,Wi-Fi,сервер,регистрация. - В правом верхнем углу рядом с батареей:
- сначала процент заряда;
- затем, если устройство реально заряжается, маленькая иконка молнии;
- затем контур батареи;
- затем индикатор
Wi-Fi.
- Основной язык прототипа: русский.
- Для вывода текста в текущей временной сборке используется стандартный шрифт
Arduino_GFX. - Русские строки на экране временно показываются в ASCII-транслитерации.
- Кнопки крупные, с тач-ориентированным размером.
- Опасные действия подтверждаются отдельным диалогом.
- После изменения данных конфигурация сразу сохраняется в
NVS.
Экран LOCK
Назначение:
- экран блокировки предусмотрен в UI, но в текущей временной сборке после запуска пропускается;
- вход по PIN временно отключён для отладки остальных экранов.
Отображается:
- заголовок
SHiNE Device; - статус
Устройство заблокировано; - поле ввода PIN в виде маски;
- кнопки цифровой клавиатуры;
- кнопки
СтеретьиОткрыть.
Поведение:
- если PIN введён верно, открывается
HOME; - если PIN неверный, показывается ошибка
Неверный PIN; - в текущей временной сборке этот экран не показывается автоматически при старте.
Экран HOME
Это основной экран устройства.
Показывает:
- крупный статус регистрации;
- имя логина;
- имя homeserver;
- строку
Wi-Fi: <SSID> connected|disconnected; - строку
SHiNE: <server address> connected|unavailable; - короткий статус баланса.
Особенности верхнего блока:
- зелёный/контурный статусный кружок аккаунта расположен слева от строки логина;
- блок
STATUSподнят выше относительно предыдущей версии; - если состояние хорошее, слово
connectedв строкахWi-FiиSHiNEпоказывается зелёным.
В зоне баланса:
- основная кнопка показа/обновления баланса занимает примерно 80% строки;
- текст на кнопке баланса выровнен левее центра;
- справа от неё стоит отдельная кнопка
QR; - после старта устройства баланс пытается загрузиться автоматически, если уже есть секрет и
Wi-Fi; - нажатие на кнопку
QRоткрывает экранWALLET_QR.
Нижние кнопки:
СтатусПодключениеАккаунтКошелёкЗапросыНастройки
Дополнительная большая кнопка:
REGISTER ACCOUNT- либо жёлтая
ADD HOMESERVER - либо жёлтая
FIX HOMESERVER PASSWORD
Если регистрация уже сделана:
- если пользователь создан, но в
PDAещё нет сессии текущего homeserver, показывается жёлтая кнопкаADD HOMESERVER; - если в
PDAесть homeserver с тем же именем, но с другим ключом, показывается жёлтая кнопкаFIX HOMESERVER PASSWORD; - если и пользователь, и homeserver-сессия уже корректны, вместо призыва к регистрации показывается статус
Homeserver активен. - две нижние кнопки внизу экрана не прилегают вплотную друг к другу, между ними есть небольшой зазор.
Экран REGISTER_ACCOUNT_CONFIRM
Показывает предварительную проверку перед отправкой транзакции регистрации.
Отображается:
- повторный
login; - сообщение о том, что логин свободен или уже занят;
- баланс кошелька с проверкой порога
0.020 SOL; - имя homeserver;
- пометка, если используется стандартное значение
homeserver1; - отдельное предупреждение, если
Wi-Fiне подключён.
Кнопки:
ЗАРЕГИСТРИРОВАТЬ В СИЯНИИBACK
Поведение:
- если
Wi-Fiне подключён, на экране прямо показывается уведомление об этом и кнопка регистрации недоступна; - если
loginуже занят вshine_users, регистрация недоступна; - если баланс меньше
0.020 SOL, на экране показывается соответствующая ошибка; - если все проверки пройдены, кнопка регистрации активна и запускает on-chain регистрацию.
Экран REGISTER_ACCOUNT_RESULT
Показывает результат отправки регистрации.
Отображается:
- текст успеха или ошибки;
- подробное сообщение;
- при успехе краткий
user_pda; - при успехе краткий
tx signature.
Кнопки:
BACK HOMEACCOUNT
Поведение:
- после успешной регистрации данные
user_pdaиtx signatureсохраняются вNVS; - при ошибке на экране показывается причина отказа;
- если ошибку вернул
sendTransaction, экран старается показать не только общий текст, но и деталиRPC/preflight/simulate-логов.
Экран HOMESERVER_PDA_CONFIRM
Показывает, что именно не так с homeserver-секцией уже существующей пользовательской PDA.
Отображается:
- причина (
homeserverотсутствует вPDAили ключ не совпадает с локальным секретом); login;- имя
homeserver; - короткое пояснение, что именно будет сделано.
Кнопки:
ADD HOMESERVERилиFIX HOMESERVER PASSWORDBACK
Поведение:
- если
Wi-Fiне подключён, действие недоступно; - экран не создаёт нового пользователя, а запускает
update_user_pda; - при
ADD HOMESERVERв блокsessionsдобавляется записьsession_type=100; - при
FIX HOMESERVER PASSWORDобновляется публичный ключ уже существующей записиhomeserver.
Экран HOMESERVER_PDA_RESULT
Показывает результат обновления sessions в пользовательской PDA.
Отображается:
- успех или ошибка;
- короткое сообщение;
- при успехе краткий
tx signature.
Кнопки:
BACK HOMEACCOUNT
Поведение:
- при ошибке текст ошибки сохраняется в ту же USB/NVS-диагностику, что и регистрация;
- после успешного обновления выполняется повторная проверка
PDA, и основной экран должен перейти в состояниеok.
Экран STATUS
Показывает сводку:
- логин;
- homeserver;
- есть ли секрет;
- зарегистрировано ли устройство;
- подключён ли 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
Показывает:
- логин;
- имя homeserver;
- статус секрета;
- короткий отпечаток секрета;
- статус регистрации;
- короткий отпечаток
PDAилиtx.
Кнопки:
Изменить логинСекретИмя homeserverСгенерироватьОчиститьНазад
Поведение:
Сгенерироватьсоздаёт новыйmaster secretи пересчитывает из негоdevice-кошелёк;Очиститьудаляет секрет, адрес кошелька,PDA,tx, регистрацию и онлайн-статус;- логин приводится к нижнему регистру и trim.
- после успешной регистрации на экране сохраняются и отображаются краткие отпечатки
PDAиTX.
Экран WALLET
Показывает:
- адрес кошелька устройства;
- баланс в
SOL; - минимально рекомендуемую сумму для регистрации;
- статус
Хватает / Не хватает.
Кнопки:
QR и URI+0.10 SOL+0.25 SOL-0.10 SOLПроверитьНазад
Поведение:
- кнопки пополнения/уменьшения нужны для теста сценариев;
Проверитьчитает реальный баланс изSolana RPC;- адрес кошелька должен совпадать с
device key, вычисленным из сохранённогоmaster secret; - отрицательный баланс не допускается.
Экран WALLET_QR
Экран показывает:
- крупный реальный
QRдля строкиsolana:<wallet_address>; - снизу крупный текст самого адреса кошелька.
Поведение:
- отдельная текстовая подсказка возврата не показывается;
- возврат на главный экран выполняется обычным тапом по экрану.
Показывает:
- QR-код для строки вида:
solana:<wallet>; - мелкую подпись с полным адресом кошелька под QR.
Поведение:
- QR должен быть сканируемым, а не декоративным;
- адрес кошелька берётся из
device key, вычисленного из сохранённогоmaster secret; - нажатие в любую точку экрана возвращает пользователя на
HOME.
Экран REQUESTS
Экран доступен только если homeserver уже авторизован в SHiNE.
Показывает:
- слева сверху кнопку
REFRESH; - заголовок
REQUESTS:немного правее стандартного левого положения; - справа сверху только большую цифру числа активных заявок;
- ниже прокручиваемый список активных pairing-заявок;
- на экране одновременно видны примерно две плитки.
Каждая плитка показывает:
- код подключения из
10цифр в виде5пар:XX XX XX XX XX; - строку
Session: <platform/name>; - строку
Kind: Client sessionилиKind: Wallet session.
Поведение:
- список берётся из живой операции
ListTrustedDeviceLoginRequests; - если заявок нет, экран показывает
No active requests; - отдельная строка вида
Active requests: Nна этом экране не показывается; - вертикальный скролл позволяет просматривать все активные заявки;
- нажатие по плитке открывает
REQUEST_DETAIL; - свайп вправо возвращает в
SETTINGS.
Экран REQUEST_DETAIL
Показывает детали выбранной pairing-заявки:
- вопрос
Connect session ...?; - код подключения
XX XX XX XX XX; - строку
Session: <platform/name>; - строку
Kind: Client sessionилиKind: Wallet session; - пояснение:
- для client session:
Only device key will be transferred. No additional keys will be sent. - для wallet session:
No keys will be transferred.
- для client session:
Кнопки:
YESNO
Поведение:
YESподтверждает заявку:- для client session устройство передаёт только
device key; - для wallet session устройство выпускает отдельную
wallet-sessionбез передачи ключей;
- для client session устройство передаёт только
NOотклоняет заявку;- после любого решения устройство возвращается в список
REQUESTSи обновляет его; - свайп вправо возвращает в
REQUESTS.
Экран SETTINGS
Показывает вертикальное меню крупных пунктов.
Если homeserver ещё не авторизован в SHiNE:
1. Wi-Fi2. Server3. Account
Если homeserver уже авторизован:
1. Device requests2. Wi-Fi3. Server4. Account
Поведение:
- одновременно видны только две карточки;
- список листается свайпом вверх/вниз;
- свайп вправо возвращает на
HOME; - пункт
Device requestsдолжен быть первым и появляется только для авторизованного homeserver.
Экран PIN_EDIT
Используется для ввода нового PIN.
Правила:
- допустимы только цифры;
- длина PIN: 4..8 символов;
- после сохранения новый PIN немедленно пишется в
NVS.
Экран TEXT_INPUT
Это общий экран редактирования текстовых полей.
Используется для:
SSIDПароль Wi-FiЛогинИмя homeserverAPI URLRPC URLWS URL
Состав экрана:
- заголовок поля;
- текущее значение;
- программная клавиатура;
- кнопки
Стереть,OK,Отмена.
Экран CONFIRM
Это модальный экран подтверждения.
Используется для:
- регистрации;
- очистки секрета;
- полного сброса.
Кнопки:
ПодтвердитьОтмена
Сценарий первой настройки
Ожидаемый путь пользователя:
- открыть устройство сразу после старта; экран PIN временно не требуется;
- открыть
Подключение -> Wi-Fi; - ввести
SSIDи пароль, нажатьПроверить; - открыть
Подключение -> Серверы; - проверить или задать серверные адреса;
- открыть
Аккаунт; - ввести логин;
- задать имя homeserver;
- сгенерировать секрет;
- открыть
Кошелёк; - при необходимости пополнить баланс;
- вернуться на
HOME; - нажать
REGISTER ACCOUNT; - на экране проверки ещё раз увидеть
login, статус свободногоPDA, баланс,homeserver1и при необходимости сообщение о неподключённомWi-Fi; - нажать
ЗАРЕГИСТРИРОВАТЬ В СИЯНИИ; - после завершения увидеть либо экран успеха с
user_pdaиtx signature, либо подробную ошибку; - после успешной регистрации увидеть статус
Homeserver активен.
Примечание:
- устройство реально отправляет
create_user_pdaвshine_users, а после подтверждения сохраняетPDAиtx signature.
Сценарий входящего запроса
- открыть
Запросы; - выбрать один из запросов;
- прочитать детали;
- нажать
РазрешитьилиОтклонить; - убедиться, что статус запроса изменился.
Временный режим текста
В текущей диагностической версии:
- строковые литералы в коде остаются русскими и в
UTF-8; - перед выводом на экран они временно транслитерируются в ASCII;
- рендер выполняется стандартным шрифтом
Arduino_GFX; - это обходной режим, пока
U8g2-шрифты на устройстве не начнут рисоваться стабильно.
Критерии ручной проверки
Минимально нужно проверить:
- устройство загружается и сразу открывает
HOME; экран блокировки временно отключён; - текст отображается читаемо хотя бы в ASCII-транслитерации;
- ввод по экранной клавиатуре работает;
- после перезагрузки сохранённые поля остаются в памяти;
- секрет и адрес кошелька сохраняются на устройстве;
- экран
QR и URIрисует читаемый QR-код; - регистрация блокируется, пока условия не выполнены;
- после выполнения условий регистрация становится доступной;
- список запросов и экран подтверждения работают;
- полный сброс действительно очищает сохранённое состояние.