PIPKIT · Connectivity

Wi‑Fi и OTA.

Страница повторяет connectivity-часть API.md: standalone Wi‑Fi wrapper и OTA tooling, config, runtime API и ошибки.

18. Wi‑Fi

18.1. Build-time флаги

  • PIPGUI_WIFI
  • 1GUI::loop() обслуживает standalone Wi‑Fi wrapper
  • 0 — standalone Wi‑Fi path не обслуживается автоматически
  • PIPGUI_WIFI_SSID
  • PIPGUI_WIFI_PASSWORD
  • PIPCORE_ENABLE_WIFI
  • должен быть 1, если используется внешний или внутренний Wi‑Fi API PipCore

Важно:

  • 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 API PipCore недоступен
  • PIPCORE_ENABLE_OTA включает core-level OTA backend
  • PIPCORE_OTA_PROJECT_URL это URL, который использует сам PipCore OTA backend
  • PIPGUI_OTA включает сам OTA subsystem
  • PIPGUI_OTA_PROJECT_URL это базовый URL проекта, откуда берутся manifest и бинарники
  • PIPGUI_OTA_ED25519_PUBKEY_HEX это публичный ключ, которым проверяется подпись manifest и firmware
  • PIPGUI_FIRMWARE_TITLE это имя прошивки в UI
  • PIPGUI_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

  • None
  • WifiNotEnabled
  • WifiNotConnected
  • HttpBeginFailed
  • HttpStatusNotOk
  • ManifestTooLarge
  • ManifestParseFailed
  • ManifestReplay
  • SignatureMissing
  • SignatureInvalid
  • FlashLayoutInvalid
  • RollbackUnavailable
  • UpdateBeginFailed
  • UpdateWriteFailed
  • HashPipelineFailed
  • DownloadTruncated
  • PayloadSizeMismatch
  • HashMismatch
  • UpdateEndFailed
  • UrlTooLong

На практике чаще всего встречаются:

  • WifiNotConnected — нет соединения
  • HttpStatusNotOk — сервер не отдал корректный HTTP-ответ
  • ManifestParseFailed — manifest битый или неожиданный по формату
  • SignatureInvalid — подпись не сошлась
  • HashMismatch — firmware скачалась, но checksum не совпала
Code copied