FASTDDS 发布订阅例子

1个publisher,2个subscriber

修改HelloWorldExample.py,让发布者定时1秒向 topicName = “myTopic”中写入数据;

class Writer:
  def __init__(self, domain, machine):
    self.machine = machine
    self._matched_reader = 0
    self._cvDiscovery = Condition()

    factory = fastdds.DomainParticipantFactory.get_instance()
    self.participant_qos = fastdds.DomainParticipantQos()
    factory.get_default_participant_qos(self.participant_qos)
    self.participant = factory.create_participant(domain, self.participant_qos)

    self.topic_data_type = HelloWorld.HelloWorldPubSubType()
    self.topic_data_type.setName("HelloWorldDataType")
    self.type_support = fastdds.TypeSupport(self.topic_data_type)
    self.participant.register_type(self.type_support)

    self.topic_qos = fastdds.TopicQos()
    self.participant.get_default_topic_qos(self.topic_qos)
    self.topic = self.participant.create_topic("myTopic", self.topic_data_type.getName(), self.topic_qos)

    self.publisher_qos = fastdds.PublisherQos()
    self.participant.get_default_publisher_qos(self.publisher_qos)
    self.publisher = self.participant.create_publisher(self.publisher_qos)

    self.listener = WriterListener(self)
    self.writer_qos = fastdds.DataWriterQos()
    self.publisher.get_default_datawriter_qos(self.writer_qos)
    self.writer = self.publisher.create_datawriter(self.topic, self.writer_qos, self.listener)

    self.index = 0

  def write(self):
    data = HelloWorld.HelloWorld()
    if self.machine:
      data.message("Hello World " + self.machine)
    else:
      data.message("Hello World")
    data.index(self.index)
    self.writer.write(data)
    print("Sending {message} : {index}".format(message=data.message(), index=data.index()))
    self.index = self.index + 1

  def __del__(self):
    factory = fastdds.DomainParticipantFactory.get_instance()
    self.participant.delete_contained_entities()
    factory.delete_participant(self.participant)

  def run(self):
    self.wait_discovery()
    # for x in range(10) :
    while True:
        time.sleep(1)
        self.write()

  def wait_discovery(self) :
    self._cvDiscovery.acquire()
    print ("Writer is waiting discovery...")
    self._cvDiscovery.wait_for(lambda : self._matched_reader != 0)
    self._cvDiscovery.release()
    print("Writer discovery finished...")

启动一个发布端,两个订阅端。

 当发布端和订阅端匹配上后,发布端开始发数据,订阅端1开始接收数据,当订阅端2启动后,同样可以接收myTopic的数据,历史数据没有,仅接收到订阅匹配后发布端发出的数据。

  • 1个publisher,1个subscriber(2个DataReader)

一个subscriber例化两个DataReader,两个DataReader的ReaderListener新增编号作为区别

class Reader():
  def __init__(self, domain):
    factory = fastdds.DomainParticipantFactory.get_instance()
    self.participant_qos = fastdds.DomainParticipantQos()
    factory.get_default_participant_qos(self.participant_qos)
    self.participant = factory.create_participant(domain, self.participant_qos)

    self.topic_data_type = HelloWorld.HelloWorldPubSubType()
    self.topic_data_type.setName("HelloWorldDataType")
    self.type_support = fastdds.TypeSupport(self.topic_data_type)
    self.participant.register_type(self.type_support)

    self.topic_qos = fastdds.TopicQos()
    self.participant.get_default_topic_qos(self.topic_qos)
    self.topic = self.participant.create_topic("myTopic", self.topic_data_type.getName(), self.topic_qos)

    self.subscriber_qos = fastdds.SubscriberQos()
    self.participant.get_default_subscriber_qos(self.subscriber_qos)
    self.subscriber = self.participant.create_subscriber(self.subscriber_qos)

    self.listener = ReaderListener(1)
    self.reader_qos = fastdds.DataReaderQos()
    self.subscriber.get_default_datareader_qos(self.reader_qos)
    self.reader = self.subscriber.create_datareader(self.topic, self.reader_qos, self.listener)

    self.listener1 = ReaderListener(2)
    self.reader_qos = fastdds.DataReaderQos()
    self.subscriber.get_default_datareader_qos(self.reader_qos)
    self.reader1 = self.subscriber.create_datareader(self.topic, self.reader_qos, self.listener1)
class Reader():
  def __init__(self, domain):
    factory = fastdds.DomainParticipantFactory.get_instance()
    self.participant_qos = fastdds.DomainParticipantQos()
    factory.get_default_participant_qos(self.participant_qos)
    self.participant = factory.create_participant(domain, self.participant_qos)

    self.topic_data_type = HelloWorld.HelloWorldPubSubType()
    self.topic_data_type.setName("HelloWorldDataType")
    self.type_support = fastdds.TypeSupport(self.topic_data_type)
    self.participant.register_type(self.type_support)

    self.topic_qos = fastdds.TopicQos()
    self.participant.get_default_topic_qos(self.topic_qos)
    self.topic = self.participant.create_topic("myTopic", self.topic_data_type.getName(), self.topic_qos)

    self.subscriber_qos = fastdds.SubscriberQos()
    self.participant.get_default_subscriber_qos(self.subscriber_qos)
    self.subscriber = self.participant.create_subscriber(self.subscriber_qos)

    self.listener = ReaderListener(1)
    self.reader_qos = fastdds.DataReaderQos()
    self.subscriber.get_default_datareader_qos(self.reader_qos)
    self.reader = self.subscriber.create_datareader(self.topic, self.reader_qos, self.listener)

    self.listener1 = ReaderListener(2)
    self.reader_qos = fastdds.DataReaderQos()
    self.subscriber.get_default_datareader_qos(self.reader_qos)
    self.reader1 = self.subscriber.create_datareader(self.topic, self.reader_qos, self.listener1)

启动一个发布端,然后启动一个订阅端,订阅端包括两个DataReader

  • 1个publisher,2个topic,subscriber只订阅一个topic

发布端的participant 创建两个topic 分别为 "myTopic"和“myTestTopic”,并为每个topic创建一个DataWriter,两个topic共用同一个数据类型。订阅端分别订阅两个topic。

订阅端订阅 topic = “myTopic”

发布端

class Writer:
  def __init__(self, domain, machine):
    self.machine = machine
    self._matched_reader = 0
    self._cvDiscovery = Condition()

    factory = fastdds.DomainParticipantFactory.get_instance()
    self.participant_qos = fastdds.DomainParticipantQos()
    factory.get_default_participant_qos(self.participant_qos)
    self.participant = factory.create_participant(domain, self.participant_qos)

    self.topic_data_type = HelloWorld.HelloWorldPubSubType()
    self.topic_data_type.setName("HelloWorldDataType")
    self.type_support = fastdds.TypeSupport(self.topic_data_type)
    self.participant.register_type(self.type_support)

    self.topic_qos = fastdds.TopicQos()
    self.participant.get_default_topic_qos(self.topic_qos)
    self.topic = self.participant.create_topic("myTopic", self.topic_data_type.getName(), self.topic_qos)

    self.topic_qos = fastdds.TopicQos()
    self.participant.get_default_topic_qos(self.topic_qos)
    self.topic1 = self.participant.create_topic("myTestTopic", self.topic_data_type.getName(), self.topic_qos)

    self.publisher_qos = fastdds.PublisherQos()
    self.participant.get_default_publisher_qos(self.publisher_qos)
    self.publisher = self.participant.create_publisher(self.publisher_qos)

    self.listener = WriterListener(self)
    self.writer_qos = fastdds.DataWriterQos()
    self.publisher.get_default_datawriter_qos(self.writer_qos)
    self.writer = self.publisher.create_datawriter(self.topic, self.writer_qos, self.listener)

    self.writer1 = self.publisher.create_datawriter(self.topic1, self.writer_qos, self.listener)

    self.index = 0

  def write(self):
    data = HelloWorld.HelloWorld()
    if self.machine:
      data.message("Hello World " + self.machine)
    else:
      data.message("Hello World" + " from myTopic")
    data.index(self.index)
    self.writer.write(data)
    print("Sending {message} : {index}".format(message=data.message(), index=data.index()))
    self.index = self.index + 1

  def write1(self):
    data = HelloWorld.HelloWorld()
    if self.machine:
      data.message("Hello World " + self.machine)
    else:
      data.message("Hello World" + " from myTestTopic")
    data.index(self.index)
    self.writer1.write(data)
    print("Sending {message} : {index}".format(message=data.message(), index=data.index()))
    self.index = self.index + 1

  def __del__(self):
    factory = fastdds.DomainParticipantFactory.get_instance()
    self.participant.delete_contained_entities()
    factory.delete_participant(self.participant)

  def run(self):
    self.wait_discovery()
    # for x in range(10) :
    while True:
        time.sleep(1)
        self.write()
        self.write1()

  def wait_discovery(self) :
    self._cvDiscovery.acquire()
    print ("Writer is waiting discovery...")
    self._cvDiscovery.wait_for(lambda : self._matched_reader != 0)
    self._cvDiscovery.release()
    print("Writer discovery finished...")

订阅端

class Reader():
  def __init__(self, domain):
    factory = fastdds.DomainParticipantFactory.get_instance()
    self.participant_qos = fastdds.DomainParticipantQos()
    factory.get_default_participant_qos(self.participant_qos)
    self.participant = factory.create_participant(domain, self.participant_qos)

    self.topic_data_type = HelloWorld.HelloWorldPubSubType()
    self.topic_data_type.setName("HelloWorldDataType")
    self.type_support = fastdds.TypeSupport(self.topic_data_type)
    self.participant.register_type(self.type_support)

    self.topic_qos = fastdds.TopicQos()
    self.participant.get_default_topic_qos(self.topic_qos)
    self.topic = self.participant.create_topic("myTopic", self.topic_data_type.getName(), self.topic_qos)

    self.subscriber_qos = fastdds.SubscriberQos()
    self.participant.get_default_subscriber_qos(self.subscriber_qos)
    self.subscriber = self.participant.create_subscriber(self.subscriber_qos)

    self.listener1 = ReaderListener(1)
    self.reader_qos = fastdds.DataReaderQos()
    self.subscriber.get_default_datareader_qos(self.reader_qos)
    self.reade1 = self.subscriber.create_datareader(self.topic, self.reader_qos, self.listener1)

  def __del__(self):
    factory = fastdds.DomainParticipantFactory.get_instance()
    self.participant.delete_contained_entities()
    factory.delete_participant(self.participant)

  def run(self):
    try:
      input('Press any key to stop')
    except:
      pass

订阅端订阅 topic = “myTestTopic”

订阅端代码

class Reader():
  def __init__(self, domain):
    factory = fastdds.DomainParticipantFactory.get_instance()
    self.participant_qos = fastdds.DomainParticipantQos()
    factory.get_default_participant_qos(self.participant_qos)
    self.participant = factory.create_participant(domain, self.participant_qos)

    self.topic_data_type = HelloWorld.HelloWorldPubSubType()
    self.topic_data_type.setName("HelloWorldDataType")
    self.type_support = fastdds.TypeSupport(self.topic_data_type)
    self.participant.register_type(self.type_support)

    self.topic_qos = fastdds.TopicQos()
    self.participant.get_default_topic_qos(self.topic_qos)
    self.topic = self.participant.create_topic("myTestTopic", self.topic_data_type.getName(), self.topic_qos)

    self.subscriber_qos = fastdds.SubscriberQos()
    self.participant.get_default_subscriber_qos(self.subscriber_qos)
    self.subscriber = self.participant.create_subscriber(self.subscriber_qos)

    self.listener1 = ReaderListener(1)
    self.reader_qos = fastdds.DataReaderQos()
    self.subscriber.get_default_datareader_qos(self.reader_qos)
    self.reade1 = self.subscriber.create_datareader(self.topic, self.reader_qos, self.listener1)

    # self.listener2 = ReaderListener(2)
    # self.reader_qos = fastdds.DataReaderQos()
    # self.subscriber.get_default_datareader_qos(self.reader_qos)
    # self.reader2 = self.subscriber.create_datareader(self.topic, self.reader_qos, self.listener2)

  def __del__(self):
    factory = fastdds.DomainParticipantFactory.get_instance()
    self.participant.delete_contained_entities()
    factory.delete_participant(self.participant)

  def run(self):
    try:
      input('Press any key to stop')
    except:
      pass

  • 1个publisher,2个topic,subscriber订阅2个topic

class Reader():
  def __init__(self, domain):
    factory = fastdds.DomainParticipantFactory.get_instance()
    self.participant_qos = fastdds.DomainParticipantQos()
    factory.get_default_participant_qos(self.participant_qos)
    self.participant = factory.create_participant(domain, self.participant_qos)

    self.topic_data_type = HelloWorld.HelloWorldPubSubType()
    self.topic_data_type.setName("HelloWorldDataType")
    self.type_support = fastdds.TypeSupport(self.topic_data_type)
    self.participant.register_type(self.type_support)

    self.topic_qos = fastdds.TopicQos()
    self.participant.get_default_topic_qos(self.topic_qos)
    self.topic = self.participant.create_topic("myTopic", self.topic_data_type.getName(), self.topic_qos)

    self.topic1 = self.participant.create_topic("myTestTopic", self.topic_data_type.getName(), self.topic_qos)


    self.subscriber_qos = fastdds.SubscriberQos()
    self.participant.get_default_subscriber_qos(self.subscriber_qos)
    self.subscriber = self.participant.create_subscriber(self.subscriber_qos)

    self.listener1 = ReaderListener(1)
    self.reader_qos = fastdds.DataReaderQos()
    self.subscriber.get_default_datareader_qos(self.reader_qos)
    self.reader1 = self.subscriber.create_datareader(self.topic, self.reader_qos, self.listener1)

    self.reader2 = self.subscriber.create_datareader(self.topic1, self.reader_qos, self.listener1)

    # self.listener2 = ReaderListener(2)
    # self.reader_qos = fastdds.DataReaderQos()
    # self.subscriber.get_default_datareader_qos(self.reader_qos)
    # self.reader2 = self.subscriber.create_datareader(self.topic, self.reader_qos, self.listener2)

  def __del__(self):
    factory = fastdds.DomainParticipantFactory.get_instance()
    self.participant.delete_contained_entities()
    factory.delete_participant(self.participant)

  def run(self):
    try:
      input('Press any key to stop')
    except:
      pass

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值