An application uses DataReaders to access data received over DDS. A DataReader is associated with a single Topic. You can have multiple DataReaders and Topics in a single application. In addition, you can have more than one DataReader for a particular Topic in a single application. Subscribers own and manage DataReaders.

To create a DataReader, you need to create a Topic (see Topics) and a DomainParticipant. Optionally, you can add a QoS parameter and a listener.

The following code creates a DynamicData.DataReader for the Topic we created in the Topics section:

subscriber = dds.Subscriber(participant)
reader = dds.DynamicData.DataReader(subscriber, topic)

To receive the data, call read() or take(), which return a collection of loaned data samples:

with reader.take() as samples:
    for sample in samples:

To get notified when new data is available, you can use a StatusCondition and a WaitSet:

samples_read = 0
def handler(_):
    nonlocal reader
    with reader.take() as samples:
        for sample in samples:

# Each Entity has a StatusCondition
status_condition = dds.StatusCondition(reader)

# Specify which status to get notified about and set the handler:
status_condition.enable_statuses = dds.StatusMask.data_available()

# Attach the condition to a waitset and call dispatch() to execute the
# condition handlers when they become active
waitset = dds.WaitSet()
waitset += status_condition
while True:
    waitset.dispatch(dds.Duration(4)) # Wait up to 4 seconds

Alternatively, you can use a DataReaderListener to get notified (see DynamicData.DataReaderListener).