OPC UA 订阅和通知
OPC UA Subscriptions and Notifications
我在使用 ANSI C 堆栈中的 OPC UA 订阅和通知时遇到问题。 OPC UA 第 4 部分,服务说:
5.13.1 Subscription model
5.13.1.1 Description c) NotificationMessages are sent to the Client in response to Publish requests.
怎么发的?我真的很期待某种回调,但似乎没有。它确实说这些是对 'Publish' 请求的响应,但是发布服务调用确认收到通知,它似乎没有请求。此外,那将是轮询,而订阅和监控的全部意义在于不进行轮询。
任何人都可以提供一个示例来显示在 ANSI C 中监视数据值吗?
PublishRequests 在服务器上排队,响应仅在通知准备就绪或需要发送保持活动状态时才 returned(或一堆其他内容,请查看第 4 部分中的状态机描述).
它们确实也包括对先前收到的通知的确认,但想法是不会立即收到响应,并且客户端通常会不断发送 PublishRequests,以便服务器有一个队列准备好 return 订阅需要时通知。
是的,正在轮询。严格来说它不是主动提供的,这有点令人失望,但这就是它的工作原理。
__
编辑:
这不是真正的轮询。它是异常的批量报告,具有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());
}
}
我在使用 ANSI C 堆栈中的 OPC UA 订阅和通知时遇到问题。 OPC UA 第 4 部分,服务说:
5.13.1 Subscription model 5.13.1.1 Description c) NotificationMessages are sent to the Client in response to Publish requests.
怎么发的?我真的很期待某种回调,但似乎没有。它确实说这些是对 'Publish' 请求的响应,但是发布服务调用确认收到通知,它似乎没有请求。此外,那将是轮询,而订阅和监控的全部意义在于不进行轮询。
任何人都可以提供一个示例来显示在 ANSI C 中监视数据值吗?
PublishRequests 在服务器上排队,响应仅在通知准备就绪或需要发送保持活动状态时才 returned(或一堆其他内容,请查看第 4 部分中的状态机描述).
它们确实也包括对先前收到的通知的确认,但想法是不会立即收到响应,并且客户端通常会不断发送 PublishRequests,以便服务器有一个队列准备好 return 订阅需要时通知。
是的,正在轮询。严格来说它不是主动提供的,这有点令人失望,但这就是它的工作原理。
__
编辑:
这不是真正的轮询。它是异常的批量报告,具有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());
}
}