IdryerRuntime¶
IdryerRuntime はトップレベルのデバイス コーディネーターです。CloudStateMachine、ActionDispatcher、IProfile、および MqttClient を単一のエントリーポイントに接続します:begin() / loop()。
コンストラクタ¶
IdryerRuntime::IdryerRuntime(
cloud::CloudStateMachine* cloud,
ActionDispatcher* dispatcher,
IProfile* profile,
MqttClient* mqtt
);
4つのパラメーターはすべて必須です。profile は nullptr である可能性があります(ランタイムはメソッドを呼ぶ前にチェックします)。
スタートアップ¶
実行:
MqttClientの内部CommandCallbackを登録します。cloud->begin()を呼びます。
setup() で一度呼び出します。setCommandHandler() の後。
メインループ¶
各呼び出し:
cloud->loop()を呼び出します — 状態機械を進行させます。profile->loop()を呼び出します — プロダクト ロジック。- オンライン状態への最初の遷移時:
profile->onOnline()を呼び出します。profile->buildInfoJson()を呼び出して結果をidryer/{serial}/infoに発行(保持)します。- オンライン状態喪失時:フラグをリセットして次のオンライン遷移が再度発火するようにします。
組み込みハンドリング¶
ping¶
常にランタイムで処理 — CommandHandler に渡されません。
data["timestamp"](形式 "YYYY-MM-DDTHH:MM:SSZ")を抽出し、settimeofday() でシステム時刻を同期してから、情報ペイロードを再発行します。
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))
{
// Respond to both transports:
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...
}
// in setup():
runtime.setCommandHandler(handleCommand); // MQTT
local.setCommandSink(handleCommand); // local WS
CommandHandler が登録されていない場合
ランタイムは組み込みルーティングを使用します:invoke → ActionDispatcher、set → ActionDispatcher、invoke device.getConfig → 設定を発行します。これがデフォルト動作です。互換性のため保持されています。
オンライン ステータス¶
CloudStateMachine がオンライン状態にある場合は true を返します。
ランタイムが実行しないこと¶
- テレメトリを発行しません。それはプロダクトの責任です。
- MQTT 再接続を直接管理しません。
CloudStateMachineがそれを処理します。 - デバイス固有の設定パラメーターについて知りません。