/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * * Copyright 2018 (c) Stefan Profanter, fortiss GmbH * Copyright 2018 (c) Thomas Stalder, Blue Time Concept SA */ #ifndef UA_CLIENT_CONFIG_H #define UA_CLIENT_CONFIG_H #include "ua_config.h" #include "ua_plugin_securitypolicy.h" #include "ua_plugin_network.h" _UA_BEGIN_DECLS struct UA_Client; typedef struct UA_Client UA_Client; /** * .. _client-config: * * Client Configuration * -------------------- * * The client configuration is used for setting connection parameters and * additional settings used by the client. * The configuration should not be modified after it is passed to a client. * Currently, only one client can use a configuration at a time. * * Examples for configurations are provided in the ``/plugins`` folder. * The usual usage is as follows: * * 1. Create a client configuration with default settings as a starting point * 2. Modifiy the configuration, e.g. modifying the timeout * 3. Instantiate a client with it * 4. After shutdown of the client, clean up the configuration (free memory) * * The :ref:`tutorials` provide a good starting point for this. */ typedef enum { UA_CLIENTSTATE_DISCONNECTED, /* The client is disconnected */ UA_CLIENTSTATE_WAITING_FOR_ACK, /* The Client has sent HEL and waiting */ UA_CLIENTSTATE_CONNECTED, /* A TCP connection to the server is open */ UA_CLIENTSTATE_SECURECHANNEL, /* A SecureChannel to the server is open */ UA_CLIENTSTATE_SESSION, /* A session with the server is open */ UA_CLIENTSTATE_SESSION_DISCONNECTED, /* Disconnected vs renewed? */ UA_CLIENTSTATE_SESSION_RENEWED /* A session with the server is open (renewed) */ } UA_ClientState; typedef struct { /* Basic client configuration */ void *clientContext; /* User-defined data attached to the client */ UA_Logger logger; /* Logger used by the client */ UA_UInt32 timeout; /* Response timeout in ms */ UA_ApplicationDescription clientDescription; /* Basic connection configuration */ UA_ExtensionObject userIdentityToken; /* Configured User-Identity Token */ UA_MessageSecurityMode securityMode; /* None, Sign, SignAndEncrypt. The * default is invalid. This indicates * the client to select any matching * endpoint. */ UA_String securityPolicyUri; /* SecurityPolicy for the SecureChannel. An * empty string indicates the client to select * any matching SecurityPolicy. */ /* Advanced connection configuration * * If either endpoint or userTokenPolicy has been set (at least one non-zero * byte in either structure), then the selected Endpoint and UserTokenPolicy * overwrite the settings in the basic connection configuration. The * userTokenPolicy array in the EndpointDescription is ignored. The selected * userTokenPolicy is set in the dedicated configuration field. * * If the advanced configuration is not set, the client will write to it the * selected Endpoint and UserTokenPolicy during GetEndpoints. * * The information in the advanced configuration is used during reconnect * when the SecureChannel was broken. */ UA_EndpointDescription endpoint; UA_UserTokenPolicy userTokenPolicy; /* Advanced client configuration */ UA_UInt32 secureChannelLifeTime; /* Lifetime in ms (then the channel needs to be renewed) */ UA_UInt32 requestedSessionTimeout; /* Session timeout in ms */ UA_ConnectionConfig localConnectionConfig; UA_UInt32 connectivityCheckInterval; /* Connectivity check interval in ms. * 0 = background task disabled */ const UA_DataTypeArray *customDataTypes; /* Custom DataTypes. Attention! * Custom datatypes are not cleaned * up together with the * configuration. So it is possible * to allocate them on ROM. */ /* Available SecurityPolicies */ size_t securityPoliciesSize; UA_SecurityPolicy *securityPolicies; /* Certificate Verification Plugin */ UA_CertificateVerification certificateVerification; /* Callbacks for async connection handshakes */ UA_ConnectClientConnection connectionFunc; UA_ConnectClientConnection initConnectionFunc; void (*pollConnectionFunc)(UA_Client *client, void *context); /* Callback for state changes */ void (*stateCallback)(UA_Client *client, UA_ClientState clientState); /* When connectivityCheckInterval is greater than 0, every * connectivityCheckInterval (in ms), a async read request is performed on * the server. inactivityCallback is called when the client receive no * response for this read request The connection can be closed, this in an * attempt to recreate a healthy connection. */ void (*inactivityCallback)(UA_Client *client); #ifdef UA_ENABLE_SUBSCRIPTIONS /* Number of PublishResponse queued up in the server */ UA_UInt16 outStandingPublishRequests; /* If the client does not receive a PublishResponse after the defined delay * of ``(sub->publishingInterval * sub->maxKeepAliveCount) + * client->config.timeout)``, then subscriptionInactivityCallback is called * for the subscription.. */ void (*subscriptionInactivityCallback)(UA_Client *client, UA_UInt32 subscriptionId, void *subContext); #endif } UA_ClientConfig; _UA_END_DECLS #endif /* UA_CLIENT_CONFIG_H */