opendds初入门之对其支持的tools进行梳理
已经通过opendds的DevGuideExamples和example对opendds的基础功能有了一定了解,关注一下tools目录。
1:首先分析一下tools目录下各模块的功能:
dcpsinfo_dump 集中模式下,连接inforepo,通过快照的方式打印内部已有数据结构,DomainParticipant、Topic、Publisher、Subscriber,DataWriter/DataReader 等dissector 这是提供了一个wireshark插件,实现wireshark对rtps协议的支持,用于支持抓包分析。(插件的方式)excelRTD 是一个COM插件,让Excel能通过RTD接口订阅 DDS Topic数据,然后实时查看数据。在excel中执行=RTD("OpenDDS.ExcelRTD", , "RadarTrack", "velocity") 用inspect OpenDDS的Topic检查工具,用于查看某个Topic 的类型和状态信息IntermediateTypeLang 将IDL类型转换为中间类型语言格式itl(实际上就是json),作为类型转换、跨语言绑定、代码生成的中间桥梁。(构建抽象语法树(AST),C++由opendds_idl原生支持,该模块主要是Java、JSON、XML等后端生成器)(貌似目前只支持了转成json)modeling 定义idl后,在Eclipse中拖拽进行编辑(构建发布订阅逻辑),生成.opendds文件,使用该文件自动生成代码。(使用这个工具,可以实现统一建模,生成对应的代码)monitor 订阅监控主题,订阅内置主题,用于监控 DDS 系统状态。rapidjson 开源第三方json库,供其他模块用。repoctl 用于管理集中发现服务中的inforepo的启动,停止,加入联邦逻辑。 (多个只管理本地的inforepo一起工作)rtpsrelay 中继服务器,用于跨过局域网之类通信用。
2:对各工具的实现底层进行梳理。
dcpsinfo_dump opendds的底层就已经支持,建立在集中模式下,从inforepo中获取数据结构转换成字符串进行打印。dissector 是wareshark下的插件加载机制,会识别所有的dll和lib,加载对应的plugin_register 作为入口(填入对应的注册和销毁函数),开始业务处理。===》非关注模块,待探索。 (本质就是对接收到的报文,按照特定字节依次进行解析)excelRTD excel的com插件机制,使用rtd的方式接收外部数据,实时进行展示。继承自IRtdServer,通过dll特定的入口函数实现注册和真正内部业务调用。===》非关注模块,待探索。 (excel通过rtd的方式,实时显示内部的数据)inspect 主要用到了Service_Participant下的其他不依赖idl的相关服务接口,比如create_recorder,create_replayer,create_writer,create_reader,create_typeless_topic,这些接口提供了泛型的topic的记录,回放,发送,接收,以及创建topic。===》适合构建采集器、桥接器、回放器、转发器等多种数据处理系统,不需要idl。===》这里主要是用到create_typeless_topic和create_recorder,在对应的回调中处理获取内容并打印。===》需要注意,在使用时,发布端和订阅段要完整数据类型,TypeObject的使用转成字符串打印。===》需要注意,在指定传输方式后的底层Transport,opendds内部是有默认的ip和端口的,比如组播ip。IntermediateTypeLang 只是提供了idl的json格式形式,为了给其他模块方便解析用(比如wireshark),用于json解析。===》该模块提供的是对itl文件中存储的json格式的数据进行解析的功能。====》1:opendds是否支持idl生成对应json格式的itl文件。 2:这个json解析itl文件的意义是什么?wireshark怎么用?modeling 基于基于Eclipse的图形化编辑器,生成一些代码?====》直接用图形化拖拽,生成代码,直接运行。====》关注c++代码,该模块是对opendds的基本业务(发布订阅)的封装,暴露统一的接口,供模型调用时使用。====》也就是说对发布订阅等基础接口的二次封装,可以基于这个封装进行调用。monitor 带界面的监控软件,实现了我们对系统内的节点监控逻辑。====》基于opendds底层monitor lib已经对监控功能的支持,这里作为对应监控topic的订阅端,对订阅接收到的内容进行解析即可。====》带界面 + 专门的监控topic + 内置主题(识别节点上下线)实现。====》这个模块需要动态开启monitor的支持。(配置文件中开启)repoctl inforepo的底层支持,联邦的概念对inforepo单节点部署进行扩展。====》inforepo的联邦管理,内部节点会互相备份。====》可以实现分布式,集群布局(二者可搭配)。====》核心代码dds下的inforepo中的FederatorManagerImpl.h 相关接口。rtpsrelay 参考tools下的dds下的Relay.idl,是relay功能支持的相关结构定义。====》首先需要分析定义的结构,支持realy节点之间的交互(水平),支持realy和自身管理域之间的节点交互(垂直)。====》有个分区的概念,支持订阅所有,支持向特定分区发布数据。====》中继模式对spdp,sedp,data的端口选择是依次加一,注意区分水平和垂直。====》分别定义了application_participant和relay_participant,实际上都是relay的核心支持(relay_participant主要用于管理层,属于控制面,管理发布状态、统计、分区信息, application_participant是真正的交互层,真正的链路)。====》relay_participant就好像路由表的作用,维护了管理层结构。====》application_participant的使用和opendds常用有差异,这里用到了ACE_Reactor。====》说是支持stun和ice的功能,只是建立在这个软件上,能支持识别到nat后的公网ip和端口,然后进行交互转发。====》这里是建立在spdp,sedp发布订阅关系表的基础上的,通过表找到对应目标链路进行转发。(内部有个guid概念,唯一关联)
3:总结
对opendds下的tools下的工具进行浅了解,从宏观的角度首先知道其作用以及内部实现原理。