能力注册器
CapabilityRegistry 是设备能力的中央注册表,用于注册动作处理器(Action Handlers)和数据上报器(Data Reporters)。
类定义
namespace streamind {
class CapabilityRegistry;
}动作处理器
RegisterAction()
注册指令处理器。
函数签名:
void RegisterAction(
const std::string& action_name,
ActionHandler handler
);参数:
action_name: 指令名称(如 “motor.move”, “led.set_color”)handler: 处理函数,返回bool表示成功/失败
示例:
registry.RegisterAction("servo.rotate", [](const Directive& dir) {
int angle = dir.GetIntParameter("angle", 90);
servo_set_angle(angle);
return true;
});注意:
- 处理器在 SDK 内部线程执行,保持处理速度快
- 长时间任务应使用
ExecuteHardwareTask()异步执行
SupportsAction()
检查是否支持某个指令。
函数签名:
bool SupportsAction(const std::string& action_name) const;GetSupportedActions()
获取所有已注册的指令列表。
函数签名:
std::vector<std::string> GetSupportedActions() const;数据上报器
RegisterEventData()
注册事件触发的数据源。
函数签名:
void RegisterEventData(
const std::string& data_type,
DataReporter reporter,
const std::string& trigger_event
);示例:
registry.RegisterEventData("sensor.distance", []() {
cJSON* data = cJSON_CreateObject();
cJSON_AddNumberToObject(data, "distance_cm", ultrasonic_read());
return data;
}, "motion_detected");RegisterTimerData()
注册定时上报的数据源。
函数签名:
void RegisterTimerData(
const std::string& data_type,
DataReporter reporter,
int interval_ms
);示例:
// 每 5 秒上报一次温度
registry.RegisterTimerData("sensor.temperature", []() {
cJSON* data = cJSON_CreateObject();
cJSON_AddNumberToObject(data, "celsius", read_temperature());
return data;
}, 5000);TriggerEventReport()
触发事件数据上报。
函数签名:
int TriggerEventReport(const std::string& event_name);返回值:触发的数据源数量。
数据类型
ActionHandler
using ActionHandler = std::function<bool(const foundation::Directive&)>;DataReporter
using DataReporter = std::function<cJSON*()>;注意:返回的 cJSON 对象由调用者负责释放。
完整示例
#include <streamind.h>
void setup_capabilities() {
auto& sdk = streamind::SDK::GetInstance();
auto& registry = sdk.GetRegistry();
// 注册动作
registry.RegisterAction("led.on", [](const Directive& dir) {
gpio_set_level(LED_PIN, 1);
return true;
});
// 注册定时数据
registry.RegisterTimerData("sensor.temperature", []() {
cJSON* data = cJSON_CreateObject();
cJSON_AddNumberToObject(data, "celsius", read_temp());
return data;
}, 10000); // 每 10 秒
}Last updated on