我在使用 ANSI C 堆栈中的 OPC UA 订阅和通知时遇到问题。OPC UA 第 4 部分,服务 说:
5.13.1 订阅模型 5.13.1.1 描述 c) NotificationMessages 被发送到客户端以响应发布请求。
怎么寄?我真的期待某种回调,但似乎没有。它确实说这些是对“发布”请求的响应,但是发布服务调用确认收到通知,它似乎没有请求。此外,这将是轮询,订阅和监控的全部意义在于不进行轮询。
任何人都可以提供一个示例来显示在 ANSI C 中监视数据值吗?
PublishRequests 在服务器上排队,只有在通知准备好或需要发送保持活动状态时才返回响应(或一堆其他东西,请检查第 4 部分中的状态机描述)。
它们确实也包括对先前收到的通知的确认,但其想法是不会立即做出响应,并且客户端通常会不断抽出 PublishRequests 以便服务器有一个队列准备好在订阅需要时返回通知至。
是的,这是投票。这不是严格意义上的不请自来,这有点令人遗憾,但这就是它的工作方式。
__
编辑:
这不是真正的投票。它是通过异常批量报告的,具有 QoS 保证和后续 PublishRequests 提供的背压机制。
这是 C# 代码。我希望它会帮助你。
private NotificationMessageReceivedEventHandler
m_NotificationMessageReceived;
// ...
m_NotificationMessageReceived =
new NotificationMessageReceivedEventHandler
(Subscription_NotificationMessageReceived);
m_subscription.NotificationMessageReceived +=
Subscription_NotificationMessageReceived;
// ...
private void Subscription_NotificationMessageReceived
(Subscription subscription,
NotificationMessageReceivedEventArgs e)
{
if (e.NotificationMessage.NotificationData == null ||
e.NotificationMessage.NotificationData.Count == 0)
{
LogMessage("{0:HH:mm:ss.fff}: KeepAlive",
e.NotificationMessage.PublishTime.ToLocalTime());
}
}