Граница: библиотека и продукт¶
Что живёт в библиотеке¶
Библиотека (lib/idryer-core/) содержит:
- Весь сетевой стек: WiFi, HTTP, MQTT, TLS.
- Протокол provisioning/claiming.
- Облачный стейт-машин (
CloudStateMachine). - UART-бридж и протокол кадров.
- Клиенты интеграций (Bambu, HA, Moonraker).
- Интерфейсы устройства (
IWifiManager,ICredentialStore,IHttpClient,IProfile). - Arduino-реализации этих интерфейсов.
- Топики MQTT и логику подписки/публикации.
Признак кода в библиотеке: продукт с любым железом может подключить его без изменений.
Что живёт в продукте¶
Продукт (src/) содержит:
- Реализацию
IProfile— конфигурация, info-payload,applyConfig. - Бизнес-логику конкретного устройства (управление LED, сушка, нагрев).
- Обработчики
onInvoke/onSetCommand. - Продуктовые сенсоры и публикацию телеметрии.
- Инициализацию периферии (FastLED, Wire, ImprovWiFi).
- Composition root в
main.cpp.
Признак кода в продукте: без замены железа или конфигурации он бессмысленен.
Конкретные примеры¶
| Код | Где живёт | Почему |
|---|---|---|
MqttClient |
библиотека | любому продукту нужен MQTT |
CloudStateMachine |
библиотека | provisioning/claiming одинаков для всех |
ArduinoWifiManager |
библиотека | WiFi-подключение не зависит от продукта |
LedStripProfile |
продукт | специфика Storage Link TODO: общее название Storage во всем докумете |
LedStripExecutor |
продукт | управляет FastLED, не нужен другим устройствам |
Sht31ClimateSensor |
продукт | конкретный сенсор конкретного продукта |
StorageTelemetryPublisher |
продукт | знает о формате телеметрии Storage Link |
IProfile |
библиотека | контракт, который библиотека вызывает |
BambuClient |
библиотека | интеграция переиспользуется в iDryer и iHeater |
Интерфейсы как граница¶
Библиотека знает о продукте только через IProfile. Всё взаимодействие идёт через пять методов:
profile->onOnline(); // библиотека → продукт: первый выход в онлайн
profile->loop(); // библиотека → продукт: каждый цикл
profile->buildInfoJson(buf, len); // библиотека → продукт: нужен info-payload
profile->getConfig(doc); // библиотека → продукт: нужен конфиг
profile->applyConfig(id, val); // библиотека → продукт: пришла команда set
Продукт знает о библиотеке через MqttClient (для публикации телеметрии/событий) и через колбэки ActionDispatcher (для команд).
Что не должно пересекать границу¶
- Библиотека не должна включать продуктовые заголовки.
- Продукт не должен вызывать
CloudStateMachine::handleProvisioning()или другие приватные методы стека напрямую — только через публичный API. - Продуктовая телеметрия публикуется напрямую в
s_mqtt.publishTelemetry()— рантайм её не видит.