package tutorials.t02_data_access;
import java.net.URI;
import java.util.ArrayList;
import java.util.List;
import plccom.opc.ua.sdk.client.application.ClientConfiguration;
import plccom.opc.ua.sdk.client.application.MonitoredItem;
import plccom.opc.ua.sdk.client.application.SortDirection;
import plccom.opc.ua.sdk.client.application.UaClient;
import plccom.opc.ua.sdk.client.application.UaSubscription;
import plccom.opc.ua.sdk.client.application.listener.MonitoredItemNotificationListener;
import plccom.opc.ua.sdk.client.application.listener.SessionConnectionStateChangeListener;
import plccom.opc.ua.sdk.client.application.listener.SessionKeepAliveListener;
import plccom.opc.ua.sdk.client.application.listener.SubscriptionListener;
import plccom.opc.ua.sdk.client.core.attributes.UaAttributes;
import org.opcfoundation.ua.builtintypes.DataValue;
import org.opcfoundation.ua.builtintypes.DateTime;
import org.opcfoundation.ua.builtintypes.LocalizedText;
import org.opcfoundation.ua.builtintypes.NodeId;
import org.opcfoundation.ua.builtintypes.StatusCode;
import org.opcfoundation.ua.common.ServiceResultException;
import org.opcfoundation.ua.core.EndpointDescription;
import org.opcfoundation.ua.core.EventFieldList;
import org.opcfoundation.ua.core.Identifiers;
import org.opcfoundation.ua.core.MonitoredItemCreateRequest;
import org.opcfoundation.ua.core.MonitoringMode;
import org.opcfoundation.ua.core.MonitoringParameters;
import org.opcfoundation.ua.core.ReadValueId;
import org.opcfoundation.ua.core.ServerState;
import org.opcfoundation.ua.core.ServerStatusDataType;
public class Tutorial23_monitoring_nodes implements SessionKeepAliveListener, SessionConnectionStateChangeListener,
MonitoredItemNotificationListener, SubscriptionListener {
// Developer's TODO
// Submit your license information from your license e-mail
private final String LicenseUserName = "<Enter your UserName here>";
private final String LicenseSerial = "<Enter your Serial here>";
public static void main(String[] args) {
Tutorial23_monitoring_nodes prog = new Tutorial23_monitoring_nodes();
prog.start();
}
private void start() {
try {
String hostname = "localhost";
int port = 4840;
// create a discovery uri
URI discoveryUri = new URI(String.format("opc.tcp://%s:%s", hostname, port));
System.out.println(String.format("reading Endports from discoveryUri %s", discoveryUri.toString()));
// Get endpoints from ua Server with discovery url
EndpointDescription[] endpoints = UaClient.discoverEndpoints(discoveryUri);
// sort endpoint by message security mode
endpoints = UaClient.sortBySecurityLevel(endpoints, SortDirection.Asc);
if (endpoints.length > 0) {
// create Sessionconfiguration and set the default publishing
// interval
ClientConfiguration clientConfiguration = new ClientConfiguration(
new LocalizedText("ExampleApplication", "en"), endpoints[0]);
// set default publishing interval to 1000 milliseconds
clientConfiguration.setDefaultPublishingInterval(1000.0);
// enable auto connect functionality
// set automatic reconnect after 1000 milliseconds in case of losing connection
clientConfiguration.setAutoConnectEnabled(true, 1000);
// Create new OPCUAClient
try (UaClient myClient = new UaClient(LicenseUserName, LicenseSerial, clientConfiguration)) {
// print license informations
System.out.println(myClient.getLicenceMessage());
myClient.addSessionKeepAliveListener(this);
myClient.addSessionConnectionStateChangeListener(this);
myClient.getSubscriptionManager().addSubscriptionListener(this);
// Setting up monitoring parameters
MonitoringParameters parameters = new MonitoringParameters();
parameters.setSamplingInterval(1000.0);
// Create the request list
List<MonitoredItemCreateRequest> requests = new ArrayList<MonitoredItemCreateRequest>();
// create and add a create request for a monitoring item
// identificated by browse path
try {
ReadValueId readValueId = new ReadValueId(
myClient.getNodeIdByPath("Objects.Server.Data.Dynamic.Scalar.Int32Value"),
UaAttributes.Value.getValue(), null, null);
requests.add(new MonitoredItemCreateRequest(readValueId, MonitoringMode.Reporting, parameters));
} catch (ServiceResultException e) {
e.printStackTrace();
System.out.println(e.getMessage());
}
// create and add a create request for a monitoring item
// identificated by node
{
ReadValueId readValueId = new ReadValueId(Identifiers.Server_ServerStatus_CurrentTime,
UaAttributes.Value.getValue(), null, null);
requests.add(new MonitoredItemCreateRequest(readValueId, MonitoringMode.Reporting, parameters));
}
// create and add a create request for a monitoring item
// identificated by NodeId
try {
ReadValueId readValueId = new ReadValueId(new NodeId(2, 10847), UaAttributes.Value.getValue(),
null, null);
requests.add(new MonitoredItemCreateRequest(readValueId, MonitoringMode.Reporting, parameters));
} catch (Exception e) {
System.out.println(e.getMessage());
}
// create and add a subscription
UaSubscription subscription = myClient.getSubscriptionManager().createSubscription();
// Create, monitoring items and add monitoring item event
// listener
List<MonitoredItem> monitoredItems = subscription.createMonitoredItems(requests, new MonitoredItemNotificationListener() {
@Override
public void onValueNotification(MonitoredItem monitoredItem, DataValue value) {
// TODO Automatisch generierter Methodenstub
}
@Override
public void onEventNotification(MonitoredItem monitoredItem, EventFieldList eventFieldList) {
// TODO Automatisch generierter Methodenstub
}
});
// Logging output
for (MonitoredItem monitoredItem : monitoredItems)
if (monitoredItem.getStatusCode().isGood())
System.out.println(String.format("monitoredItem successfully %s created",
monitoredItem.getDisplayName()));
else
System.out.println(String.format("cannot create monitoredItem %s, Statuscode: %s",
monitoredItem.getDisplayName(), monitoredItem.getStatusCode()));
System.in.read();
// cleaning up
myClient.getSubscriptionManager().closeAndClearAllSubscriptions();
}
} else {
System.out.println("no endpoints found");
}
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void onValueNotification(MonitoredItem monitoredItem, DataValue value) {
System.out.println(String.format("Value notification for NodeId %s arrived with Value: %s StatusCode: %s",
monitoredItem.getReadValueId().getNodeId().toString(), value.getValue().toString(),
value.getStatusCode().toString()));
}
@Override
public void onEventNotification(MonitoredItem monitoredItem, EventFieldList eventFieldList) {
System.out.println(String.format("Event notification for NodeId %s arrived", monitoredItem.getDisplayName()));
}
@Override
public void onStatusChangeNotification(UaSubscription subscription, StatusCode statusCode) {
System.out.println(String.format("StatusChangeNotification with statusCode %s on subscription %s", statusCode,
subscription));
}
@Override
public void onPublishFailure(ServiceResultException error) {
System.out.println(String.format("onPublishFailure %s ", error.getMessage()));
}
@Override
public void onNotificationDataLost(UaSubscription subscription) {
System.out.println(String.format("onNotificationDataLost on subscription %s", subscription));
}
@Override
public void onSubscriptionKeepAlive(UaSubscription subscription, DateTime publishTime) {
System.out.println(String.format("onSubscriptionKeepAlive with subscription %s", subscription));
}
@Override
public void onSessionKeepAlive(ServerStatusDataType serverStatusDataType, ServerState serverState) {
System.out.println("incoming Keepalive => Serverstate: " + serverState.toString());
}
@Override
public void onSessionConnectionStateChanged(boolean isConnected) {
System.out.println("incoming SessionConnectionState => Session Connected = " + isConnected);
}
}