跳到主要内容

创建 Subscription (C)

DARRA_OPCUA_API DarraUa_Status DARRA_OPCUA_CALL DarraUa_Subscription_Create(
DarraUa_SessionHandle session,
const DarraUa_SubscriptionConfig* cfg,
DarraUa_SubscriptionHandle* out_sub);
前置阅读 / 配套

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_msdoublein服务端推送数据的最小间隔, 服务端可能 revise (调整). 默认 500
publishing_enabledint32_tin1 = 启用 publish, 0 = 仅采样不推送
生命周期lifetime_countuint32_tin多少个 publish 周期没收到 PublishRequest 就清理订阅, 默认 2400
max_keep_alive_countuint32_tin没新数据时多久发一次空 KeepAlive, 默认 10
max_notificationsuint32_tin单次 Publish 最多发多少条通知, 0 = 不限
调度priorityuint8_tin订阅优先级 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 释放资源.

下一步