Call
签名
std::vector<Variant> Call(
std::string const& object_node_id,
std::string const& method_node_id,
std::vector<Variant> const& inputs);
| 参数 | 说明 |
|---|---|
object_node_id | 方法所在 Object 节点 |
method_node_id | 方法本身 NodeId |
inputs | 入参 Variant 列表 (借用, 不释放) |
返回 std::vector<Variant> 输出参数列表. 每个返回的 Variant 持有 native handle, 析构自动释放 (栈对象).
内存所有权
- 入参 inputs: SDK 内部仅借用
Handle(), 不释放. 调用方继续持有, 离开作用域时 Variant 析构. - 返回值 std::vector<Variant>: 每个 Variant 持有 native handle, 析构自动释放. 推荐用栈对象:
auto outputs = s.Call(obj_id, mtd_id, args);
for (auto const& v : outputs) {
int32_t x = 0;
v.TryGetInt32(x);
std::cout << x << "\n";
}
// outputs 离开作用域, 内部 Variant 全部析构
例子
// 调 Calculator.Add(3, 4)
std::vector<Variant> inputs;
{ Variant a; a.SetInt32(3); inputs.push_back(std::move(a)); }
{ Variant b; b.SetInt32(4); inputs.push_back(std::move(b)); }
auto outputs = s.Call(
"ns=2;s=Calculator",
"ns=2;s=Calculator.Add",
inputs);
for (auto const& v : outputs) {
int32_t sum = 0; v.TryGetInt32(sum);
std::cout << "sum = " << sum << "\n";
}
异常
| 异常 | 含义 |
|---|---|
Exception(..., BadNodeIdInvalid) | NodeId 解析失败 |
Exception(..., BadCommunicationError) | Transport 错 |
Exception(..., BadMethodInvalid) | 该 NodeId 不是 Method |
Exception(..., BadInvalidArgument) | 入参类型 / 个数不符 |
Exception(..., BadUserAccessDenied) | 无权限调 |
Exception(..., BadXxx) | 方法返回非 Good 业务码 |
业务级失败 (方法返回非 Good) 也抛异常, ex.status_code() 即业务码.
找方法的 NodeId
// 1. Browse Object 子节点过滤 Method
auto methods = s.Browse("ns=2;s=Calculator", NodeClass::Method);
for (auto const& m : methods) {
std::cout << " " << m.browse_name << " -> " << m.node_id << "\n";
}
// 2. 看入参 / 出参签名 (Browse 该方法节点的 Property)
auto props = s.Browse(methods[0].node_id); // 含 InputArguments / OutputArguments
输入参数构造
按方法签名构造 Variant:
// Add(Int32, Int32) -> Int32
Variant a; a.SetInt32(3);
Variant b; b.SetInt32(4);
std::vector<Variant> args;
args.push_back(std::move(a));
args.push_back(std::move(b));
// SetTemperature(string deviceId, double value)
Variant id; id.SetString("Boiler1");
Variant val; val.SetDouble(85.5);
// ...
// 复杂结构 (ExtensionObject) — 高级用法, 后续版本完善
异步 (后续版本)
当前 Call 是同步阻塞 (内部走 RPC + 等响应). 异步版本 (CallAsync 返回 std::future<...>) 在后续版本提供.
如果想异步, 用 std::async:
auto fut = std::async(std::launch::async, [&]() {
return s.Call(obj_id, mtd_id, args);
});
auto outputs = fut.get();