IdryerRuntime¶
IdryerRuntime je top-level koordinátor zařízení. Propojuje CloudStateMachine, ActionDispatcher, IProfile a MqttClient do jednoho vstupního bodu: begin() / loop().
Konstruktor¶
IdryerRuntime::IdryerRuntime(
cloud::CloudStateMachine* cloud,
ActionDispatcher* dispatcher,
IProfile* profile,
MqttClient* mqtt
);
Všechny čtyři parametry jsou povinné. profile může být nullptr (runtime kontroluje před voláním jeho metod).
Spuštění¶
Provádí:
- Registruje interní
CommandCallbackvMqttClient. - Volá
cloud->begin().
Volejte jednou v setup(), po setCommandHandler().
Hlavní smyčka¶
Při každém volání:
- Volá
cloud->loop()— posunuje stavový stroj. - Volá
profile->loop()— logika produktu. - Při prvním přechodu do Online:
- Volá
profile->onOnline(). - Volá
profile->buildInfoJson()a publikuje výsledek naidryer/{serial}/info(retained). - Při ztrátě Online: resetuje příznak, aby se další přechod Online znovu aktivoval.
Vestavěné zpracování¶
ping¶
Vždy zpracováno runtimem — nepředáno CommandHandler.
Extrahuje data["timestamp"] (formát "YYYY-MM-DDTHH:MM:SSZ"), synchronizuje systémový čas prostřednictvím settimeofday() a znovu publikuje info payload.
CommandHandler — jediný bod rozšíření¶
using CommandHandler = std::function<void(const char* command, JsonObjectConst data)>;
void setCommandHandler(CommandHandler handler);
Všechny příchozí příkazy kromě ping jsou směrovány do registrovaného CommandHandler.
Toto je jediný oficiální způsob rozšíření zpracování příkazů. Používá se tak, aby MQTT a lokální WS transport convergovaly do jednoho bodu:
static void handleCommand(const char* cmd, JsonObjectConst data) {
if (strcmp(cmd, "get_config") == 0 ||
(strcmp(cmd, "invoke") == 0 && strcmp(data["action"] | "", "device.getConfig") == 0))
{
// Odpovídej oběma transportům:
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; }
// produktově specifické příkazy...
}
// v setup():
runtime.setCommandHandler(handleCommand); // MQTT
local.setCommandSink(handleCommand); // lokální WS
Pokud není CommandHandler registrován
Runtime používá vestavěné směrování: invoke → ActionDispatcher, set → ActionDispatcher, invoke device.getConfig → publikuje config. Toto je výchozí chování — zachováno pro kompatibilitu.
Online status¶
Vrací true, pokud je CloudStateMachine ve stavu Online.
Co runtime nedělá¶
- Nepublikuje telemetrii — to je odpovědnost produktu.
- Nespravuje reconnect MQTT přímo —
CloudStateMachineto řeší. - Nezná parametry specifické pro zařízení.