find_servers
前置 / 配套
- 拿到 Server 后用 get_endpoints 列出该 Server 的可用 Endpoint.
- 然后用 构造函数 真正连接.
签名
@staticmethod
def find_servers(endpoint_url: str,
timeout_ms: int = 10_000) -> List[ApplicationDescription]: ...
向 Local Discovery Server (LDS) 查询同域内注册的所有 OPC UA Server.
ApplicationDescription 字段
| 字段 | 类型 | 说明 |
|---|---|---|
application_uri | Optional[str] | 应用 URI (全局唯一标识) |
product_uri | Optional[str] | 产品 URI |
application_name | Optional[str] | 应用显示名 |
application_type | int | 0=Server / 1=Client / 2=ClientAndServer / 3=DiscoveryServer |
gateway_server_uri | Optional[str] | 网关 (可空) |
discovery_profile_uri | Optional[str] | Discovery Profile |
discovery_urls | List[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)