MQTT-топики и сообщения¶
Все топики имеют форму idryer/{serial}/{suffix}, где {serial} — серийный номер устройства.
Этот документ описывает топики и команды, которые реализует MqttClient из idryer-core. Полный интерфейс платформы (все команды от бэкенда для всех типов устройств) находится в contracts/portal_backend_status.md.
Устройство → бэкенд¶
info¶
Публикуется один раз при первом выходе в Online, и повторно при получении команды ping.
Payload определяется продуктом через IProfile::buildInfoJson(). Минимально ожидаемые бэкендом поля: hardwareVersion, firmwareVersion, timestamp.
Пример для Storage Link:
{
"deviceType": "storage_link",
"firmwareVersion": "1.0.0",
"hardwareVersion": "1.0",
"timestamp": "2026-04-28T10:00:00Z"
}
telemetry¶
Публикуется продуктом через pub.publishTelemetry(). Библиотека не публикует автоматически.
Пример для Storage Link (климатический датчик):
status¶
Публикуется продуктом при изменении состояния через pub.publishStatus(). Payload определяется продуктом.
config¶
Публикуется при получении команды device.getConfig (invoke) или при ответе на get_config. Вызывается через pub.publishConfig() или pub.publishConfigRaw().
Для большого payload (> 16000 байт) публикуется чанками: каждый чанк содержит tid, idx, total, last, d.
config/delta¶
Частичное обновление конфига через pub.publishConfigDelta(). Бэкенд ожидает поле d (объект с изменениями).
events¶
Публикуется продуктом через pub.publishEvent(). Библиотека события не генерирует автоматически.
integrations/status¶
Публикуется LinkIntegrationsManager. Содержит состояние активной интеграции.
offline (LWT)¶
Устанавливается брокером автоматически при разрыве TCP-соединения. Устройство никогда не публикует этот топик вручную.
Бэкенд → устройство¶
Устройство подписывается на idryer/{serial}/commands/#.
commands/ping¶
Обрабатывается IdryerRuntime напрямую — синхронизирует системное время через settimeofday() и повторно публикует info.
commands/invoke¶
Предпочтительный путь для продуктовых действий. Библиотека передаёт команду в продуктовый CommandHandler (рекомендуемый путь). Если CommandHandler не зарегистрирован, команда попадает во встроенный ActionDispatcher (fallback).
Встроенное действие device.getConfig обрабатывается рантаймом или продуктовым handler'ом — вызывает IProfile::getConfig() и публикует результат.
commands/set¶
Установка одного параметра конфигурации. Передаётся в продуктовый CommandHandler (рекомендуемый путь). Fallback — встроенный ActionDispatcher::handleSet(), если CommandHandler не зарегистрирован.
commands/link_integration¶
Управление интеграциями. Обрабатывается LinkIntegrationsManager через продуктовый CommandHandler.
commands/bambu_apply¶
Применение параметров филамента к AMS-слоту принтера Bambu. Обрабатывается LinkIntegrationsManager.
Прочие команды платформы¶
Команды drying, storage, profile, stop, get_config, read_rfid, write_rfid и другие — часть полного интерфейса платформы iDryer. Они не обрабатываются idryer-core напрямую, а доставляются в продуктовый CommandHandler. Справочник: contracts/portal_backend_status.md.
Форматы топиков¶
// Формирование топика
idryer_make_topic(buf, sizeof(buf), serialNumber, "telemetry");
// → "idryer/DEVICE_AABBCCDDEEFF/telemetry"
Константы суффиксов определены в mqtt/idryer_topics.h:
#define IDRYER_TOPIC_INFO "info"
#define IDRYER_TOPIC_TELEMETRY "telemetry"
#define IDRYER_TOPIC_STATUS "status"
#define IDRYER_TOPIC_CONFIG "config"
#define IDRYER_TOPIC_CONFIG_DELTA "config/delta"
#define IDRYER_TOPIC_EVENTS "events"
#define IDRYER_TOPIC_OFFLINE "offline"
#define IDRYER_TOPIC_INTEGRATIONS_STATUS "integrations/status"
#define IDRYER_TOPIC_CMD_WILDCARD "commands/#"