Search in sources :

Example 1 with IED

use of com.alliander.osgp.adapter.protocol.iec61850.infra.networking.helper.IED in project Protocol-Adapter-IEC61850 by OSGP.

the class Iec61850ChannelHandlerServer method processRegistrationMessage.

private void processRegistrationMessage(final RegisterDeviceRequest message, final String correlationId) {
    this.logMessage(message);
    String deviceIdentification = message.getDeviceIdentification();
    String deviceType = Ssld.SSLD_TYPE;
    final IED ied = IED.FLEX_OVL;
    String ipAddress = message.getIpAddress();
    // set, the values will be used to set an IP address for a device.
    if (this.testDeviceId != null && this.testDeviceId.equals(deviceIdentification) && this.testDeviceIp != null) {
        LOGGER.info("Using testDeviceId: {} and testDeviceIp: {}", this.testDeviceId, this.testDeviceIp);
        deviceIdentification = this.testDeviceId;
        deviceType = Ssld.SSLD_TYPE;
        ipAddress = this.testDeviceIp;
    }
    final DeviceRegistrationDataDto deviceRegistrationData = new DeviceRegistrationDataDto(ipAddress, deviceType, true);
    final RequestMessage requestMessage = new RequestMessage(correlationId, "no-organisation", deviceIdentification, ipAddress, deviceRegistrationData);
    LOGGER.info("Sending register device request to OSGP with correlation ID: " + correlationId);
    this.osgpRequestMessageSender.send(requestMessage, DeviceFunctionDto.REGISTER_DEVICE.name());
    try {
        this.deviceRegistrationService.disableRegistration(deviceIdentification, InetAddress.getByName(ipAddress), ied, ied.getDescription());
        LOGGER.info("Disabled registration for device: {}, at IP address: {}", deviceIdentification, ipAddress);
    } catch (final Exception e) {
        LOGGER.error("Failed to disable registration for device: {}, at IP address: {}", deviceIdentification, ipAddress, e);
    }
}
Also used : RequestMessage(com.alliander.osgp.shared.infra.jms.RequestMessage) IED(com.alliander.osgp.adapter.protocol.iec61850.infra.networking.helper.IED) DeviceRegistrationDataDto(com.alliander.osgp.dto.valueobjects.DeviceRegistrationDataDto)

Example 2 with IED

use of com.alliander.osgp.adapter.protocol.iec61850.infra.networking.helper.IED in project Protocol-Adapter-IEC61850 by OSGP.

the class Iec61850Client method connect.

/**
     * Connect to a given device. This will try to establish the
     * {@link ClientAssociation} between client and IED.
     *
     * @param deviceIdentification
     *            The device identification.
     * @param ipAddress
     *            The IP address of the device.
     * @param reportListener
     *            The report listener instance which can be created using
     *            {@link Iec61850ClientEventListenerFactory}.
     * @param port
     *            The port number of the IED.
     *
     * @return An {@link Iec61850ClientAssociation} instance.
     *
     * @throws ConnectionFailureException
     *             In case the connection to the device could not be
     *             established.
     */
public Iec61850ClientAssociation connect(final String deviceIdentification, final InetAddress ipAddress, final Iec61850ClientBaseEventListener reportListener, final int port) throws ConnectionFailureException {
    // Alternatively you could use ClientSap(SocketFactory factory) to e.g.
    // connect using SSL.
    final ClientSap clientSap = new ClientSap();
    final Iec61850ClientAssociation clientAssociation;
    LOGGER.info("Attempting to connect to server: {} on port: {}, max redelivery count: {} and max retry count: {}", ipAddress.getHostAddress(), port, this.maxRedeliveriesForIec61850Requests, this.maxRetryCount);
    try {
        final ClientAssociation association = clientSap.associate(ipAddress, port, null, reportListener);
        clientAssociation = new Iec61850ClientAssociation(association, reportListener);
    } catch (final IOException e) {
        // An IOException will always indicate a fatal exception. It
        // indicates that the association was closed and
        // cannot be recovered. You will need to create a new association
        // using ClientSap.associate() in order to
        // reconnect.
        LOGGER.error("Error connecting to device: " + deviceIdentification, e);
        throw new ConnectionFailureException(e.getMessage(), e);
    }
    LOGGER.info("Connected to device: {}", deviceIdentification);
    return clientAssociation;
}
Also used : ClientSap(org.openmuc.openiec61850.ClientSap) ConnectionFailureException(com.alliander.osgp.adapter.protocol.iec61850.exceptions.ConnectionFailureException) ClientAssociation(org.openmuc.openiec61850.ClientAssociation) IOException(java.io.IOException)

Example 3 with IED

use of com.alliander.osgp.adapter.protocol.iec61850.infra.networking.helper.IED in project Protocol-Adapter-IEC61850 by OSGP.

the class DeviceRegistrationService method disableRegistration.

/**
     * After the device has registered with the platform successfully, the
     * device has to be informed that the registration worked. Disable an
     * attribute so the device will stop attempting to register once a minute.
     *
     * @param deviceIdentification
     *            The device identification.
     * @param ipAddress
     *            The IP address of the device.
     * @param ied
     *            The type of IED.
     * @param serverName
     *            The server name.
     *
     * @throws ProtocolAdapterException
     *             In case the connection to the device can not be established
     *             or the connection breaks during communication.
     */
public void disableRegistration(final String deviceIdentification, final InetAddress ipAddress, final IED ied, final String serverName) throws ProtocolAdapterException {
    final DeviceConnection deviceConnection = this.iec61850DeviceConnectionService.connectWithoutConnectionCaching(ipAddress.getHostAddress(), deviceIdentification, "", ied, serverName, LogicalDevice.LIGHTING.getDescription());
    final Function<Void> function = new Function<Void>() {

        @Override
        public Void apply(final DeviceMessageLog deviceMessageLog) throws Exception {
            DeviceRegistrationService.this.disableRegistration(deviceConnection);
            DeviceRegistrationService.this.setLocationInformation(deviceConnection);
            if (DeviceRegistrationService.this.isReportingAfterDeviceRegistrationEnabled) {
                LOGGER.info("Reporting enabled for device: {}", deviceConnection.getDeviceIdentification());
                DeviceRegistrationService.this.enableReporting(deviceConnection);
            } else {
                LOGGER.info("Reporting disabled for device: {}", deviceIdentification);
                DeviceRegistrationService.this.iec61850DeviceConnectionService.disconnect(deviceConnection, null);
            }
            return null;
        }
    };
    this.iec61850DeviceConnectionService.sendCommandWithRetry(function, deviceIdentification);
}
Also used : Function(com.alliander.osgp.adapter.protocol.iec61850.infra.networking.helper.Function) DeviceMessageLog(com.alliander.osgp.adapter.protocol.iec61850.domain.valueobjects.DeviceMessageLog) DeviceConnection(com.alliander.osgp.adapter.protocol.iec61850.infra.networking.helper.DeviceConnection)

Example 4 with IED

use of com.alliander.osgp.adapter.protocol.iec61850.infra.networking.helper.IED in project Protocol-Adapter-IEC61850 by OSGP.

the class Iec61850DeviceConnectionService method connect.

public synchronized DeviceConnection connect(final String ipAddress, final String deviceIdentification, final String organisationIdentification, final IED ied, final String serverName, final String logicalDevice, final boolean cacheConnection) throws ConnectionFailureException {
    // an usable for the given deviceIdentification.
    try {
        if (cacheConnection && this.testIfConnectionIsCachedAndAlive(deviceIdentification, ied, serverName, logicalDevice)) {
            return new DeviceConnection(this.fetchIec61850Connection(deviceIdentification), deviceIdentification, organisationIdentification, serverName);
        }
    } catch (final ProtocolAdapterException e) {
        this.logProtocolAdapterException(deviceIdentification, e);
    }
    if (StringUtils.isEmpty(ipAddress)) {
        throw new ConnectionFailureException("Ip address is null");
    }
    final InetAddress inetAddress = this.convertIpAddress(ipAddress);
    // Connect to obtain ClientAssociation and ServerModel.
    LOGGER.info("Trying to connect to deviceIdentification: {} at IP address {} using response time-out: {}", deviceIdentification, ipAddress, this.responseTimeout);
    final DateTime startTime = DateTime.now();
    // Create instance of appropriate event listener.
    Iec61850ClientBaseEventListener eventListener = null;
    try {
        eventListener = Iec61850ClientEventListenerFactory.getInstance().getEventListener(ied, deviceIdentification, this.deviceManagementService);
    } catch (final ProtocolAdapterException e) {
        this.logProtocolAdapterException(deviceIdentification, e);
    }
    final Iec61850Device iec61850Device = this.iec61850DeviceRepository.findByDeviceIdentification(deviceIdentification);
    final int port = this.determinePortForIec61850Device(ied, iec61850Device);
    // Try to connect and receive the ClientAssociation.
    final Iec61850ClientAssociation iec61850ClientAssociation = this.iec61850Client.connect(deviceIdentification, inetAddress, eventListener, port);
    final ClientAssociation clientAssociation = iec61850ClientAssociation.getClientAssociation();
    // Set response time-out.
    clientAssociation.setResponseTimeout(this.responseTimeout);
    // Read the ServerModel, either from the device or from a SCL file.
    ServerModel serverModel;
    try {
        serverModel = this.readServerModel(clientAssociation, deviceIdentification, iec61850Device);
    } catch (final ProtocolAdapterException e) {
        LOGGER.error("ProtocolAdapterException: unable to read ServerModel for deviceIdentification " + deviceIdentification, e);
        throw new ConnectionFailureException(e.getMessage(), e);
    }
    // Cache the connection.
    final Iec61850Connection iec61850Connection = new Iec61850Connection(iec61850ClientAssociation, serverModel, startTime);
    if (cacheConnection) {
        this.cacheIec61850Connection(deviceIdentification, iec61850Connection);
    }
    final DateTime endTime = DateTime.now();
    LOGGER.info("Connected to device: {}, fetched server model. Start time: {}, end time: {}, total time in milliseconds: {}", deviceIdentification, startTime, endTime, endTime.minus(startTime.getMillis()).getMillis());
    return new DeviceConnection(iec61850Connection, deviceIdentification, organisationIdentification, serverName);
}
Also used : Iec61850ClientAssociation(com.alliander.osgp.adapter.protocol.iec61850.infra.networking.Iec61850ClientAssociation) ServerModel(org.openmuc.openiec61850.ServerModel) Iec61850Connection(com.alliander.osgp.adapter.protocol.iec61850.infra.networking.Iec61850Connection) Iec61850Device(com.alliander.osgp.adapter.protocol.iec61850.domain.entities.Iec61850Device) ConnectionFailureException(com.alliander.osgp.adapter.protocol.iec61850.exceptions.ConnectionFailureException) DeviceConnection(com.alliander.osgp.adapter.protocol.iec61850.infra.networking.helper.DeviceConnection) Iec61850ClientAssociation(com.alliander.osgp.adapter.protocol.iec61850.infra.networking.Iec61850ClientAssociation) ClientAssociation(org.openmuc.openiec61850.ClientAssociation) ProtocolAdapterException(com.alliander.osgp.adapter.protocol.iec61850.exceptions.ProtocolAdapterException) Iec61850ClientBaseEventListener(com.alliander.osgp.adapter.protocol.iec61850.infra.networking.reporting.Iec61850ClientBaseEventListener) InetAddress(java.net.InetAddress) DateTime(org.joda.time.DateTime)

Example 5 with IED

use of com.alliander.osgp.adapter.protocol.iec61850.infra.networking.helper.IED in project Protocol-Adapter-IEC61850 by OSGP.

the class Iec61850DeviceConnectionService method testIfConnectionIsCachedAndAlive.

private boolean testIfConnectionIsCachedAndAlive(final String deviceIdentification, final IED ied, final String serverName, final String logicalDevice) throws ProtocolAdapterException {
    try {
        LOGGER.info("Trying to find connection in cache for deviceIdentification: {}", deviceIdentification);
        final Iec61850Connection iec61850Connection = this.fetchIec61850Connection(deviceIdentification);
        if (iec61850Connection != null) {
            // Already connected, check if connection is still usable.
            LOGGER.info("Connection found for deviceIdentification: {}", deviceIdentification);
            // requires manual reads of remote data.
            if (ied != null && logicalDevice != null) {
                final String description = this.getActualServerName(ied, serverName);
                LOGGER.info("Testing if connection is alive using {}{}/{}.{} for deviceIdentification: {}", description, logicalDevice, LogicalNode.LOGICAL_NODE_ZERO.getDescription(), DataAttribute.NAME_PLATE.getDescription(), deviceIdentification);
                final FcModelNode modelNode = this.getModelNode(logicalDevice, iec61850Connection, description);
                this.iec61850Client.readNodeDataValues(iec61850Connection.getClientAssociation(), modelNode);
            } else {
                // Read all data values, which is much slower, but requires
                // no manual reads of remote data.
                LOGGER.info("Testing if connection is alive using readAllDataValues() for deviceIdentification: {}", deviceIdentification);
                this.iec61850Client.readAllDataValues(iec61850Connection.getClientAssociation());
            }
            LOGGER.info("Connection is still active for deviceIdentification: {}", deviceIdentification);
            return true;
        }
    } catch (final NodeReadException e) {
        LOGGER.error("Connection is no longer active, removing connection from cache for deviceIdentification: " + deviceIdentification, e);
        this.removeIec61850Connection(deviceIdentification);
    }
    return false;
}
Also used : Iec61850Connection(com.alliander.osgp.adapter.protocol.iec61850.infra.networking.Iec61850Connection) NodeReadException(com.alliander.osgp.adapter.protocol.iec61850.exceptions.NodeReadException) FcModelNode(org.openmuc.openiec61850.FcModelNode)

Aggregations

ConnectionFailureException (com.alliander.osgp.adapter.protocol.iec61850.exceptions.ConnectionFailureException)2 Iec61850Connection (com.alliander.osgp.adapter.protocol.iec61850.infra.networking.Iec61850Connection)2 DeviceConnection (com.alliander.osgp.adapter.protocol.iec61850.infra.networking.helper.DeviceConnection)2 ClientAssociation (org.openmuc.openiec61850.ClientAssociation)2 Iec61850Device (com.alliander.osgp.adapter.protocol.iec61850.domain.entities.Iec61850Device)1 DeviceMessageLog (com.alliander.osgp.adapter.protocol.iec61850.domain.valueobjects.DeviceMessageLog)1 NodeReadException (com.alliander.osgp.adapter.protocol.iec61850.exceptions.NodeReadException)1 ProtocolAdapterException (com.alliander.osgp.adapter.protocol.iec61850.exceptions.ProtocolAdapterException)1 Iec61850ClientAssociation (com.alliander.osgp.adapter.protocol.iec61850.infra.networking.Iec61850ClientAssociation)1 Function (com.alliander.osgp.adapter.protocol.iec61850.infra.networking.helper.Function)1 IED (com.alliander.osgp.adapter.protocol.iec61850.infra.networking.helper.IED)1 Iec61850ClientBaseEventListener (com.alliander.osgp.adapter.protocol.iec61850.infra.networking.reporting.Iec61850ClientBaseEventListener)1 DeviceRegistrationDataDto (com.alliander.osgp.dto.valueobjects.DeviceRegistrationDataDto)1 RequestMessage (com.alliander.osgp.shared.infra.jms.RequestMessage)1 IOException (java.io.IOException)1 InetAddress (java.net.InetAddress)1 DateTime (org.joda.time.DateTime)1 ClientSap (org.openmuc.openiec61850.ClientSap)1 FcModelNode (org.openmuc.openiec61850.FcModelNode)1 ServerModel (org.openmuc.openiec61850.ServerModel)1