基于Eclipse Milo实现OPC UA LDS的技术问题咨询
基于Eclipse Milo实现OPC UA LDS 常见问题解答
1. 客户端连接LDS与连接非发现类UA Server的差异
- 交互目的不同:连接普通业务UA Server是为了完成节点读写、方法调用、数据订阅等业务操作;连接LDS仅用于查询本地/局域网内已注册的UA Server清单,不涉及任何业务数据交互。
- 安全策略默认配置不同:LDS必须开放无安全配置的匿名接入端点作为发现入口,客户端无需提前预置证书即可完成发现流程;普通UA Server可根据业务需求关闭匿名接入、强制要求签名加密,客户端必须持有匹配的身份凭证才能建立连接。
- 接口调用范围不同:与LDS交互仅会调用
getEndpoints()、findServers()这类发现类服务接口,不会访问地址空间中的业务节点;与普通UA Server交互可覆盖OPC UA规范定义的全量服务接口。
2. UA Server调用registerServer()前的地址配置要求
必须预先配置LDS地址,且配置项为LDS的discoveryURL,不能直接配置endpointURL。
- OPC UA规范约定LDS默认discoveryURL为
opc.tcp://<LDS所在主机IP>:4840/,使用4840知名端口专门接收服务发现、注册相关请求。 - 正确注册流程为:UA Server通过预配置的discoveryURL调用
getEndpoints()获取LDS所有可用端点,再选择匹配自身安全配置的endpointURL建立安全会话,最后调用registerServer()/registerServer2()完成注册。如果直接硬编码LDS的某个endpointURL发起注册,大概率会因安全策略不匹配、端点路径错误导致注册失败。
3. 客户端发现本地UA Server的标准流程
描述的流程是正确的,具体步骤为:
- 第一步:通过规范约定的知名地址获取LDS的discoveryURL,本地场景默认值为
opc.tcp://127.0.0.1:4840/,无需额外手动配置。 - 第二步:通过该discoveryURL调用
getEndpoints()获取LDS的所有可用endpointURL,选择符合客户端自身安全配置的端点建立连接。 - 第三步:会话建立后调用
findServers()接口,即可获取本地所有已向LDS完成注册的UA Server信息,包含每个业务服务器的discoveryURL、服务能力、厂商信息等字段,后续客户端可基于返回的discoveryURL进一步连接目标业务服务器。
4. discoveryURL与endpointURL的核心区别
- 定位不同:discoveryURL是服务器暴露发现服务的统一入口,仅承载
getEndpoints()、findServers()等发现类请求,路径后缀固定为/discovery,4840知名端口默认绑定discoveryURL;endpointURL是服务器提供具体服务的实际接入地址,承载全量OPC UA服务请求,端口、路径可由服务端自定义。 - 使用场景不同:discoveryURL是客户端与服务器首次交互的入口,可通过规范约定、mDNS多播、LDS查询等公开方式获取,无需提前协商;endpointURL是客户端正式建立会话、执行业务交互的地址,必须通过discoveryURL调用
getEndpoints()动态获取,禁止硬编码使用,否则极易出现安全策略不匹配、连接失败问题。 - 数量不同:一个UA Server(含LDS)仅需配置1个主discoveryURL;但可同时存在多个endpointURL,分别对应不同的传输协议、安全策略、消息安全模式,供不同配置的客户端选择接入。
5. 非发现类UA Server的接口实现要求
两个接口的实现要求完全不同:
findServers():所有UA Server必须实现,属于OPC UA规范定义的必选发现服务,但普通业务服务器实现该接口时仅需返回自身的服务信息即可,不需要像LDS那样返回所有已注册的第三方服务器列表。registerServer():普通非发现类UA Server不需要实现,该接口是LDS专属的服务端接口,专门用于接收其他业务服务器的注册请求。普通业务服务器是该接口的调用方而非实现方,仅需在启动时主动向LDS调用该接口完成自身注册即可。
6. 基于Eclipse Milo实现LDS的落地路径
Milo已经封装了LDS所需的核心协议逻辑,不需要从零开始实现服务栈,可按以下步骤推进:
- 先跑通最简基础UA Server:基于Milo的
UaServer类启动最小化服务端,暂不挂载自定义业务节点,先完成基础服务启动、端点配置、证书自动生成逻辑验证,确保测试客户端可以正常连接、调用getEndpoints()接口。 - 开启发现服务能力:将服务端的应用类型配置为
ApplicationType.DiscoveryServer,加载Milo内置的DiscoveryServiceSet服务集,该组件已经包含registerServer()、registerServer2()、findServers()的标准协议实现,无需自行编写接口逻辑。 - 实现注册存储逻辑:Milo内置的注册信息存储为内存级实现,重启后数据会丢失,需要自行实现
RegistrationStore接口,完成注册信息的持久化存储,同时实现注册过期自动清理逻辑——按照OPC UA规范,业务服务器需要周期性向LDS重注册,超时未上报的注册条目需要自动剔除。 - 配置规范兼容的端点:按照规范要求给LDS绑定4840端口,配置无安全策略的匿名端点作为默认发现入口,同时可根据需求增加带签名、加密的高安全级别端点,确保主discoveryURL为
opc.tcp://<主机IP>:4840/,符合规范约定。 - 流程验证:启动自研LDS后,配置多个普通测试UA Server指向该LDS完成注册,再通过测试客户端连接LDS调用
findServers(),确认能正确返回所有已注册的服务器信息即可。
注意:实现时不要跳过getEndpoints()步骤直接硬编码端点连接,否则跨安全配置场景下连接成功率极低,务必严格遵循先发现端点、再建立会话的流程。
内容的提问来源于stack exchange,提问作者CornCoder99
相关产品推荐
相关产品推荐

