基于OpenDDS应用程序开发(3)订阅端实现
连续的三篇博文演示如何基于OpenDDS开发应用程序,将数据从发布端节点发送到订阅端节点,该示例程序由一个发布者发布数据,一个订阅者订阅数据,使用默认的QoS策略和TCP/IP传输方式。
本文是第三篇,主要介绍开发一个简单的OpenDDS订阅端应用程序所涉及的步骤。省略一些不重要部分(如:#include部分和异常处理等)代码,只写出关键代码。
1、新建订阅端工程:
参考前一博文中MPC的用法,在Demo.mpc文件中增加如下内容:
1  | 
 project(*Subscriber) : dcpsexe_with_tcp {
 exename = subscriber
 | 
Subscriber工程从父工程dcpsexe_with_tcp继承,这里直接使用idl工程中定义好的Demo.idl文件。
之后在Demo目录下新建三个文件:Subscriber.cpp、DataReaderListenerImpl.h、DataReaderListenerImpl.cpp,分别用来编写订阅端逻辑部分代码,并再次使用如下命令来生成Vs2008工程:
1  | 
mwc.pl -type vc9  | 
生成完成之后,使用Vs2008打开Demo.sln,就可以修改订阅端代码了:
2、初始化参与者:
初始化订阅端参与者代码同发布端是完全一样的,在Subscriber.cpp文件中增加如下内容:
1  | 
int main(int argc, char *argv[])  | 
3、注册数据类型并创建主题:
接下来,初始化数据类型和主题:
1  | 
Demo::PosTypeSupport_var mts = new Demo::PosTypeSupportImpl();  | 
4、创建订阅者:
调用create_subscriber()操作创建一个带有默认QoS策略的订阅者:
1  | 
DDS::Subscriber_var sub =  | 
5、创建数据读者及监听者:
订阅端需要给数据读者关联一个监听者,用来接收数据的到达,下面的代码定义了一个监听者对象,类DataReaderListenerImpl的实现将在下一部分介绍。
1  | 
DDS::DataReaderListener_var listener(new DataReaderListenerImpl);  | 
现在采用默认的QoS策略创建数据读者,并将它与主题、刚刚创建的监听者对象相关联起来:
1  | 
DDS::DataReader_var dr =  | 
之后,主线程就可以自由的去处理其它工作了,当有数据到达时,OpenDDS会调用监听者对象的回调接口通知,只需要在DataReaderListenerImpl类的回调函数中接收需要的数据就可以了。
6、数据读者监听者实现:
监听者类继承自DDS规范的DDS::DataReaderListener接口,该接口定义了一些回调函数,每个回调函数被调用时,就是一个事件的通知,如:断开、重连等,以下是DataReaderListener接口的定义:
1  | 
module DDS {
 local interface DataReaderListener : Listener {
   void on_requested_deadline_missed(in DataReader reader,
 | 
在本例的DataReaderListenerImpl类中真正需要的实现的回调接口是on_data_available(),它也是我们需要重新派生该类的唯一成员函数:
1  | 
void DataReaderListenerImpl::on_data_available(DDS::DataReader_ptr reader) {
 num_reads_ ++;
 try{
   Demo::PosDataReader_var reader_i = Demo::PosDataReader::_narrow(reader);
 | 
上面的代码将样本从数据读者中取出,如果成功并能返回有效数据,就打印出接收到数据的每一个字段。
每当有样本数据到达时,该函数就会被调用。
7、实体清理:
在订阅完数据以后,需要清理与OpenDDS相关联的资源:
1  | 
participant->delete_contained_entities();  | 
调用域参与者的delete_contained_entities()操作删除所有该参与者创建的主题、订阅者。一旦执行完该操作,就可以使用域参与者工厂删除域参与者了。
8、示例程序运行:
修改完以上代码并编译完成,就可以运行订阅端应用程序了,需要先运行DDS的信息仓库,开始中打开一个CMD窗口,执行如下命令:
1  | 
%DDS_ROOT%/bin/DCPSInfoRepo -ORBListenEndpoints iiop://localhost:12345  | 
再次打开一个CMD窗口,cd到Demo目录下,执行如下命令:
1  | 
subscriber -DCPSInfoRepo corbaloc::localhost:12345/DCPSInfoRepo  | 
至此,订阅端应用程序就开发完成并运行起来了。
有关OpenDDS的相关问题欢迎发送邮件至lyingbo@aliyun.com一起讨论
基于OpenDDS应用程序开发(3)订阅端实现的更多相关文章
- Linux网络编程:基于TCP的程序开发回顾篇《转》
		
面向连接的TCP程序设计 基于TCP的程序开发分为服务器端和客户端两部分,常见的核心步骤和流程: 其实按照上面这个流程调用系统API确实可以完全实现应用层程序的开发,一点问题没有.可随着时间的推移,你 ...
 - Linux网络编程:基于UDP的程序开发回顾篇
		
基于无连接的UDP程序设计 同样,在开发基于UDP的应用程序时,其主要流程如下: 对于面向无连接的UDP应用程序在开发过程中服务端和客户端的操作流程基本差不多.对比面向连接的TCP程序,服务端少了 ...
 - 小程序开发时PC端调试返回结果和手机端IOS不一致问题
		
IOS11登录时遇到一个请求与PC返回不一致情况, 在小程序调试时IOS上始终没有wx.request() 不能发送请求 尝试解决方法 打开微信小程序调试的设置, 将TLS设为可信任的域名 设置 -- ...
 - WCF/WPF公司内部订餐程序开发
		
WCF/WPF公司内部订餐程序开发 (服务端篇) 上班的第一天,群里讨论关于订餐的问题,所以想到了要不要自己开发一个公司内部的订餐系统呢?方便公司内部员工的订餐,有了想法就简单的实践了下 . 实现还是 ...
 - Replication的犄角旮旯(一)--变更订阅端表名的应用场景
		
<Replication的犄角旮旯>系列导读 Replication的犄角旮旯(一)--变更订阅端表名的应用场景 Replication的犄角旮旯(二)--寻找订阅端丢失的记录 Repli ...
 - 基于 SailingEase WinForm Framework 开发客户端程序(3:实现菜单/工具栏按钮的解耦及状态控制)
		
本系列文章将详细阐述客户端应用程序的设计理念,实现方法. 本系列文章以 SailingEase WinForm Framework 为基础进行设计并实现,但其中的设计理念及方法,亦适用于任何类型的客 ...
 - 基于MINA框架快速开发网络应用程序
		
1.MINA框架简介 MINA(Multipurpose Infrastructure for Network Applications)是用于开发高性能和高可用性的网络应用程序的基础框架.通过使用M ...
 - 基于微信小程序的系统开发准备工作
		
腾讯推出微信小程序也有一段时间了,在各种行业里面也都掀起一阵阵的热潮,很多APP应用被简化为小程序的功能迅速推出,同时也根据小程序的特性推出各种独具匠心的应用,相对传统的APP来说,微信小程序确实能够 ...
 - 基于Oracle ADF的应用程序开发
		
ADF简介 ADF(Application Development Framework)是Oracle公司为简化J2EE程序开发的复杂性专门开发的一种解决方案,ADF通过减少实现设计模式和应用程序框架 ...
 
随机推荐
- MyBatis从入门到精通(第4章):MyBatis动态SQL【foreach、bind、OGNL用法】
			
(第4章):MyBatis动态SQL[foreach.bind.OGNL用法] 4.4 foreach 用法 SQL 语句中有时会使用 IN 关键字,例如 id in (1,2,3).可以使用 ${i ...
 - MySQL和Java数据类型对照表
			
Java MySQL数据类型对照 类型名称 显示长度 数据库类型 JAVA类型 JDBC类型索引(int) 描述 VARCHAR L+N VARCHAR java.lang.S ...
 - 在mybatis框架中,延迟加载与连表查询的差异
			
1.引子 mybatis的延迟加载,主要应用于一个实体类中有复杂数据类型的属性,包括一对一和一对多的关系(在xml中用collection.association标签标识).这个种属性往往还对应着另一 ...
 - C++ 静态成员变量、成员函数
			
1.每个变量,都有自己的属性. 2.用 static 定义的成员变量.成员函数 ,是属于所有变量的. 3.关键字 static 可以用于说明一个类的成员. 4.把一个类的成员说明为 static 时, ...
 - python-day7爬虫基础之Ajax数据爬取
			
前几天一直在忙老师的项目,就没有继续学python,也没有写什么收获,今天晚上有空看看书,边看边理解着写吧: 首先说一下,我对Ajax的理解,就是有时候我们在浏览某个网页的时候,只要我们鼠标一直往下滑 ...
 - \_\_module\_\_和\_\_class\_\_
			
目录 __module__和__class__ 一.__module__ 二.通过字符导入模块 三.__class__ __module__和__class__ # lib/aa.py class C ...
 - opencv+tkinter制作HsvMaster(一)
			
这两天看opencv-python的HSV色彩空间,在写程序时发现用HSV来提取图像区域是件令人恶心的麻烦事.拿阈值分割做个对比,阈值最多也就一两个参数需要调整:但是HSV需要对三个通道调整上下限,也 ...
 - 解决IntelliJ IDEA Community 社区版 启动Tomcat插件 "Smart Tomcat" NullPointerException 空指针异常
			
IntelliJ IDEA Community社区版默认是没有Ultimate版的Tomcat Server,这时候就可以使用插件"Smart Tomcat"; 在"Ru ...
 - iterm2 粘贴时有多余字符 0~ 1~
			
https://github.com/ChrisJohnsen/tmux-MacOSX-pasteboard/issues/31 printf '\e[?2004l'
 - 吴裕雄--天生自然 PYTHON3开发学习:输入和输出
			
str = input("请输入:"); print ("你输入的内容是: ", str) # 打开一个文件 f = open("/tmp/foo.t ...