前言
最近做毕设要做一个DDS系统和TISA系统的网关,完全没有基础,只好对着OpenDDS的Developers’ Guide和《分布式系统实时发布/订阅数据分发技术》这本书一点一点学(顺便吐槽这本书就是guide的翻译版,很多语句不通)。遇到很多问题,持续更新,随着慢慢看能解决一部分,希望高手指正。
一些概念
- entity是什么?
答:DCPS entities包括topic, data writer,data reader, publisher, subscriber, domain participant。 - sample数据样本?
答:需要发布/订阅的数据。 - DDS application是什么?
答:dds应用程序,可以认为是需要发布、订阅数据的双方,datawriter,datareader是它们用于收发的一部分。 - 实例和对象的区别?
答:抽象类是无法实例化的,它们的对象只能叫对象;一般类的实例化对象,即可简称对象,也可简称实例。 - sample,instance(实例),fields(字段)和key(键)的关系?
OpenDDS要求数据类型是结构体(类),instance便是这个类的对象(实例),具体来说就是被传输的sample。
一个域里有多种主题;发布消息时,一个主题下有按照结构体(类)创建多个实例instances;key用来识别同一主题下的不同的实例。发布时,拥有不同key的sample是同一主题下的不同实例。默认QOS下,同一个key下的后继的样本视为之前样本的替代。而字段其实就是只源码里的某一段代码。
(汉语书中对example和instance的翻译都是“实例”,我也是迷醉。。。。)其实有点面向对象的概念。
源文件解读
Chap3的例子
- chap3的例子中message.subject_id是键,用来区分不同实例。可是明明
Messenger::Message message;
只创建了一个message实例,每次更改键值其实不是创建不同实例,而是同一个实例改变了值发出去。 - chap3例子里面用了一个for循环来发布不同的实例,所有发布出去之后,再等待subscriber接收。因此,
wait_for_acknowledgements()
是在for循环之外的。原因:
由于DDS内部数据的发布和订阅是解耦的,因此,如果在发送的所有数据已经被订阅所接收之前,发布被断开/关闭,则不能保证数据被递送。如果应用要求所有的发布数必须被接收,那么,可以进行wait_for_acknowledgements()操作&#x