问题描述
1,我需要监视节点中的一个属性(例如:totalWp)。如果此属性更改,则需要获取此节点下的所有其他属性(PT ...)。我的代码无法获得预期的结果,请告诉我,我该怎么办?
protected CompletableFuture<UaSubscription> createValueSubscription(String deviceid) {
final CompletableFuture<UaSubscription> result = new CompletableFuture<>();
try {
Node node = this.getDeviceNode(deviceid);
NodeId parentId = node.getNodeId().get();
UaSubscriptionManager subscriptionManager = this.getopcuaClient().getSubscriptionManager();
CompletableFuture<UaSubscription> subscriptionFuture = subscriptionManager.createSubscription(5000.0);
subscriptionFuture.whenComplete((subscription,e) -> {
if (e != null) {
result.completeExceptionally(e);
} else {
subscription.addNotificationListener(new UaSubscription.NotificationListener() {
@Override
public void onDataChangeNotification(UaSubscription subscription,List<UaMonitoredItem> monitoredItems,List<DataValue> dataValues,DateTime publishTime) {
Iterator<UaMonitoredItem> itemIterator = monitoredItems.iterator();
Iterator<DataValue> dataValueIterator = dataValues.iterator();
while (itemIterator.hasNext() && dataValueIterator.hasNext()) {
logger.info("--- subscription value received: item= " + itemIterator.next().getReadValueId().getNodeId()
+ ",value=" + dataValueIterator.next().getValue() + " ---");
}
}
});
NodeId valueId = OpcuaClientUtils.createDeviceAttributeId(parentId,"totalWp");
NodeId pt = OpcuaClientUtils.createDeviceAttributeId(parentId,"PT");
ReadValueId readTotalWpId = new ReadValueId(valueId,AttributeId.Value.uid(),null,null);
ReadValueId readPtId = new ReadValueId(pt,null);
UInteger clientHandle = uint(clientHandles.getAndIncrement());
MonitoringParameters parameters = new MonitoringParameters(
clientHandle,1000.0,// sampling interval
null,// filter,null means use default
Unsigned.uint(10),// queue size
true // discard oldest
);
MonitoredItemCreateRequest requestTotalWp = new MonitoredItemCreateRequest(readTotalWpId,MonitoringMode.Reporting,parameters);
MonitoredItemCreateRequest requestPt = new MonitoredItemCreateRequest(readPtId,parameters);
// requests.add(requestPt);
CompletableFuture<List<UaMonitoredItem>> future =
subscription.createMonitoredItems(
TimestampsToReturn.Both,newArrayList(requestTotalWp),(item,id) -> onValueChanged(deviceid,item,id)
);
future.whenComplete((items,ex) -> {
if (ex == null) {
result.complete(subscription);
} else {
result.completeExceptionally(ex);
}
});
} ;
});
} catch (Exception e) {
result.completeExceptionally(e);
}
return result;
}
解决方法
您仅创建1个MonitoredItem:
CompletableFuture<List<UaMonitoredItem>> future =
subscription.createMonitoredItems(
TimestampsToReturn.Both,newArrayList(requestTotalWp),(item,id) -> onValueChanged(deviceId,item,id)
);
如果要接收其他节点的更改,则还需要为其创建MonitoredItems。