Subscription 订阅 (C)
C SDK 的订阅由 DarraUa_SubscriptionHandle (uint32_t) 标识. 每个订阅是服务端推送的独立通道, 内部含一组 MonitoredItem (MI) 和它们各自的 DataChange 回调.
子页跳转
- 创建订阅请参考 Create.
- 添加 / 批量添加 MonitoredItem 请参考 添加 MonitoredItem.
- 改 publishingInterval / lifetime / sampling 请参考 Modify.
- 切 Disabled / Sampling / Reporting 请参考 SetMonitoringMode.
- 请求重发指定 SeqNo 请参考 Republish.
- DataChange 回调字段与线程模型请参考 DataChange 事件.
- OPC UA 报警 / 事件订阅请参考 事件订阅.
一分钟速览
#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 |
|---|---|
| 手动 Pump | DarraUa_Session_Publish(h, timeout_ms) (在主循环里周期调用) |
| 后台线程 (推荐) | DarraUa_Session_StartAutoPublish(h) / _Stop |
后台 Publish 模式下, 数据回调由 Stack 内部线程触发, 不需要业务持续 Pump. 但回调里不要做长操作 / UI 操作, 否则阻塞 Publish 队列.