跳到主要内容

Republish (C)

如果某个 NotificationMessage 因为网络丢包客户端没收到, Republish 让服务端从缓存里重发:

DARRA_OPCUA_API DarraUa_Status DARRA_OPCUA_CALL DarraUa_Subscription_Republish(
DarraUa_SubscriptionHandle h,
uint32_t retransmit_sequence_number);
一般无需调用

正常情况下 SDK 内部 AutoPublish 处理 SequenceNumber Ack, 客户端无感. 本 API 仅在特殊场景 (主动补包 / 调试) 使用.

何时用

  • 客户端检测到 SequenceNumber 不连续 (gap), 主动补
  • 临时网络故障后, 想拿回这段时间的数据
  • 调试期 / 测试 SDK Republish 行为

用法

DarraUa_Status st = DarraUa_Subscription_Republish(sub, /*seqNo*/ 12345);
if (DARRA_UA_STATUS_IS_GOOD(st))
printf("Server confirmed retransmit, data will arrive in next Publish\n");
else
printf("Republish failed: %s\n", DarraUa_StatusName(st));

注意

  • 服务端只缓存最近 N 条 NotificationMessage (典型 N = 10), 超出的拿不回
  • Republish 是请求服务端 "下次 Publish 时重发", 不是直接拿数据
  • 重发的数据通过正常 OnDataChange 回调, 客户端无需特殊处理
  • 失败码 DARRA_UA_STATUS_BAD_MESSAGE_NOT_AVAILABLE 表示该 SequenceNumber 已超出缓存

与 TransferSubscriptions 的区别

API含义
Republish服务端记得 Subscription, 只是某条消息漏了
Session_TransferSubscriptionsSession 重连后接管旧 Session 的订阅

下一步