跳到主要内容

readHistoryEvents

如果服务端记录事件历史 (HistoryRead Events), 客户端可以按时间区间拉历史事件.

配套

签名

public List<OpcUaEventSubscription.EventArrivedEventArgs> readHistoryEvents(
String nodeId, // 通常 i=2253 Server
Instant start,
Instant end,
int maxEvents);

返回的 EventArrivedEventArgs 复用实时事件订阅的同一类型 (字段对齐).

EventArrivedEventArgs 字段

字段类型说明
severityint1-1000
messageString事件文本
sourceNameString事件源名
timeFtlongFileTime, 0 = null
eventTypeString事件类型 NodeId

用法

import java.time.Instant;
import java.time.Duration;

List<OpcUaEventSubscription.EventArrivedEventArgs> events = ua.readHistoryEvents(
WellKnownNodes.SERVER,
Instant.now().minus(Duration.ofDays(1)),
Instant.now(),
0);

for (OpcUaEventSubscription.EventArrivedEventArgs e : events) {
long ft = e.timeFt;
Instant t = (ft > 0)
? Instant.ofEpochMilli((ft - 116444736000000000L) / 10000L)
: Instant.now();
System.out.printf("[%d] %s: %s @ %s%n",
e.severity, e.sourceName, e.message, t);
}

自定义 EventFilter

当前 SDK 默认拉常用 4 个字段 (Severity / Message / SourceName / Time). 复杂过滤 (按 EventType / Severity / SourceNode) 待后续版本暴露 builder API.


服务端要求

  • 必须支持 HistoryRead Events (服务端 ServerCapabilities 标志位)
  • 事件源节点必须有 EventNotifier Attribute (12) bit 1 (HistoryRead) 置位

与实时事件订阅的关系

API拿什么
subscribeEvents(...)实时事件 (订阅期间发生的)
readHistoryEvents(...)历史事件 (服务端归档的)

通常组合用: 启动时 readHistoryEvents 拉过去 24 小时, 然后 subscribeEvents 接管实时.

下一步