跳到主要内容

Call

前置 / 配套
  • 数据类型 Variant 是入参 / 出参的容器.
  • 找方法 NodeId 用 Browsefilter: NodeClass::Method.

签名

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();

下一步