创建 Subscription (C)
DARRA_OPCUA_API DarraUa_Status DARRA_OPCUA_CALL DarraUa_Subscription_Create(
DarraUa_SessionHandle session,
const DarraUa_SubscriptionConfig* cfg,
DarraUa_SubscriptionHandle* out_sub);
前置阅读 / 配套
- 添加 MonitoredItem 请看 添加 MonitoredItem.
- DataChange 回调字段请看 DataChange 事件.
DarraUa_SubscriptionConfig 字段
typedef struct {
double publishing_interval_ms; /* 默认 500 */
uint32_t lifetime_count; /* 默认 2400 */
uint32_t max_keep_alive_count; /* 默认 10 */
uint32_t max_notifications; /* 0 = 无限 */
uint8_t priority; /* 0-255 */
int32_t publishing_enabled; /* 1 = 启用 */
} DarraUa_SubscriptionConfig;
DARRA_OPCUA_API void DARRA_OPCUA_CALL
DarraUa_SubscriptionConfig_Init(DarraUa_SubscriptionConfig* cfg);
| 类别 | 属性 | 类型 | 访问 | 说明 |
|---|---|---|---|---|
| 发布 | publishing_interval_ms | double | in | 服务端推送数据的最小间隔, 服务端可能 revise (调整). 默认 500 |
publishing_enabled | int32_t | in | 1 = 启用 publish, 0 = 仅采样不推送 | |
| 生命周期 | lifetime_count | uint32_t | in | 多少个 publish 周期没收到 PublishRequest 就清理订阅, 默认 2400 |
max_keep_alive_count | uint32_t | in | 没新数据时多久发一次空 KeepAlive, 默认 10 | |
max_notifications | uint32_t | in | 单次 Publish 最多发多少条通知, 0 = 不限 | |
| 调度 | priority | uint8_t | in | 订阅优先级 0-255 |
务必先调 DarraUa_SubscriptionConfig_Init(&cfg) 填默认值再覆写.
用法
DarraUa_SubscriptionConfig sc;
DarraUa_SubscriptionConfig_Init(&sc);
sc.publishing_interval_ms = 500.0;
sc.publishing_enabled = 1;
DarraUa_SubscriptionHandle sub = DARRA_UA_INVALID_SUBSCRIPTION_HANDLE;
DarraUa_Status st = DarraUa_Subscription_Create(h, &sc, &sub);
if (!DARRA_UA_STATUS_IS_GOOD(st) || sub == DARRA_UA_INVALID_SUBSCRIPTION_HANDLE) {
fprintf(stderr, "Subscription_Create failed: %s\n", DarraUa_StatusName(st));
return -1;
}
多订阅分流
如果一个应用既要 100 ms 高频订阅 (运动数据) 又要 5000 ms 低频订阅 (环境温度), 创建 2 个 Subscription 分流, 不要混在一个里:
DarraUa_SubscriptionConfig fast_cfg;
DarraUa_SubscriptionConfig_Init(&fast_cfg);
fast_cfg.publishing_interval_ms = 100.0;
fast_cfg.publishing_enabled = 1;
DarraUa_SubscriptionConfig slow_cfg;
DarraUa_SubscriptionConfig_Init(&slow_cfg);
slow_cfg.publishing_interval_ms = 5000.0;
slow_cfg.publishing_enabled = 1;
DarraUa_SubscriptionHandle fast = 0, slow = 0;
DarraUa_Subscription_Create(h, &fast_cfg, &fast);
DarraUa_Subscription_Create(h, &slow_cfg, &slow);
DarraUa_Subscription_AddNode(fast, "ns=2;s=AxisPosition", DARRA_UA_ATTR_VALUE,
-1.0, on_change, NULL, NULL);
DarraUa_Subscription_AddNode(slow, "ns=2;s=AmbientTemperature", DARRA_UA_ATTR_VALUE,
-1.0, on_change, NULL, NULL);
每个 Subscription 都是独立的发布节奏, 互不影响.
释放
DarraUa_Subscription_Delete(sub);
订阅删除后所有 MI 一起销毁, 服务端发 DeleteSubscription 释放资源.