Wi‑Fi и OTA.
Страница повторяет connectivity-часть API.md: standalone Wi‑Fi wrapper и OTA tooling, config, runtime API и ошибки.
18. Wi‑Fi
18.1. Build-time флаги
PIPGUI_WIFI1—GUI::loop()обслуживает standalone Wi‑Fi wrapper0— standalone Wi‑Fi path не обслуживается автоматическиPIPGUI_WIFI_SSIDPIPGUI_WIFI_PASSWORDPIPCORE_ENABLE_WIFI- должен быть
1, если используется внешний или внутренний Wi‑Fi APIPipCore
Важно:
PIPGUI_WIFIиPIPCORE_ENABLE_WIFIэто не одно и то жеPIPGUI_WIFIвключает GUI-level сценарии и auto-service вGUI::loop()PIPCORE_ENABLE_WIFIвключает сам backend вPipCore- если GUI или прошивка вызывают
pipcore::net::*, аPIPCORE_ENABLE_WIFI=0, будет compile-time ошибка - OTA продолжает работать и при
PIPGUI_WIFI = 0 - у OTA свой runtime-path, он не зависит от standalone Wi‑Fi servicing в
GUI::loop()
18.2. API
ui.requestWiFi(true); // включить или выключить standalone Wi‑Fi request
ui.wifiState(); // текущее состояние backend-а
ui.wifiConnected(); // true только в Connected
ui.wifiLocalIpV4(); // IPv4 как packed uint32_t
19. OTA
Для OTA нужна A/B partition table с двумя OTA app-слотами.
19.1. Тулинг (tools/ota/)
Сгенерировать ключ:
python tools/ota/key.py
Если запустить без параметров, tool покажет меню и даст выбрать путь сохранения числом.
Сделать stable release:
python tools/ota/release.py
Сделать beta release:
python tools/ota/release.py --beta --interactive
Проверка manifest + bin:
python tools/ota/verify.py
При запуске без параметров tool покажет меню: manifest, firmware source и signature check.
19.2. Конфигурация
Обычно всё задаётся в include/config.hpp:
#define PIPCORE_ENABLE_WIFI 1
#define PIPCORE_ENABLE_OTA 1
#define PIPCORE_OTA_PROJECT_URL "https://example.com/fw/PipGUI"
#define PIPGUI_OTA 1
#define PIPGUI_OTA_PROJECT_URL "https://example.com/fw/PipGUI"
#define PIPGUI_OTA_ED25519_PUBKEY_HEX "..."
#define PIPGUI_FIRMWARE_TITLE "PipGUI"
#define PIPGUI_FIRMWARE_VER_MAJOR 1
#define PIPGUI_FIRMWARE_VER_MINOR 0
#define PIPGUI_FIRMWARE_VER_PATCH 2
Что это значит:
PIPCORE_ENABLE_WIFIвключает core-level Wi‑Fi backend, без него OTA APIPipCoreнедоступенPIPCORE_ENABLE_OTAвключает core-level OTA backendPIPCORE_OTA_PROJECT_URLэто URL, который использует самPipCoreOTA backendPIPGUI_OTAвключает сам OTA subsystemPIPGUI_OTA_PROJECT_URLэто базовый URL проекта, откуда берутся manifest и бинарникиPIPGUI_OTA_ED25519_PUBKEY_HEXэто публичный ключ, которым проверяется подпись manifest и firmwarePIPGUI_FIRMWARE_TITLEэто имя прошивки в UIPIPGUI_FIRMWARE_VER_MAJOR / MINOR / PATCHэто текущая версия прошивки, с которой backend сравнивает remote release
Что обычно важно:
- если GUI использует OTA, то мало включить только
PIPGUI_OTA, нужно ещё включитьPIPCORE_ENABLE_WIFI=1иPIPCORE_ENABLE_OTA=1 - без
PIPGUI_OTA_ED25519_PUBKEY_HEXнормальная защищенная OTA-схема не имеет смысла - URL и версия это то, что меняют чаще всего
- если OTA не нужен, достаточно держать
PIPGUI_OTA 0
19.3. Использование
Минимальный сценарий
ui.otaConfigure(); // один раз на старте
ui.otaRequestCheck(); // запустить проверку обновления
const OtaStatus& st = ui.otaStatus(); // текущее состояние OTA state-machine
Этого уже хватает для обычного сценария, потому что GUI::loop() сам обслуживает OTA backend.
Проверка обновления
ui.otaRequestCheck();
ui.otaRequestCheck(NewerOnly);
ui.otaRequestCheck(AllowDowngrade);
ui.otaRequestCheck()это обычная проверкаNewerOnlyразрешает только обновление вверхAllowDowngradeразрешает откат на более старую версию- backend идёт по каналам в порядке
stable -> beta - если в
stableничего подходящего нет, потом проверяетсяbeta
Установка и отмена
ui.otaRequestInstall(); // начать установку уже найденного релиза
ui.otaCancel(); // отменить текущую OTA-операцию
История stable-версий
ui.otaRequestStableList(); // запросить список stable-версий
bool ready = ui.otaStableListReady(); // список уже загружен
uint8_t count = ui.otaStableListCount(); // сколько stable-версий доступно
const char* ver = ui.otaStableListVersion(i); // строка версии по индексу
ui.otaRequestInstallStableVersion("1.2.3");
Это нужно только если хочешь показывать пользователю список старых stable-сборок и давать выбрать rollback вручную.
Дополнительно
ui.otaService();
ui.otaMarkAppValid();
otaService()публичный, но обычно вручную не нужен, потому чтоGUI::loop()уже вызывает его самotaMarkAppValid()нужен после reboot, если новая прошивка стартовала в режиме ожидания подтверждения- в обычном UI-коде чаще всего достаточно
otaConfigure(),otaRequestCheck(),otaRequestInstall()иotaStatus()
Ошибки OtaError
NoneWifiNotEnabledWifiNotConnectedHttpBeginFailedHttpStatusNotOkManifestTooLargeManifestParseFailedManifestReplaySignatureMissingSignatureInvalidFlashLayoutInvalidRollbackUnavailableUpdateBeginFailedUpdateWriteFailedHashPipelineFailedDownloadTruncatedPayloadSizeMismatchHashMismatchUpdateEndFailedUrlTooLong
На практике чаще всего встречаются:
WifiNotConnected— нет соединенияHttpStatusNotOk— сервер не отдал корректный HTTP-ответManifestParseFailed— manifest битый или неожиданный по форматуSignatureInvalid— подпись не сошласьHashMismatch— firmware скачалась, но checksum не совпала