跳到主要内容

Subscription 订阅 (C)

C SDK 的订阅由 DarraUa_SubscriptionHandle (uint32_t) 标识. 每个订阅是服务端推送的独立通道, 内部含一组 MonitoredItem (MI) 和它们各自的 DataChange 回调.

子页跳转

一分钟速览

#include <darra_opcua/darra_opcua.h>

static void on_change(DarraUa_SubscriptionHandle sub,
DarraUa_MonitoredItemHandle mi,
const DarraUa_DataValue* dv,
void* ctx)
{
if (!dv) return;
uint32_t st = DarraUa_DataValue_GetStatus(dv);
DarraUa_DateTime ts = DarraUa_DataValue_GetSourceTimestamp(dv);
printf("[notify] mi=%u status=0x%08X ft=%lld\n",
(unsigned)mi, (unsigned)st, (long long)ts);
}

/* 创建订阅 */
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_Subscription_Create(h, &sc, &sub);

/* 添加 MI */
DarraUa_MonitoredItemHandle mi = DARRA_UA_INVALID_MONITORED_ITEM_HANDLE;
DarraUa_Subscription_AddNode(
sub, "ns=2;s=Counter", DARRA_UA_ATTR_VALUE,
-1.0, on_change, NULL, &mi);

/* 让 SDK 后台 Publish, 上层只需 sleep */
DarraUa_Session_StartAutoPublish(h);

/* ... 业务 ... */

/* 销毁 */
DarraUa_Session_StopAutoPublish(h);
DarraUa_Subscription_Delete(sub);

订阅生命周期事件

订阅级状态变化 (LATE / EXPIRED / RECREATING) 通过 DarraUa_Subscription_SetStateCallback 注册回调拿到, 详见 DataChange 事件.


Publish 模型

模式API
手动 PumpDarraUa_Session_Publish(h, timeout_ms) (在主循环里周期调用)
后台线程 (推荐)DarraUa_Session_StartAutoPublish(h) / _Stop

后台 Publish 模式下, 数据回调由 Stack 内部线程触发, 不需要业务持续 Pump. 但回调里不要做长操作 / UI 操作, 否则阻塞 Publish 队列.

下一步