readHistoryEvents
如果服务端记录事件历史 (HistoryRead Events), 客户端可以按时间区间拉历史事件.
配套
- 实时事件订阅请用 事件订阅.
- 历史变量数据请用 ReadRaw / ReadProcessed.
签名
public List<OpcUaEventSubscription.EventArrivedEventArgs> readHistoryEvents(
String nodeId, // 通常 i=2253 Server
Instant start,
Instant end,
int maxEvents);
返回的 EventArrivedEventArgs 复用实时事件订阅的同一类型 (字段对齐).
EventArrivedEventArgs 字段
| 字段 | 类型 | 说明 |
|---|---|---|
severity | int | 1-1000 |
message | String | 事件文本 |
sourceName | String | 事件源名 |
timeFt | long | FileTime, 0 = null |
eventType | String | 事件类型 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 接管实时.