1、I need to monitor an attribute (eg: totalWp) in a node. If this attribute changes, I need to get all other attributes (PT...) under this node. My code cannot get the expected result, please tell Me, what should I do?
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, AttributeId.Value.uid(), null, 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, MonitoringMode.Reporting, 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;
}
The above code only returns the monitored attributes, other attributes are not returned.
You are only creating 1 MonitoredItem:
If you want to receive changes for other Nodes then you need to create MonitoredItems for them as well.