You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
86 lines
2.4 KiB
C#
86 lines
2.4 KiB
C#
using System;
|
|
using System.Threading;
|
|
using System.Security.Cryptography.X509Certificates;
|
|
|
|
using IEC61850.Server;
|
|
using IEC61850.Common;
|
|
using IEC61850.TLS;
|
|
|
|
namespace tls_server_example
|
|
{
|
|
class MainClass
|
|
{
|
|
public static void Main (string[] args)
|
|
{
|
|
bool running = true;
|
|
|
|
/* run until Ctrl-C is pressed */
|
|
Console.CancelKeyPress += delegate(object sender, ConsoleCancelEventArgs e) {
|
|
e.Cancel = true;
|
|
running = false;
|
|
};
|
|
|
|
IedModel iedModel = ConfigFileParser.CreateModelFromConfigFile ("model.cfg");
|
|
|
|
if (iedModel == null) {
|
|
Console.WriteLine ("No valid data model found!");
|
|
return;
|
|
}
|
|
|
|
DataObject spcso1 = (DataObject)iedModel.GetModelNodeByShortObjectReference ("GenericIO/GGIO1.SPCSO1");
|
|
|
|
TLSConfiguration tlsConfig = new TLSConfiguration ();
|
|
|
|
tlsConfig.SetOwnCertificate (new X509Certificate2 ("server.cer"));
|
|
|
|
tlsConfig.SetOwnKey ("server-key.pem", null);
|
|
|
|
// Add a CA certificate to check the certificate provided by the server - not required when ChainValidation == false
|
|
tlsConfig.AddCACertificate (new X509Certificate2 ("root.cer"));
|
|
|
|
// Check if the certificate is signed by a provided CA
|
|
tlsConfig.ChainValidation = true;
|
|
|
|
// Check that the shown server certificate is in the list of allowed certificates
|
|
tlsConfig.AllowOnlyKnownCertificates = false;
|
|
|
|
IedServer iedServer = new IedServer (iedModel, tlsConfig);
|
|
|
|
iedServer.SetControlHandler (spcso1, delegate(ControlAction action, object parameter, MmsValue ctlVal, bool test) {
|
|
bool val = ctlVal.GetBoolean();
|
|
|
|
if (val)
|
|
Console.WriteLine("received binary control command: on");
|
|
else
|
|
Console.WriteLine("received binary control command: off");
|
|
|
|
return ControlHandlerResult.OK;
|
|
}, null);
|
|
|
|
iedServer.Start ();
|
|
Console.WriteLine ("Server started");
|
|
|
|
GC.Collect ();
|
|
|
|
DataObject ggio1AnIn1 = (DataObject)iedModel.GetModelNodeByShortObjectReference ("GenericIO/GGIO1.AnIn1");
|
|
|
|
DataAttribute ggio1AnIn1magF = (DataAttribute)ggio1AnIn1.GetChild ("mag.f");
|
|
DataAttribute ggio1AnIn1T = (DataAttribute)ggio1AnIn1.GetChild ("t");
|
|
|
|
float floatVal = 1.0f;
|
|
|
|
while (running) {
|
|
floatVal += 1f;
|
|
iedServer.UpdateTimestampAttributeValue (ggio1AnIn1T, new Timestamp (DateTime.Now));
|
|
iedServer.UpdateFloatAttributeValue (ggio1AnIn1magF, floatVal);
|
|
Thread.Sleep (100);
|
|
}
|
|
|
|
iedServer.Stop ();
|
|
Console.WriteLine ("Server stopped");
|
|
|
|
iedServer.Destroy ();
|
|
}
|
|
}
|
|
}
|