/** * @file server_lds.c * @brief Local Discovery Server implementation. * * This program runs an OPC UA Local Discovery Server (LDS) configured with * encryption and a configurable cleanup timeout. Other OPC UA servers register * with this LDS using the RegisterServer2 service. Clients can query this LDS * using the FindServers service to discover registered servers. */ #include "common.h" #include #include #include #include #include #include UA_Boolean running = true; static void stopHandler (int sig) { UA_LOG_INFO (UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "received ctrl-c"); running = false; } int main (int argc, char *argv[]) { signal (SIGINT, stopHandler); signal (SIGTERM, stopHandler); if (argc < 6) { UA_LOG_FATAL (UA_Log_Stdout, UA_LOGCATEGORY_USERLAND, "Usage: %s\n" " \n" " \n" " \n" " [, ...]", argv[0]); return EXIT_FAILURE; } UA_UInt16 port = (UA_UInt16)atoi (argv[1]); int cleanupTimeout = atoi (argv[5]); /* The OPC UA specification requires the cleanup timeout to exceed the register-server interval. open62541 enforces a floor of 10 seconds. */ if (cleanupTimeout <= 10) { UA_LOG_FATAL (UA_Log_Stdout, UA_LOGCATEGORY_USERLAND, "Cleanup timeout must be > 10 seconds (got %d)", cleanupTimeout); return EXIT_FAILURE; } size_t trustSize = (argc > 6) ? (size_t)argc - 6 : 0; UA_StatusCode retval; UA_Server *server = createSecureServer (port, argv[2], argv[3], argv[4], argv + 6, trustSize, &retval); if (!server) return EXIT_FAILURE; UA_ServerConfig *serverConfig = UA_Server_getConfig (server); /* Disallow anonymous sessions. UA_ServerConfig_setDefaultWithSecurityPolicies (called by createSecureServer) resets access control, so this must come after server creation. The static credential list is deep-copied. */ UA_UsernamePasswordLogin logins[] = { { UA_STRING_STATIC ("user"), UA_STRING_STATIC ("password") } }; retval = UA_AccessControl_default (serverConfig, false, NULL, 1, logins); if (retval != UA_STATUSCODE_GOOD) { UA_Server_delete (server); return EXIT_FAILURE; } /* Mark this server as a Discovery Server so clients can identify it. */ serverConfig->applicationDescription.applicationType = UA_APPLICATIONTYPE_DISCOVERYSERVER; /* Time (seconds) after which stale registrations are removed. Must exceed the registering server's re-register interval. */ serverConfig->discoveryCleanupTimeout = cleanupTimeout; retval = UA_Server_run (server, &running); UA_Server_delete (server); return retval == UA_STATUSCODE_GOOD ? EXIT_SUCCESS : EXIT_FAILURE; }