Skip to content

Capabilities and Limitations

Kevin Herron edited this page Oct 12, 2026 · 6 revisions

Applies to Milo 1.2.0-RC1. Source baseline 69cb25087, 2026-10-12.

This page separates what Milo implements from what your application must build, and it collects the limitations that apply across the guide at this baseline. Use it when you evaluate Milo for a project or choose an integration approach. It describes the pinned source and is not a complete OPC UA profile audit or certification claim. A generated type or service request class does not mean a runtime implements the service.

Client and server capabilities

Use this table to see, area by area, where Milo stops and your application starts. Gaps within an area are listed under Known limitations.

Area Milo provides Your application provides Source and guide
OPC TCP client and server Discovery, SecureChannel and Session lifecycle, service requests Reachable endpoint names, security policy, trust, user identity, shutdown Client lifecycle, Server lifecycle, Connecting, server configuration
Browse, Read, Write, Call Client service APIs, server dispatch and address-space hooks Data model, device access, permissions, per-operation status handling Client API, AddressSpace
Data subscriptions Client desired-state items and synchronization. Server sampling and publishing. Inspecting creation and synchronization results and notification quality. Device sampling and permission invalidation. Client contract, Sampling contract, Subscriptions, Sampling
Events and Conditions Event routing and runtime Condition behaviors Source and notifier model, application state, persistence Routing, Trunk branch, Events, Alarms and Conditions
Node instantiation Typed instance creation, optional-member selection, lifecycle result Preserving persisted NodeIds and owning created instances Experimental contract, Types and instantiation
Historical access Client history services and server hooks Storage, history semantics, retention, continuation ownership, authorization. There is no built-in historian. History hooks, Service dispatch, Client history, server history
Discovery registration Client DiscoveryClient.registerServer, which sends RegisterServer on a discovery channel A complete LDS registration workflow, if you need one Client request, Server service support, Discovery
Reverse Connect Server-initiated OPC TCP establishment, listener and claim helpers, and server targets Listener and target lifecycle, routing, trust, deadlines, and connection ownership Acceptor, Reverse Connect
GDS Pull Typed client methods and trust-list read and apply helpers Enrollment scheduler, pending-request persistence, retry policy, certificate validation and installation GDS client, GDS client
Alias Names Opt-in alias and category management and search Persistent definitions and version store. Authorization for searches and mutations. Alias manager, Alias Names
Query and node-management services Wire and model types, extension surfaces A query engine or general remote model editor, if you need one. Generated types do not imply either. Default service sets, AddressSpace

Known limitations

These gaps apply at this baseline. Account for them when you evaluate profiles and facets.

Area Limitation Workaround or guide
Historical access The namespace HistoryRead hook alone does not receive continuation-point release requests Handle explicit releases at the service boundary. See Server historical access.
Historical access Default dispatch checks Read and Write operation limits instead of advertised history limits, and does not reject TimestampsToReturn.Neither Enforce these checks at the service boundary. See the limits and timestamps guidance in Server historical access.
Conditions Only the Condition trunk branch is implemented See Alarms and Conditions
Node instantiation The new instantiation package is experimental See Types and instantiation
Discovery registration There is no RegisterServer2 helper. The registerServer helper has no certificate identity and cannot open the authenticated SecureChannel a conformant LDS requires for registration, so it is not a complete LDS registration workflow. See Discovery
Discovery services The default server rejects RegisterServer, RegisterServer2, and FindServersOnNetwork with Bad_ServiceUnsupported, so network discovery is limited See Discovery
Reverse Connect Milo clients require client-initiated (forward) OPC TCP for ECC or RSA-DH Sessions Use forward OPC TCP for those policies. See Security policies.
Query Query fails at service level with Bad_ServiceUnsupported None in the SDK
Node management Node-management requests dispatch to address spaces, whose default per-operation result is Bad_NotSupported Override addNodes, deleteNodes, addReferences, and deleteReferences in your AddressSpace if you need them
Method Call An address space that does not implement Call returns Bad_NotImplemented per operation Use a ManagedAddressSpace, which implements Call, and bind a handler to each method node. See Server methods.
PubSub No PubSub (Part 14) implementation or module None in the SDK
Auditing The server does not generate audit events, and loading the standard Audit type Nodes does not implement auditing facets None in the SDK

Module-level gaps, such as the incubating transports and the deprecated dictionary packages, are described under Modules and transport boundaries. Model import gaps are under NodeSet and companion specifications.

Modules and transport boundaries

Use this table to choose dependencies. Build applications on milo-sdk-client or milo-sdk-server, and add the others as needed:

Module Add it when
milo-sdk-client-gds You need the GDS Pull helpers
milo-sdk-client-gds-testing Your tests need FakeGdsNamespace. It is a published artifact.
milo-encoding-xml, milo-encoding-json You do direct encoding work. See Encodings.
milo-dtd-reader A peer exposes only DataTypeDictionaries. It adds legacy DataTypeDictionary discovery for OPC UA 1.03 and earlier servers.
milo-dtd-manager You publish server-side dictionaries

Align all Milo artifact versions, optionally with milo-bom. DataTypeDefinition-based dynamic type discovery is built into milo-sdk-client. Prefer DataTypeDefinition-based designs for new models. The legacy dictionary packages, including the corresponding dtd-core packages, have been deprecated for removal at package level since 1.0.0. Package-level deprecation produces no normal compiler warnings.

These tutorials use OPC TCP with UA Binary. The transport-https and transport-websocket modules are marked incubating, incomplete or non-functional, and unpublished, so this guide does not offer them for production. The separate SDK codec-json module is also incubating and unpublished. Do not confuse it with milo-encoding-json in the stack. An XML or JSON value codec does not provide an HTTP, WebSocket, or PubSub application.

NodeSet and companion specifications

Read this if your model comes from a NodeSet2 file or a companion specification. The SDK contains the standard model, generated model classes, custom-type support, and instantiation APIs. This baseline does not supply a general NodeSet2 XML import or export API, and XML value decoding does not load a companion specification's address space.

Integrating an external loader or code generator requires a compatible tool, its own dependencies, generated model and codec registration, and a runnable interoperability check. The tutorials assume no such loader.

Assessing support

Use this approach when you decide whether Milo covers a required feature. For each feature, identify the runtime path, its supported modes and statuses, and the tests or example that exercise it. Then test the actual peer product and deployment configuration.

Local Milo-to-Milo tests confirm documented local behavior only. FakeGdsNamespace and mocks cannot confirm vendor GDS interoperability. A release's protocol target does not mean every optional service, profile, or facet is implemented or certified, so check the Known limitations against your required profiles.

Examples and reference

Start with Your first client and Your first server for the supported local TCP path. Add the relevant feature and its failure cases before deploying it.

Next steps

This is the last reference page. When your application is ready to leave the development machine, continue with Deployment for addresses, persisted identities, and shutdown order.

Related: Reference · Release notes · Examples · Configuration

Clone this wiki locally