IdryerRuntime¶
IdryerRuntime — верхний координатор устройства. Связывает CloudStateMachine, ActionDispatcher, IProfile и MqttClient в единую точку входа: begin() / loop().
Конструктор¶
IdryerRuntime::IdryerRuntime(
cloud::CloudStateMachine* cloud,
ActionDispatcher* dispatcher,
IProfile* profile,
MqttClient* mqtt
);
Все четыре параметра обязательны. profile может быть nullptr (рантайм проверяет перед вызовом его методов).
Запуск¶
Выполняет:
- Регистрирует внутренний
CommandCallbackвMqttClient. - Вызывает
cloud->begin().
Вызывать один раз в setup(), после setCommandHandler().
Основной цикл¶
Каждый вызов:
- Вызывает
cloud->loop()— продвигает стейт-машину. - Вызывает
profile->loop()— продуктовая логика. - При первом переходе в Online:
- Вызывает
profile->onOnline(). - Вызывает
profile->buildInfoJson()и публикует результат вidryer/{serial}/info(retained). - При потере Online: сбрасывает флаг, чтобы следующий выход снова сработал.
Встроенная обработка¶
ping¶
Всегда обрабатывается рантаймом — не передаётся в CommandHandler.
Извлекает data["timestamp"] (формат "YYYY-MM-DDTHH:MM:SSZ"), синхронизирует системное время через settimeofday(), затем повторно публикует info-payload.
CommandHandler — единый путь расширения¶
using CommandHandler = std::function<void(const char* command, JsonObjectConst data)>;
void setCommandHandler(CommandHandler handler);
Все входящие команды, кроме ping, направляются в зарегистрированный CommandHandler.
Это единственный официальный способ расширить обработку команд. Используется для того, чтобы MQTT и локальный WS-транспорт сходились в одну точку:
static void handleCommand(const char* cmd, JsonObjectConst data) {
if (strcmp(cmd, "get_config") == 0 ||
(strcmp(cmd, "invoke") == 0 && strcmp(data["action"] | "", "device.getConfig") == 0))
{
// Ответить на оба транспорта:
s_pub.publishConfig(doc);
return;
}
if (strcmp(cmd, "invoke") == 0) { s_dispatcher.handleInvoke(data); return; }
if (strcmp(cmd, "set") == 0) { s_dispatcher.handleSet(data); return; }
// product-specific commands...
}
// в setup():
runtime.setCommandHandler(handleCommand); // MQTT
local.setCommandSink(handleCommand); // локальный WS
Если CommandHandler не зарегистрирован
Рантайм использует встроенный роутинг: invoke → ActionDispatcher, set → ActionDispatcher, invoke device.getConfig → публикация конфига. Это поведение по умолчанию — оставлено для совместимости.
Статус Online¶
Возвращает true если CloudStateMachine находится в состоянии Online.
Что рантайм не делает¶
- Не публикует телеметрию — это задача продукта.
- Не управляет переподключением MQTT напрямую — это делает
CloudStateMachine. - Не знает о конкретных параметрах конфигурации устройства.