创建 Subscription
Subscription CreateSubscription(double publishing_interval_ms = 500.0);
前置阅读 / 配套
- 添加 MonitoredItem 请看 添加 MonitoredItem.
- 数据回调字段请看 数据回调.
参数
| 参数 | 默认 | 说明 |
|---|---|---|
publishing_interval_ms | 500.0 | 服务端推送数据的最小间隔 (ms), 服务端可能 revise (调整) |
例子
auto sub = s.CreateSubscription(500.0);
std::cout << "Subscription handle = " << sub.Handle() << "\n";
std::cout << "Initial interval = " << sub.PublishingIntervalMs() << " ms\n";
多订阅分流
如果一个应用既要 100 ms 高频订阅 (运动数据) 又要 5000 ms 低频订阅 (环境温度), 创建 2 个 Subscription 分流, 不要混在一个里:
auto fast = s.CreateSubscription(100.0);
fast.AddNode("ns=2;s=AxisPosition", [](DataValue const& dv) { /* ... */ });
auto slow = s.CreateSubscription(5000.0);
slow.AddNode("ns=2;s=AmbientTemperature", [](DataValue const& dv) { /* ... */ });
每个 Subscription 都是独立的发布节奏, 互不影响.
Subscription 公共属性 (访问器)
| 类别 | 属性 | 类型 | 访问 | 说明 |
|---|---|---|---|---|
| 标识 | Handle() | DarraUa_SubscriptionHandle | R | C 层句柄 (服务端订阅 ID 关联) |
| 配置 | PublishingIntervalMs() | double | R | 实际生效的发布间隔 (revised), 由 Modify() 更新 |
Subscription 公共方法
| 方法 | 说明 |
|---|---|
AddNode(node_id, cb, attr = Value, sampling_ms = -1) | 添加单 MI |
AddMany(node_ids, cb, attr = Value) | 批量添加, 返回 (handle, status) 列表 |
Remove(mi_handle) | 移除单 MI |
RemoveByNodeId(node_id) | 按 NodeId 移除全部对应 MI |
SetPublishingEnabled(bool) | 启停整条订阅的发布 |
Pump(timeout_ms = 2000) | 手动触发一次 Publish (AutoPublish 启用时无需手调) |
Modify(publishing_interval_ms, lifetime, keep_alive, ...) | 改订阅参数 |
SetMonitoringMode(mode, mi_handles) | 批量切 mode |
SetMode(handle, mode) | 切单个 MI mode |
ModifyMonitoredItems(requests) | 批量改采样 |
ModifyItem(handle, sampling_ms, queue_size, discard_oldest) | 改单 MI |
Republish(seq_no) | 请求重发 |
~Subscription() | RAII 析构 → 服务端 DeleteSubscription |
RAII
Subscription 是 Move-only 栈对象, 离开作用域自动 DeleteSubscription:
{
auto sub = s.CreateSubscription(500.0);
sub.AddNode("ns=2;s=Counter", [](DataValue const& dv) { /* ... */ });
std::this_thread::sleep_for(std::chrono::seconds(10));
} // sub 析构, 服务端 DeleteSubscription