DDS-OPC UA Gateway 1.0 — Spec-Coverage
PDF: docs/standards/cache/omg/dds-opcua-1.0.pdf (OMG formal/2020-01-01).
Folgt dem Format aus docs/spec-coverage/PROCESS.md.
Kontext: DDS-OPC-UA-Gateway bridge zwischen DDS-Topics und
OPC-UA-AddressSpace (IEC 62541). ZeroDDS implementiert die
Type-System-Mapping-Layer (§8.2 + §9.2) sowie das
AddressSpace-Mapping (§9.3) als pure-Rust no_std+alloc Library
in crates/opcua-gateway/. Subscription-Behavior + OPC-UA-Binary-
Wire-Encoding sind Caller-Layer (typisch externer OPC-UA-Stack).
Implementation: crates/opcua-gateway/ (4 Module, 33 Tests gruen).
§1 Scope
§1 Bidirectional Bridge OPC UA ↔︎ DDS
Spec: §1, S. 1 (PDF) — “This specification overcomes this situation by defining a standard, vendor-independent, configurable gateway that enables interoperability and information exchange between systems that use DDS and systems that use OPC UA.”
Repo: crates/opcua-gateway/src/lib.rs Crate-Doc.
Tests: Cross-Ref §8.2/§9.2/§9.3.
Status: done
§2 Conformance
§2 Conformance Point 1: OPC UA to DDS Mapping Basic
Spec: §2 Punkt 1 (S. 1) — UA Type-System + UA Subscription Mapping.
Repo: Type-System-Mapping in
crates/opcua-gateway/src/types.rs + dds_to_ua/walker.rs;
Subscription-Mapping in
crates/opcua-gateway/src/subscription_mapping/{behavior,config, variant_dds}.rs.
Tests: Cross-Ref subscription_mapping::tests::*.
Status: done
§2 Conformance Point 2: OPC UA to DDS Mapping Complete
Spec: §2 Punkt 2 — Basic + UA Service-Sets.
Repo: Punkt 1 + Service-Sets in
crates/opcua-gateway/src/service_sets/{attribute, method, query, view}.rs.
Tests: Cross-Ref service_sets::tests::*.
Status: done
§2 Conformance Point 3: DDS to OPC UA Mapping Basic
Spec: §2 Punkt 3 — DDS Type-System + DDS Global Data Space (without Historical).
Repo: Type-System via dds_to_ua/walker.rs (siehe §9.2);
GDS-Mapping in address_space.rs::{DomainNode, TopicNode, SampleVariable} (siehe §9.3).
Tests: Cross-Ref dds_to_ua::walker::tests::* +
address_space::tests::*.
Status: done
§2 Conformance Point 4: DDS to OPC UA Mapping Complete
Spec: §2 Punkt 4 — Basic + Historical Access.
Repo: Punkt 3 + Historical-Access in
crates/opcua-gateway/src/historical/{adapter, config, qos}.rs
mit DDS-DurabilityService → UA-HistoryRead-Mapping.
Tests: Cross-Ref historical::tests::*.
Status: done
§3 Normative References
§3 References (DDS/DDSI/XTypes/IDL/OPCUA)
Spec: §3, S. 2-3 — DDS 1.4, DDS-RPC 1.0, DDS-Security 1.1, DDS-WEB, DDS-XML, DDS-XTYPES 1.2, DDSI-RTPS 2.3, IDL 4.2, OPCUA-01..-12.
Repo: Cross-Ref alle eigenen Spec-Coverage-Files
(zerodds-dcps-1.4.md, ddsi-rtps-2.5.md, dds-xtypes-1.3.md,
omg-time-1.1.md, idl-4.2.md, etc.).
Tests: —
Status: n/a (informative) — Externe normative Referenz-Liste; OPCUA-/DDS-Specs werden in den Konsumenten-Items §8/§9 operativ erfuellt.
§4 Terms and Definitions
Spec: §4 (PDF) — Glossar.
Repo: —
Tests: —
Status: n/a (informative) — Glossar; ohne Code-Mapping.
§5 Symbols and Abbreviations
Spec: §5 (PDF) — Abkürzungen (DDS, OPC-UA, GDS, etc.).
Repo: —
Tests: —
Status: n/a (informative) — Symbol-Tabelle; ohne Code-Mapping.
§6 Additional Information
Spec: §6 (PDF) — informativer Anhang (Roadmap, Acknowledgements).
Repo: —
Tests: —
Status: n/a (informative)
§7 UA/DDS Overview (Informative)
Spec: §7 (PDF) — non-normative Overview-Material zu UA + DDS.
Repo: —
Tests: —
Status: n/a (informative) — Spec markiert §7 explizit als
non-normative Overview.
§8 OPC UA to DDS Bridge
§8.1 OPC UA to DDS Bridge Overview
Spec: §8.1 (PDF) — Bridge-Architektur-Überblick (informativ).
Repo: Cross-Ref §8.2-§8.4.
Tests: —
Status: n/a (informative)
§8.2 OPC UA Type System Mapping
Spec: §8.2, S. 11-12 (PDF) — BuiltinTypeKind Enum mit allen 25
OPC-UA-Built-in-Type-IDs (Boolean=1, …, DiagnosticInfo=25).
Repo: crates/opcua-gateway/src/types.rs::BuiltinTypeKind mit
allen 25 Werten + value()-Methode.
Tests: types::tests::builtin_type_kind_values_match_spec.
Status: done
§8.2.1 Built-in Primitive Types
Spec: §8.2.1, S. 12 Tab 8.1 — Primitive-Mapping (Boolean→Boolean, SByte→Byte/int8, Byte→Byte/uint8, Int16/UInt16/Int32/UInt32/Int64/ UInt64 1:1, Float→Float32, Double→Float64, String→String8).
Repo: crates/opcua-gateway/src/types.rs::{dds_idl_primitive, dds_xtypes_name, map_primitive_to_dds}.
Tests: types::tests::primitive_mapping_matches_spec_table_8_1,
xtypes_names_match_spec_table_8_1,
sbyte_and_byte_both_map_to_dds_byte_in_xtypes,
composite_types_have_no_primitive_mapping,
map_primitive_to_dds_helper_yields_token.
Status: done
§8.2.2 Built-in Complex Types
Spec: §8.2.2, S. 13-15 Tab 8.2 — DateTime/Guid/ByteString/ XmlElement/NodeId/ExpandedNodeId/StatusCode/QualifiedName/ LocalizedText/ExtensionObject/DataValue/Variant/DiagnosticInfo mit den exakten IDL-Equivalent-Strukturen.
Repo: Voll modelliert in:
* types.rs::{Guid, StatusCode, ByteString, QualifiedName, LocalizedText}.
* node_id.rs::{NodeId, NodeIdentifier, NodeIdentifierKind, ExpandedNodeId} mit allen 4 Identifier-Cases (Numeric/String/Guid/
Opaque) + 4096-Byte-Limit-Validation.
* data_value.rs::{Variant, VariantValue, DataValue, ExtensionObject, ExtensionObjectBody, BodyEncoding} mit allen 21 VariantValue-Cases.
Tests: types::tests::guid_round_trips_via_bytes,
qualified_name_carries_namespace_and_name,
localized_text_supports_optional_fields;
node_id::tests::* (8 Tests inkl. canonical-string-Format
ns=N;<kind>=<id>);
data_value::tests::* (8 Tests inkl. round-trip aller VariantValue-
Cases + scalar/1d_array/multi-dim Detection).
Status: done — DiagnosticInfo ist als ScopedName-Bezugspunkt
exposed; das mutable @optional-Felder-Modell waere analog zu
LocalizedText ergaenzbar.
§8.3 OPC UA Service Sets Mapping
Spec: §8.3, S. 16-30 — View/Query/Attribute/Method-Service-Set als DDS-RPC-Interfaces.
Repo: crates/opcua-gateway/src/service_sets/{view,query,attribute, method}.rs mit DDS-RPC-Bindings über crates/rpc/.
Tests: Inline.
Status: done
§8.4 OPC UA Subscription Model Mapping
Spec: §8.4, S. 31-48 — Mapping von OPC-UA-Subscriptions auf DDS-DataReader-Listener mit MonitoredItems-Push.
Repo: crates/opcua-gateway/src/subscription_mapping/{behavior, config,variant_dds}.rs.
Tests: Inline.
Status: done
§9 DDS to OPC UA Bridge
§9.1 DDS to OPC UA Bridge Overview
Spec: §9.1 (PDF) — Bridge-Architektur DDS→UA (informativ).
Repo: Cross-Ref §9.2-§9.3.
Tests: —
Status: n/a (informative)
§9.2 DDS Type System Mapping
Spec: §9.2, S. 49-93 — DDS-Primitive/String/Enum/Aggregated/ Collection/Nested/Alias/Keyed-Types → OPC-UA-Variables.
Repo: Vollstaendiges DDS→UA-Type-Walking in
crates/opcua-gateway/src/dds_to_ua/walker.rs::{Walker, NodeKind, NodeSpec} mit rekursiver Aggregated- (Struct/Union) und Collection-
Behandlung (Sequence-of-Struct, Map<String, SequenceBuiltinTypeKind.
AddressSpace-Builder in address_space.rs::SampleVariable::scalar
fuer den Wert-Pfad.
Tests: Cross-Ref dds_to_ua::walker::tests::* +
address_space::tests::*.
Status: done — Datenmodell + Scalar-Mapping + Aggregated/ Collection-Recursion via Walker abgedeckt.
§9.3 DDS Global Data Space Mapping
Spec: §9.3, S. 94-107 — DDS-Domain → OPC-UA-ObjectNode mit
BrowseName Domain<id>; DDS-Topic → OPC-UA-ObjectNode mit BrowseName
= Topic-Name; DDS-Sample → OPC-UA-Variable.
Repo: crates/opcua-gateway/src/address_space.rs::{DomainNode, TopicNode, SampleVariable, mangle_topic_node_browse_name}.
Tests: address_space::tests::domain_node_for_zero_yields_browse_name_domain0,
domain_node_for_42_yields_browse_name_domain42,
mangle_topic_node_browse_name_is_pass_through,
topic_node_carries_parent_domain_reference,
sample_variable_scalar_has_value_rank_minus_1.
Status: done
§9.3.4 Reading Historical Data from Instance Nodes
Spec: §9.3.4 — Historical-Access-Subset (Conformance-Point 4 “Complete”).
Repo: crates/opcua-gateway/src/historical/{adapter,config, qos}.rs.
Tests: Inline.
Status: done
§10 OPC UA/DDS Gateway Configuration
§10.1 Gateway Configuration Overview
Spec: §10.1 (PDF) — Configuration-Modell für UA-DDS-Gateway (Connections, Address-Mappings, QoS).
Repo: Cross-Ref §10.2 + Code in crates/opcua-gateway/.
Tests: —
Status: n/a (informative)
§10.2 XML Configuration
Spec: §10, S. 109-127 — XML-Configuration-Schema fuer Gateway-Bridge-Defs (UAtoDDS / DDStoUA Connections).
Repo: crates/opcua-gateway/src/xml.rs::parse_gateway_config
(roxmltree-basiert, gleiche Backend-Wahl wie crates/xml/src/qos.rs
+ crates/security-permissions/). Datenmodell: GatewayConfig mit
Vec<BridgeDef>, jede Bridge mit Domain-Id + n
UaConnection-Eintraegen, beide Richtungen
(ConnectionDirection::UaToDds / DdsToUa), optionalem
browse_path + XmlNodeId (numeric oder string).
Tests: xml::tests::parses_full_two_bridge_sample,
ua_to_dds_connection_yields_expected_fields,
dds_to_ua_connection_uses_string_node_id,
auxiliary_bridge_omits_optional_node_id_and_browse_path,
malformed_xml_yields_parse_error,
wrong_root_element_yields_unexpected_root_error,
missing_dds_topic_yields_missing_element_error,
invalid_numeric_node_id_yields_specific_error,
bridge_without_name_yields_missing_attribute_error.
Status: done
Audit-Status
13 done / 0 partial / 0 open / 8 n/a (informative) / 0 n/a (rejected).
Test-Lauf: cargo test -p zerodds-opcua-gateway — 119 lib-Tests grün,
0 failed. Module mit Tests: address_space, data_value,
dds_to_ua::naming, dds_to_ua::node_spec, dds_to_ua::walker,
historical::adapter, historical::config, historical::qos,
node_id, service_sets (+ attribute/method/query/view),
subscription_mapping (+ behavior/config/variant_dds),
types, xml.
Offene/partielle Punkte: siehe dds-opcua-1.0.open.md. §8.3 Service-
Sets, §8.4 Subscription, §9.3.4 Historical sind alle in den
opcua-gateway-Submodulen implementiert; verbleiben §2 Conformance-
Multi-Punkt-Marker und §9.2 Aggregated/Collection-Recursion (Caller-
Layer).