DELL
2024-02-21 4982b9614516dde101c3e44c60a612b3bfd8d6fe
iec61850_forFoShanAES_Model/src/org/openmuc/openiec61850/app/ConsoleServer.java
@@ -1,259 +1,259 @@
package org.openmuc.openiec61850.app;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.openmuc.openiec61850.BasicDataAttribute;
import org.openmuc.openiec61850.BdaFloat32;
import org.openmuc.openiec61850.BdaFloat64;
import org.openmuc.openiec61850.BdaInt16;
import org.openmuc.openiec61850.BdaInt16U;
import org.openmuc.openiec61850.BdaInt32;
import org.openmuc.openiec61850.BdaInt32U;
import org.openmuc.openiec61850.BdaInt64;
import org.openmuc.openiec61850.BdaInt8;
import org.openmuc.openiec61850.BdaInt8U;
import org.openmuc.openiec61850.Fc;
import org.openmuc.openiec61850.ModelNode;
import org.openmuc.openiec61850.SclParseException;
import org.openmuc.openiec61850.ServerEventListener;
import org.openmuc.openiec61850.ServerModel;
import org.openmuc.openiec61850.ServerSap;
import org.openmuc.openiec61850.ServiceError;
import org.openmuc.openiec61850.internal.cli.Action;
import org.openmuc.openiec61850.internal.cli.ActionException;
import org.openmuc.openiec61850.internal.cli.ActionListener;
import org.openmuc.openiec61850.internal.cli.ActionProcessor;
import org.openmuc.openiec61850.internal.cli.CliParameter;
import org.openmuc.openiec61850.internal.cli.CliParameterBuilder;
import org.openmuc.openiec61850.internal.cli.CliParseException;
import org.openmuc.openiec61850.internal.cli.CliParser;
import org.openmuc.openiec61850.internal.cli.IntCliParameter;
import org.openmuc.openiec61850.internal.cli.StringCliParameter;
/**
 *
 * @author Stefan Feuerhahn
 *
 */
public class ConsoleServer {
    private static final String WRITE_VALUE_KEY = "w";
    private static final String WRITE_VALUE_KEY_DESCRIPTION = "write value to model node";
    private static final String PRINT_SERVER_MODEL_KEY = "p";
    private static final String PRINT_SERVER_MODEL_KEY_DESCRIPTION = "print server's model";
    private static final IntCliParameter portParam = new CliParameterBuilder("-p")
            .setDescription("The port to listen on. On unix based systems you need root privilages for ports < 1000.")
            .buildIntParameter("port", 102);
    private static final StringCliParameter modelFileParam = new CliParameterBuilder("-m")
            .setDescription("The SCL file that contains the server's information model.")
            .setMandatory()
            .buildStringParameter("model-file");
    private static ServerModel serverModel;
    private static final ActionProcessor actionProcessor = new ActionProcessor(new ActionExecutor());
    private static ServerSap serverSap = null;
    private static class EventListener implements ServerEventListener {
        @Override
        public void serverStoppedListening(ServerSap serverSap) {
            System.out.println("The SAP stopped listening");
        }
        @Override
        public List<ServiceError> write(List<BasicDataAttribute> bdas) {
            for (BasicDataAttribute bda : bdas) {
               System.out.println("got a write request: " + bda);
               /*
                System.out.println("got a write request: " + bda.getReference().toString()
                               + " value is: " + ((BdaFloat32) bda).getFloat());
                BasicDataAttribute bdat = (BasicDataAttribute) serverModel.findModelNode(bda.getReference(),
                        Fc.fromString("SP"));
                System.out.println("got a write rest: " + bdat.getReference().toString()
                   + " value is: " + ((BdaFloat32) bdat).getFloat());
                   */
            }
            return null;
        }
    }
    private static class ActionExecutor implements ActionListener {
        @Override
        public void actionCalled(String actionKey) throws ActionException {
            try {
                switch (actionKey) {
                case PRINT_SERVER_MODEL_KEY:
                    System.out.println("** Printing model.");
                    System.out.println(serverModel);
                    break;
                case WRITE_VALUE_KEY:
                    System.out.println("** Reading model from file.");
                    System.out.println("Enter reference to read (e.g. myld/MYLN0.do.da.bda): ");
                    String reference = actionProcessor.getReader().readLine();
                    System.out.println("Enter functional constraint of referenced node: ");
                    String fcString = actionProcessor.getReader().readLine();
                    Fc fc = Fc.fromString(fcString);
                    if (fc == null) {
                        System.out.println("Unknown functional constraint.");
                        return;
                    }
                    ModelNode modelNode = serverModel.findModelNode(reference, Fc.fromString(fcString));
                    if (modelNode == null) {
                        System.out.println(
                                "A model node with the given reference and functional constraint could not be found.");
                        return;
                    }
                    if (!(modelNode instanceof BasicDataAttribute)) {
                        System.out.println("The given model node is not a basic data attribute.");
                        return;
                    }
                    BasicDataAttribute bda = (BasicDataAttribute) serverModel.findModelNode(reference,
                            Fc.fromString(fcString));
                    System.out.println("Enter value to write: ");
                    String valueString = actionProcessor.getReader().readLine();
                    try {
                        setBdaValue(bda, valueString);
                    } catch (Exception e) {
                        System.out.println(
                                "The console server does not support writing this type of basic data attribute.");
                        return;
                    }
                    List<BasicDataAttribute> bdas = new ArrayList<>();
                    bdas.add(bda);
                    serverSap.setValues(bdas);
                    System.out.println("Successfully wrote data.");
                    System.out.println(bda);
                    break;
                default:
                    break;
                }
            } catch (Exception e) {
                throw new ActionException(e);
            }
        }
        private void setBdaValue(BasicDataAttribute bda, String valueString) {
            if (bda instanceof BdaFloat32) {
                float value = Float.parseFloat(valueString);
                ((BdaFloat32) bda).setFloat(value);
            }
            else if (bda instanceof BdaFloat64) {
                double value = Float.parseFloat(valueString);
                ((BdaFloat64) bda).setDouble(value);
            }
            else if (bda instanceof BdaInt8) {
                byte value = Byte.parseByte(valueString);
                ((BdaInt8) bda).setValue(value);
            }
            else if (bda instanceof BdaInt8U) {
                short value = Short.parseShort(valueString);
                ((BdaInt8U) bda).setValue(value);
            }
            else if (bda instanceof BdaInt16) {
                short value = Short.parseShort(valueString);
                ((BdaInt16) bda).setValue(value);
            }
            else if (bda instanceof BdaInt16U) {
                int value = Integer.parseInt(valueString);
                ((BdaInt16U) bda).setValue(value);
            }
            else if (bda instanceof BdaInt32) {
                int value = Integer.parseInt(valueString);
                ((BdaInt32) bda).setValue(value);
            }
            else if (bda instanceof BdaInt32U) {
                long value = Long.parseLong(valueString);
                ((BdaInt32U) bda).setValue(value);
            }
            else if (bda instanceof BdaInt64) {
                long value = Long.parseLong(valueString);
                ((BdaInt64) bda).setValue(value);
            }
            else {
                throw new IllegalArgumentException();
            }
        }
        @Override
        public void quit() {
            System.out.println("** Stopping server.");
            serverSap.stop();
            return;
        }
    }
    public static void main(String[] args) throws IOException {
        List<CliParameter> cliParameters = new ArrayList<>();
        cliParameters.add(modelFileParam);
        cliParameters.add(portParam);
        CliParser cliParser = new CliParser("openiec61850-console-server", "An IEC 61850 MMS console server.");
        cliParser.addParameters(cliParameters);
        try {
            cliParser.parseArguments(args);
        } catch (CliParseException e1) {
            System.err.println("Error parsing command line parameters: " + e1.getMessage());
            System.out.println(cliParser.getUsageString());
            System.exit(1);
        }
        List<ServerSap> serverSaps = null;
        try {
            serverSaps = ServerSap.getSapsFromSclFile(modelFileParam.getValue());
        } catch (SclParseException e) {
            System.out.println("Error parsing SCL/ICD file: " + e.getMessage());
            return;
        }
        serverSap = serverSaps.get(0);
        serverSap.setPort(portParam.getValue());
        Runtime.getRuntime().addShutdownHook(new Thread() {
            @Override
            public void run() {
                if (serverSap != null) {
                    serverSap.stop();
                }
                System.out.println("Server was stopped.");
            }
        });
        serverModel = serverSap.getModelCopy();
        BasicDataAttribute bda = (BasicDataAttribute) serverModel.findModelNode("ZJDYBTSE/ncdGGIO1.Para2.setMag.f",
                Fc.fromString("SP"));
        ((BdaFloat32) bda).setFloat((float) 13.5);
        List<BasicDataAttribute> bdas = new ArrayList<>();
        bdas.add(bda);
        serverSap.setValues(bdas);
        serverSap.startListening(new EventListener());
        actionProcessor.addAction(new Action(PRINT_SERVER_MODEL_KEY, PRINT_SERVER_MODEL_KEY_DESCRIPTION));
        actionProcessor.addAction(new Action(WRITE_VALUE_KEY, WRITE_VALUE_KEY_DESCRIPTION));
        actionProcessor.start();
    }
}
package org.openmuc.openiec61850.app;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.openmuc.openiec61850.BasicDataAttribute;
import org.openmuc.openiec61850.BdaFloat32;
import org.openmuc.openiec61850.BdaFloat64;
import org.openmuc.openiec61850.BdaInt16;
import org.openmuc.openiec61850.BdaInt16U;
import org.openmuc.openiec61850.BdaInt32;
import org.openmuc.openiec61850.BdaInt32U;
import org.openmuc.openiec61850.BdaInt64;
import org.openmuc.openiec61850.BdaInt8;
import org.openmuc.openiec61850.BdaInt8U;
import org.openmuc.openiec61850.Fc;
import org.openmuc.openiec61850.ModelNode;
import org.openmuc.openiec61850.SclParseException;
import org.openmuc.openiec61850.ServerEventListener;
import org.openmuc.openiec61850.ServerModel;
import org.openmuc.openiec61850.ServerSap;
import org.openmuc.openiec61850.ServiceError;
import org.openmuc.openiec61850.internal.cli.Action;
import org.openmuc.openiec61850.internal.cli.ActionException;
import org.openmuc.openiec61850.internal.cli.ActionListener;
import org.openmuc.openiec61850.internal.cli.ActionProcessor;
import org.openmuc.openiec61850.internal.cli.CliParameter;
import org.openmuc.openiec61850.internal.cli.CliParameterBuilder;
import org.openmuc.openiec61850.internal.cli.CliParseException;
import org.openmuc.openiec61850.internal.cli.CliParser;
import org.openmuc.openiec61850.internal.cli.IntCliParameter;
import org.openmuc.openiec61850.internal.cli.StringCliParameter;
/**
 *
 * @author Stefan Feuerhahn
 *
 */
public class ConsoleServer {
    private static final String WRITE_VALUE_KEY = "w";
    private static final String WRITE_VALUE_KEY_DESCRIPTION = "write value to model node";
    private static final String PRINT_SERVER_MODEL_KEY = "p";
    private static final String PRINT_SERVER_MODEL_KEY_DESCRIPTION = "print server's model";
    private static final IntCliParameter portParam = new CliParameterBuilder("-p")
            .setDescription("The port to listen on. On unix based systems you need root privilages for ports < 1000.")
            .buildIntParameter("port", 102);
    private static final StringCliParameter modelFileParam = new CliParameterBuilder("-m")
            .setDescription("The SCL file that contains the server's information model.")
            .setMandatory()
            .buildStringParameter("model-file");
    private static ServerModel serverModel;
    private static final ActionProcessor actionProcessor = new ActionProcessor(new ActionExecutor());
    private static ServerSap serverSap = null;
    private static class EventListener implements ServerEventListener {
        @Override
        public void serverStoppedListening(ServerSap serverSap) {
            System.out.println("The SAP stopped listening");
        }
        @Override
        public List<ServiceError> write(List<BasicDataAttribute> bdas) {
            for (BasicDataAttribute bda : bdas) {
               System.out.println("got a write request: " + bda);
               /*
                System.out.println("got a write request: " + bda.getReference().toString()
                               + " value is: " + ((BdaFloat32) bda).getFloat());
                BasicDataAttribute bdat = (BasicDataAttribute) serverModel.findModelNode(bda.getReference(),
                        Fc.fromString("SP"));
                System.out.println("got a write rest: " + bdat.getReference().toString()
                   + " value is: " + ((BdaFloat32) bdat).getFloat());
                   */
            }
            return null;
        }
    }
    private static class ActionExecutor implements ActionListener {
        @Override
        public void actionCalled(String actionKey) throws ActionException {
            try {
                switch (actionKey) {
                case PRINT_SERVER_MODEL_KEY:
                    System.out.println("** Printing model.");
                    System.out.println(serverModel);
                    break;
                case WRITE_VALUE_KEY:
                    System.out.println("** Reading model from file.");
                    System.out.println("Enter reference to read (e.g. myld/MYLN0.do.da.bda): ");
                    String reference = actionProcessor.getReader().readLine();
                    System.out.println("Enter functional constraint of referenced node: ");
                    String fcString = actionProcessor.getReader().readLine();
                    Fc fc = Fc.fromString(fcString);
                    if (fc == null) {
                        System.out.println("Unknown functional constraint.");
                        return;
                    }
                    ModelNode modelNode = serverModel.findModelNode(reference, Fc.fromString(fcString));
                    if (modelNode == null) {
                        System.out.println(
                                "A model node with the given reference and functional constraint could not be found.");
                        return;
                    }
                    if (!(modelNode instanceof BasicDataAttribute)) {
                        System.out.println("The given model node is not a basic data attribute.");
                        return;
                    }
                    BasicDataAttribute bda = (BasicDataAttribute) serverModel.findModelNode(reference,
                            Fc.fromString(fcString));
                    System.out.println("Enter value to write: ");
                    String valueString = actionProcessor.getReader().readLine();
                    try {
                        setBdaValue(bda, valueString);
                    } catch (Exception e) {
                        System.out.println(
                                "The console server does not support writing this type of basic data attribute.");
                        return;
                    }
                    List<BasicDataAttribute> bdas = new ArrayList<>();
                    bdas.add(bda);
                    serverSap.setValues(bdas);
                    System.out.println("Successfully wrote data.");
                    System.out.println(bda);
                    break;
                default:
                    break;
                }
            } catch (Exception e) {
                throw new ActionException(e);
            }
        }
        private void setBdaValue(BasicDataAttribute bda, String valueString) {
            if (bda instanceof BdaFloat32) {
                float value = Float.parseFloat(valueString);
                ((BdaFloat32) bda).setFloat(value);
            }
            else if (bda instanceof BdaFloat64) {
                double value = Float.parseFloat(valueString);
                ((BdaFloat64) bda).setDouble(value);
            }
            else if (bda instanceof BdaInt8) {
                byte value = Byte.parseByte(valueString);
                ((BdaInt8) bda).setValue(value);
            }
            else if (bda instanceof BdaInt8U) {
                short value = Short.parseShort(valueString);
                ((BdaInt8U) bda).setValue(value);
            }
            else if (bda instanceof BdaInt16) {
                short value = Short.parseShort(valueString);
                ((BdaInt16) bda).setValue(value);
            }
            else if (bda instanceof BdaInt16U) {
                int value = Integer.parseInt(valueString);
                ((BdaInt16U) bda).setValue(value);
            }
            else if (bda instanceof BdaInt32) {
                int value = Integer.parseInt(valueString);
                ((BdaInt32) bda).setValue(value);
            }
            else if (bda instanceof BdaInt32U) {
                long value = Long.parseLong(valueString);
                ((BdaInt32U) bda).setValue(value);
            }
            else if (bda instanceof BdaInt64) {
                long value = Long.parseLong(valueString);
                ((BdaInt64) bda).setValue(value);
            }
            else {
                throw new IllegalArgumentException();
            }
        }
        @Override
        public void quit() {
            System.out.println("** Stopping server.");
            serverSap.stop();
            return;
        }
    }
    public static void main(String[] args) throws IOException {
        List<CliParameter> cliParameters = new ArrayList<>();
        cliParameters.add(modelFileParam);
        cliParameters.add(portParam);
        CliParser cliParser = new CliParser("openiec61850-console-server", "An IEC 61850 MMS console server.");
        cliParser.addParameters(cliParameters);
        try {
            cliParser.parseArguments(args);
        } catch (CliParseException e1) {
            System.err.println("Error parsing command line parameters: " + e1.getMessage());
            System.out.println(cliParser.getUsageString());
            System.exit(1);
        }
        List<ServerSap> serverSaps = null;
        try {
            serverSaps = ServerSap.getSapsFromSclFile(modelFileParam.getValue());
        } catch (SclParseException e) {
            System.out.println("Error parsing SCL/ICD file: " + e.getMessage());
            return;
        }
        serverSap = serverSaps.get(0);
        serverSap.setPort(portParam.getValue());
        Runtime.getRuntime().addShutdownHook(new Thread() {
            @Override
            public void run() {
                if (serverSap != null) {
                    serverSap.stop();
                }
                System.out.println("Server was stopped.");
            }
        });
        serverModel = serverSap.getModelCopy();
        BasicDataAttribute bda = (BasicDataAttribute) serverModel.findModelNode("ZJDYBTSE/ncdGGIO1.Para2.setMag.f",
                Fc.fromString("SP"));
        ((BdaFloat32) bda).setFloat((float) 13.5);
        List<BasicDataAttribute> bdas = new ArrayList<>();
        bdas.add(bda);
        serverSap.setValues(bdas);
        serverSap.startListening(new EventListener());
        actionProcessor.addAction(new Action(PRINT_SERVER_MODEL_KEY, PRINT_SERVER_MODEL_KEY_DESCRIPTION));
        actionProcessor.addAction(new Action(WRITE_VALUE_KEY, WRITE_VALUE_KEY_DESCRIPTION));
        actionProcessor.start();
    }
}