Subscription 订阅
darra::opcua::Subscription 是订阅容器, 管理一批 MonitoredItem (MI), 通过 std::function 回调推送 DataValue. Move-only, 析构自动 DeleteSubscription.
子页跳转
- 创建订阅请参考 创建 Subscription.
- 添加 / 批量添加 MonitoredItem 请参考 添加 MonitoredItem.
- 改 publishingInterval / lifetime / sampling 请参考 Modify.
- 切 Disabled / Sampling / Reporting 请参考 SetMonitoringMode.
- 请求重发指定 SeqNo 请参考 Republish.
- 数据回调字段与线程模型请参考 数据回调.
- OPC UA 报警 / 事件订阅请参考 事件订阅.
一分钟速览
// 创建
auto sub = s.CreateSubscription(/*publishing_interval_ms=*/500.0);
// 添加 MI + 回调 (lambda)
auto h = sub.AddNode("ns=2;s=Counter", [](DataValue const& dv) {
std::cout << dv.Value().AsString() << "\n";
});
// 批量添加
std::vector<std::string> nodes;
for (int i = 1; i <= 100; ++i) nodes.push_back("ns=2;s=T" + std::to_string(i));
auto results = sub.AddMany(nodes, [](DataValue const& dv) {
std::cout << dv.Value().AsString() << "\n";
});
// 改单个 MI 的采样间隔
sub.ModifyItem(h, /*sampling_interval_ms=*/100.0);
// 暂停 / 恢复采集
sub.SetMode(h, MonitoringMode::Disabled);
sub.SetMode(h, MonitoringMode::Reporting);
// 移除
sub.Remove(h);
订阅生命周期事件
s.Events().on_any = [](OpcUaEventEntry const& e) {
if (e.category == OpcUaEventCategory::SubscriptionCreated) { /* ... */ }
if (e.category == OpcUaEventCategory::MonitoredItemAdded) { /* ... */ }
if (e.category == OpcUaEventCategory::SubscriptionLost) { /* ... */ }
};
详见 Session 事件.