embox
233 строки · 7.3 Кб
1/*
2* tls_server_example.c
3*
4* How to configure a TLS server
5*/
6
7#include "iec61850_server.h"8#include "hal_thread.h"9#include <signal.h>10#include <stdlib.h>11#include <stdio.h>12#include <math.h>13
14#include "static_model.h"15
16/* import IEC 61850 device model created from SCL-File */
17extern IedModel iedModel;18
19static int running = 0;20static IedServer iedServer = NULL;21
22void
23sigint_handler(int signalId)24{
25running = 0;26}
27
28static ControlHandlerResult29controlHandlerForBinaryOutput(ControlAction action, void* parameter, MmsValue* value, bool test)30{
31if (test)32return CONTROL_RESULT_FAILED;33
34if (MmsValue_getType(value) == MMS_BOOLEAN) {35printf("received binary control command: ");36
37if (MmsValue_getBoolean(value))38printf("on\n");39else40printf("off\n");41}42else43return CONTROL_RESULT_FAILED;44
45uint64_t timeStamp = Hal_getTimeInMs();46
47if (parameter == IEDMODEL_GenericIO_GGIO1_SPCSO1) {48IedServer_updateUTCTimeAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO1_t, timeStamp);49IedServer_updateAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO1_stVal, value);50}51
52if (parameter == IEDMODEL_GenericIO_GGIO1_SPCSO2) {53IedServer_updateUTCTimeAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO2_t, timeStamp);54IedServer_updateAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO2_stVal, value);55}56
57if (parameter == IEDMODEL_GenericIO_GGIO1_SPCSO3) {58IedServer_updateUTCTimeAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO3_t, timeStamp);59IedServer_updateAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO3_stVal, value);60}61
62if (parameter == IEDMODEL_GenericIO_GGIO1_SPCSO4) {63IedServer_updateUTCTimeAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO4_t, timeStamp);64IedServer_updateAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO4_stVal, value);65}66
67return CONTROL_RESULT_OK;68}
69
70
71static void72connectionHandler (IedServer self, ClientConnection connection, bool connected, void* parameter)73{
74if (connected)75printf("Connection opened\n");76else77printf("Connection closed\n");78}
79
80static void81printAppTitle(ItuObjectIdentifier* oid)82{
83int i;84
85for (i = 0; i < oid->arcCount; i++) {86printf("%i", oid->arc[i]);87
88if (i != (oid->arcCount - 1))89printf(".");90}91}
92
93static bool94clientAuthenticator(void* parameter, AcseAuthenticationParameter authParameter, void** securityToken, IsoApplicationReference* appRef)95{
96printf("ACSE Authenticator:\n");97printf(" client ap-title: "); printAppTitle(&(appRef->apTitle)); printf("\n");98printf(" client ae-qualifier: %i\n", appRef->aeQualifier);99printf(" auth-mechanism: %i\n", authParameter->mechanism);100
101if (authParameter->mechanism == ACSE_AUTH_TLS) {102printf(" Has certificate with size: %i\n", authParameter->value.certificate.length);103}104
105return true;106}
107
108int
109main(int argc, char** argv)110{
111printf("Using libIEC61850 version %s\n", LibIEC61850_getVersionString());112
113TLSConfiguration tlsConfig = TLSConfiguration_create();114
115TLSConfiguration_setChainValidation(tlsConfig, false);116TLSConfiguration_setAllowOnlyKnownCertificates(tlsConfig, true);117
118if (!TLSConfiguration_setOwnKeyFromFile(tlsConfig, "server-key.pem", NULL)) {119printf("Failed to load private key!\n");120return 0;121}122
123if (!TLSConfiguration_setOwnCertificateFromFile(tlsConfig, "server.cer")) {124printf("ERROR: Failed to load own certificate!\n");125return 0;126}127
128if (!TLSConfiguration_addCACertificateFromFile(tlsConfig, "root.cer")) {129printf("ERROR: Failed to load root certificate\n");130return 0;131}132
133/**134* Configure two allowed clients
135*/
136
137if (!TLSConfiguration_addAllowedCertificateFromFile(tlsConfig, "client1.cer")) {138printf("ERROR: Failed to load allowed client certificate\n");139return 0;140}141
142if (!TLSConfiguration_addAllowedCertificateFromFile(tlsConfig, "client2.cer")) {143printf("ERROR: Failed to load allowed client certificate\n");144return 0;145}146
147iedServer = IedServer_createWithTlsSupport(&iedModel, tlsConfig);148
149IedServer_setAuthenticator(iedServer, clientAuthenticator, NULL);150
151/* Install handler for operate command */152IedServer_setControlHandler(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO1,153(ControlHandler) controlHandlerForBinaryOutput,154IEDMODEL_GenericIO_GGIO1_SPCSO1);155
156IedServer_setControlHandler(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO2,157(ControlHandler) controlHandlerForBinaryOutput,158IEDMODEL_GenericIO_GGIO1_SPCSO2);159
160IedServer_setControlHandler(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO3,161(ControlHandler) controlHandlerForBinaryOutput,162IEDMODEL_GenericIO_GGIO1_SPCSO3);163
164IedServer_setControlHandler(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO4,165(ControlHandler) controlHandlerForBinaryOutput,166IEDMODEL_GenericIO_GGIO1_SPCSO4);167
168IedServer_setConnectionIndicationHandler(iedServer, (IedConnectionIndicationHandler) connectionHandler, NULL);169
170/* MMS server will be instructed to start listening to client connections. */171IedServer_start(iedServer, -1);172
173if (!IedServer_isRunning(iedServer)) {174printf("Starting server failed! Exit.\n");175IedServer_destroy(iedServer);176exit(-1);177}178
179running = 1;180
181signal(SIGINT, sigint_handler);182
183float t = 0.f;184
185while (running) {186uint64_t timestamp = Hal_getTimeInMs();187
188t += 0.1f;189
190float an1 = t;//sinf(t);191float an2 = t + 1.f;//sinf(t + 1.f);192float an3 = t + 2.f;//sinf(t + 2.f);193float an4 = t + 3.f;//sinf(t + 3.f);194
195IedServer_lockDataModel(iedServer);196
197Timestamp iecTimestamp;198
199Timestamp_clearFlags(&iecTimestamp);200Timestamp_setTimeInMilliseconds(&iecTimestamp, timestamp);201Timestamp_setLeapSecondKnown(&iecTimestamp, true);202
203/* toggle clock-not-synchronized flag in timestamp */204if (((int) t % 2) == 0)205Timestamp_setClockNotSynchronized(&iecTimestamp, true);206
207IedServer_updateTimestampAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn1_t, &iecTimestamp);208IedServer_updateFloatAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn1_mag_f, an1);209
210IedServer_updateTimestampAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn2_t, &iecTimestamp);211IedServer_updateFloatAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn2_mag_f, an2);212
213IedServer_updateTimestampAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn3_t, &iecTimestamp);214IedServer_updateFloatAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn3_mag_f, an3);215
216IedServer_updateTimestampAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn4_t, &iecTimestamp);217IedServer_updateFloatAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn4_mag_f, an4);218
219IedServer_unlockDataModel(iedServer);220
221Thread_sleep(100);222}223
224/* stop MMS server - close TCP server socket and all client sockets */225IedServer_stop(iedServer);226
227/* Cleanup - free all resources */228IedServer_destroy(iedServer);229
230TLSConfiguration_destroy(tlsConfig);231
232return 0;233} /* main() */234