From c35eb35bb63a97b7c46e879819757a9cb48165b5 Mon Sep 17 00:00:00 2001 From: Thomas Vanbesien Date: Tue, 17 Feb 2026 02:27:51 +0100 Subject: Initial commit: OPC UA discovery project CMake-based C project using open62541 for OPC UA discovery. Includes Local Discovery Server, register server, and find servers client with OpenSSL encryption support. --- src/server_lds.c | 81 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 src/server_lds.c (limited to 'src/server_lds.c') diff --git a/src/server_lds.c b/src/server_lds.c new file mode 100644 index 0000000..a7794aa --- /dev/null +++ b/src/server_lds.c @@ -0,0 +1,81 @@ +/** + * @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 + +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); + + /* 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; +} -- cgit v1.2.3