Skip to main content

Interoperability Guide

One of DDS's greatest strengths is interoperability. HDDS can communicate with other DDS implementations out of the box, thanks to the standardized RTPS wire protocol.

Verified Interoperability (9/9 Scenarios)

HDDS has been tested and verified to interoperate with all major DDS implementations:

ImplementationVersionDirectionSamplesStatus
FastDDS3.1.xFastDDS → HDDS583
FastDDS3.1.xHDDS → FastDDS435/448 (97%)
RTI Connext6.1.0RTI → HDDS57
RTI Connext6.1.0HDDS → RTI90/90 (100%)
RTI Connext7.3.0RTI → HDDS49/50 (98%)
CycloneDDS0.10.xCyclone → HDDS50/50
CycloneDDS0.10.xHDDS → Cyclone50/50
OpenDDS3.28.xOpenDDS → HDDS20/20 (100%)
HDDSlatestHDDS → HDDS50/50

RTPS Protocol Versions

ImplementationRTPS VersionVendor ID
HDDS2.30x01aa
FastDDS2.30x010f
RTI Connext 6.x2.30x0101
RTI Connext 7.x2.50x0101
CycloneDDS2.30x0110
OpenDDS2.30x0103
RTI 7.x RTPS 2.5

RTI Connext 7.3.0 uses RTPS 2.5, which HDDS handles automatically without code changes.

Key Features Validated

FeatureTestsStatus
SPDP Discovery9/9 vendors
SEDP Discovery9/9 vendors
Reliable communicationAll scenarios
Best-Effort communicationAll scenarios
XCDR1 serializationFastDDS, RTI, Cyclone
XCDR2 serializationAll vendors
Multi-node clusterCross-machine
96 QoS policy combinationsValidator suite

How Interoperability Works

All compliant DDS implementations use the RTPS (Real-Time Publish Subscribe) protocol for communication. This means:

  1. Automatic Discovery - Participants find each other via SPDP multicast
  2. Wire Compatibility - Data is serialized using CDR2 format
  3. QoS Negotiation - Compatible QoS policies are matched automatically

Quick Start

To communicate between HDDS and another DDS implementation:

  1. Use the same Domain ID (e.g., domain 0)
  2. Use the same Topic name (e.g., "sensor/temperature")
  3. Use compatible data types (same structure, generated from same IDL)
  4. Use compatible QoS (e.g., both RELIABLE or both BEST_EFFORT)

Example: HDDS Publisher → FastDDS Subscriber

HDDS Publisher (Rust):

let participant = Participant::builder("hdds_publisher")
.domain_id(0)
.with_transport(TransportMode::UdpMulticast)
.build()?;
let topic = participant.create_topic::<Temperature>("sensor/temp")?;
let writer = participant.create_writer(&topic)?;

writer.write(&Temperature { sensor_id: "s1".into(), value: 23.5 })?;

FastDDS Subscriber (C++):

auto participant = DomainParticipantFactory::get_instance()->create_participant(0, ...);
auto topic = participant->create_topic("sensor/temp", "Temperature", ...);
auto reader = subscriber->create_datareader(topic, ...);

// Will receive data from HDDS publisher

Detailed Guides

Common Issues

Type Mismatch

Ensure both sides use the same IDL definition:

// Both HDDS and FastDDS should use this exact IDL
struct Temperature {
@key string sensor_id;
float value;
};

QoS Incompatibility

QoS policies must be compatible for matching:

Writer QoSReader QoSResult
RELIABLERELIABLEMatch
RELIABLEBEST_EFFORTMatch
BEST_EFFORTRELIABLENo Match
BEST_EFFORTBEST_EFFORTMatch

Discovery Issues

If participants don't discover each other:

  1. Check firewall settings (ports 7400-7500)
  2. Verify multicast is enabled
  3. Check domain IDs match
  4. Use hdds_viewer to debug traffic