跳到主要内容

find_servers

前置 / 配套

签名

@staticmethod
def find_servers(endpoint_url: str,
timeout_ms: int = 10_000) -> List[ApplicationDescription]: ...

向 Local Discovery Server (LDS) 查询同域内注册的所有 OPC UA Server.

ApplicationDescription 字段

字段类型说明
application_uriOptional[str]应用 URI (全局唯一标识)
product_uriOptional[str]产品 URI
application_nameOptional[str]应用显示名
application_typeint0=Server / 1=Client / 2=ClientAndServer / 3=DiscoveryServer
gateway_server_uriOptional[str]网关 (可空)
discovery_profile_uriOptional[str]Discovery Profile
discovery_urlsList[str]该 Server 的 endpoint URLs

用法

from darra_opcua import OpcUaDiscovery

servers = OpcUaDiscovery.find_servers("opc.tcp://lds-host:4840")

print(f"Domain has {len(servers)} servers:")
for s in servers:
print(f"\n App: {s.application_name}")
print(f" AppUri: {s.application_uri}")
print(f" Type: {s.application_type}")
print(f" Discovery URLs:")
for url in s.discovery_urls:
print(f" - {url}")

LDS

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

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

FindServersOnNetwork (扩展)

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


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

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

servers = OpcUaDiscovery.find_servers("opc.tcp://lds:4840")

primary = next((s for s in servers if s.application_uri == "urn:plant:server-primary"), None)
backup = next((s for s in servers if s.application_uri == "urn:plant:server-backup"), None)

url = (primary.discovery_urls[0] if primary
else backup.discovery_urls[0] if backup
else None)

下一步