跳到主要内容

findServers

前置 / 配套

签名​

public static List<ApplicationDescription> findServers(String discoveryUrl);
public static List<ApplicationDescription> findServers(String discoveryUrl, int timeoutMs);

向 Local Discovery Server (LDS) 查询同域内注册的所有 OPC UA Server. 默认超时 10 秒.

ApplicationDescription 字段​

方法类型说明
getApplicationUri()String应用 URI (全局唯一标识)
getProductUri()String产品 URI
getApplicationName()String应用显示名
getApplicationType()int0=Server / 1=Client / 2=ClientAndServer / 3=DiscoveryServer
getGatewayServerUri()String网关 (可空)
getDiscoveryProfileUri()StringDiscovery Profile
getDiscoveryUrls()List<String>该 Server 的 endpoint URLs

用法​

List<ApplicationDescription> servers =
OpcUaDiscovery.findServers("opc.tcp://lds-host:4840");

System.out.println("Domain has " + servers.size() + " servers:");
for (ApplicationDescription s : servers) {
System.out.println();
System.out.println(" App: " + s.getApplicationName());
System.out.println(" AppUri: " + s.getApplicationUri());
System.out.println(" Type: " + s.getApplicationType());
System.out.println(" Discovery URLs:");
for (String url : s.getDiscoveryUrls()) {
System.out.println(" - " + url);
}
}

LDS​

LDS = Local Discovery Server, OPC Foundation 提供. 同子网内 Server 启动时可注册到 LDS, 客户端通过 findServers 即发现全部.

LDS 默认监听 4840 (与普通 Server 同端口), 通常装在专门一台主机, 也可与 Server 共部署.

FindServersOnNetwork (扩展)​

LDS 还有 FindServersOnNetwork 服务, 跨子网通过 mDNS 发现. 当前 SDK 未暴露此 API, 如需可走底层调用.

用例: 自动 Server 切换 (冗余)​

冗余场景下, 主备 Server 都注册到同一 LDS. 客户端定期 findServers, 主 Server 失联时切到备:

List<ApplicationDescription> servers = OpcUaDiscovery.findServers("opc.tcp://lds:4840");

ApplicationDescription primary = servers.stream()
.filter(s -> "urn:plant:server-primary".equals(s.getApplicationUri()))
.findFirst().orElse(null);

ApplicationDescription backup = servers.stream()
.filter(s -> "urn:plant:server-backup".equals(s.getApplicationUri()))
.findFirst().orElse(null);

String url = (primary != null && !primary.getDiscoveryUrls().isEmpty())
? primary.getDiscoveryUrls().get(0)
: (backup != null && !backup.getDiscoveryUrls().isEmpty())
? backup.getDiscoveryUrls().get(0)
: null;

下一步​