如何在Milo中启用DiscoveryServices实现以搭建LDS服务器?
基于Milo SDK搭建LDS服务器并替换自定义DiscoveryServiceSet
实现步骤
1. 替换默认DiscoveryService
Milo的OpcUaServer默认会注册DefaultDiscoveryService,要替换成你的自定义实现,需通过UaStackServer操作:
- 先通过
OpcUaServer.getStackServer()获取内部的UaStackServer实例。 - 遍历已注册的服务集,移除类型为
DiscoveryServiceSet的默认实现。 - 调用
UaStackServer.addServiceSet()添加你的自定义DiscoveryServiceSet实现。
示例代码:
// 初始化OpcUaServer实例 OpcUaServer server = ...; // 获取UaStackServer UaStackServer stackServer = server.getStackServer(); // 移除默认DiscoveryService stackServer.getServiceSets().stream() .filter(s -> s instanceof DiscoveryServiceSet) .findFirst() .ifPresent(stackServer::removeServiceSet); // 注入自定义实现(需传入sessionManager等必要依赖) stackServer.addServiceSet(new YourCustomDiscoveryService( server.getSessionManager(), // 其他必要参数 ));
2. 配置LDS核心参数
在构建OpcUaServerConfig时,需指定Discovery相关配置,确保服务器能作为LDS被发现:
OpcUaServerConfig config = new OpcUaServerConfigBuilder() // 设置LDS的访问地址 .setDiscoveryUrls(Collections.singletonList("opc.tcp://localhost:4840")) // 配置端点、安全策略、证书等基础参数 .setEndpoints(...) .setCertificate(...) .build();
3. 启动服务器
完成上述配置后,正常调用server.start()启动即可,此时你的自定义Discovery服务会替代默认实现,服务器以LDS身份提供服务。
关键注意事项
- 自定义
DiscoveryServiceSet时,需正确传入SessionManager(通过server.getSessionManager()获取),确保服务能正常处理会话相关逻辑。 - 必须在服务器启动前完成服务替换操作,避免默认服务已初始化生效。
- 若使用
OpcUaServerBuilder,也可通过自定义ServiceSetFactory注册服务,但直接操作UaStackServer是更直接的方案。
内容的提问来源于stack exchange,提问作者CornCoder99
相关产品推荐
相关产品推荐

