OpenDDS之QosXml库编译(Windows + VS2019)

目录

  • 1、需求背景
  • 2、基础环境
  • 3、编译xercesc
    • 3.1、下载xercesc
    • 3.2、编译xercesc
  • 4、编译ACE_XML_Utils
    • 4.1、生成XML_Utils解决方案
    • 4.2、编译XML_Utils
  • 5、编译QOS_XML_XSC_Handlerd
    • 5.1、生成QOS_XML_XSC_Handlerd解决方案
    • 5.2、编译QOS_XML_XSC_Handlerd
  • 6、测试例子
    • 6.1、生成dump解决方案
    • 6.2、编译dump
    • 6.3、OpenDDS的xml格式

1、需求背景

在使用OpenDDS中,需要对不同场景设计出不同的qos方案配置。但是每次写在代码中,后续维护扩展均受限,为此需要使用xml文件配置的方法。其实OpenDDS源码中已经提供了xml配置的方法,但是由于没有编译xml解析库,所以这部分的库就没有生成出来。

2、基础环境

  • VS2019
  • perl Opendds ace+tao 均已完成编译。
  • cmake(3.27)

3、编译xercesc

3.1、下载xercesc

官网链接:http://xerces.apache.org/xerces-c/download.cgi
在这里插入图片描述
Source Distributions 区域找最新的zip下载即可。

3.2、编译xercesc

解压下载好的库后,基本目录结构如下图所示:
在这里插入图片描述

我们打开cmake-gui软件。需要填写souce code 和 build binaries 俩个路径。分别为源码路径和编译路径。然后点击【Configure】按钮,在弹出的界面选择VS2019其他默认即可。
在这里插入图片描述

然后在下面的CMAKE_INSTALL_PREFIX属性设置安装路径。这里我的DDS路径为D:OpenDDS,所以我安装在了OpenDDS路径下。
在这里插入图片描述

再次点击Configure 完成后,点击 Generate按钮。
在这里插入图片描述
生成后,点击Open Project按钮,打开工程。
在这里插入图片描述
选择Debug-64环境后,打开CMakePredefinedTargets文件夹中找到ALL_BUILD,右击编译。完成后,找到下面的INSTALL工程,右击编译。就会把所编译生成的文件以及头文件输出到你在cmake那块配置的路径中。至此,xercesc的编译就完成了。

4、编译ACE_XML_Utils

ACE_XML_Utils需要xerces库的支持,所以在编译ACE和TAO时并没有生成。

4.1、生成XML_Utils解决方案

注:需要使用VS2019的命令行
在 %OpenDDS%\ACE_wrappers\ace\XML_Utils\路径下执行命令:

perl mwc.pl -type vs2019

在该路径下就会生成ACE_XML_Utils.sln
在这里插入图片描述

4.2、编译XML_Utils

点击XML_Utils.sln打开工程。
在属性中需要增加以下配置:
在C/C++常规中增加xerces-c的头文件路径(D:\OpenDDS\xerces-c\include)
在链接器常规中增加xerces-c的库文件路径(D:\OpenDDS\xerces-c\lib)
在链接器输入中增加xerces-c_3D.lib库文件。(Debug是xerces-c_3D.lib,Release是xerces-c_3.lib)
在这里插入图片描述

最后编译XML_Utils工程。成功生成。
在这里插入图片描述

5、编译QOS_XML_XSC_Handlerd

5.1、生成QOS_XML_XSC_Handlerd解决方案

注:需要使用VS2019的命令行
在 %OpenDDS%\dds\DCPS\QOS_XML_Handler\路径下执行命令:

perl mwc.pl -type vs2019

在这里插入图片描述

在该路径下就会生成ACE_XML_Utils.sln

5.2、编译QOS_XML_XSC_Handlerd

点击QOS_XML_XSC_Handlerd.sln打开工程。
在属性中需要增加以下配置:
在C/C++常规中增加xerces-c的头文件路径(D:\OpenDDS\xerces-c\include)
在链接器常规中增加xerces-c的库文件路径(D:\OpenDDS\xerces-c\lib)
在链接器输入中增加xerces-c_3D.lib库文件。(Debug是xerces-c_3D.lib,Release是xerces-c_3.lib)
在这里插入图片描述
编译工程,成功生成。
在这里插入图片描述

6、测试例子

在%OpenDDS%\tests\DCPS\QoS_XML\dump有xml配置读取的例子。

6.1、生成dump解决方案

注:需要使用VS2019的命令行
在 %OpenDDS%\dds\DCPS\QOS_XML_Handler\路径下执行命令:

perl mwc.pl -type vs2019 -features xerces=1

在这里插入图片描述
在该路径下就会生成dump.sln文件

6.2、编译dump

点击dump.sln打开工程。在qos_dump.cpp中就有所有的qos读取示例。
代码如下:


#include "dds/DCPS/QOS_XML_Handler/QOS_XML_Loader.h"
#include "dds/DdsDcpsC.h"int ACE_TMAIN (int, ACE_TCHAR *[])
{int retval = 0;try{OpenDDS::DCPS::QOS_XML_Loader xml_loader;DDS::ReturnCode_t const retcode = xml_loader.init (ACE_TEXT ("qos#TestProfile"));if (retcode == DDS::RETCODE_OK){DDS::ReturnCode_t retcode_qos;::DDS::DataWriterQos dw_qos;retcode_qos = xml_loader.get_datawriter_qos (dw_qos,ACE_TEXT("qos#TestProfile"),ACE_TEXT("TopicName"));if (retcode_qos != DDS::RETCODE_OK){ACE_ERROR ((LM_ERROR, "MAIN - ""get_datawriter_qos return an error. Retcode <%d>\n",retcode_qos));++retval;}if (dw_qos.history.kind != ::DDS::KEEP_ALL_HISTORY_QOS){ACE_ERROR ((LM_ERROR, "MAIN - ""get_datawriter_qos return an invalid history kind.\n"));++retval;}if (dw_qos.history.depth != 5){ACE_ERROR ((LM_ERROR, "MAIN - ""get_datawriter_qos return an invalid history depth.\n"));++retval;}::DDS::DataReaderQos dr_qos;retcode_qos = xml_loader.get_datareader_qos (dr_qos,ACE_TEXT("qos#TestProfile"),ACE_TEXT("TopicName"));if (retcode_qos != DDS::RETCODE_OK){ACE_ERROR ((LM_ERROR, "MAIN - ""get_datareader_qos return an error. Retcode <%d>\n",retcode_qos));++retval;}if (dr_qos.type_consistency.ignore_sequence_bounds != true){ACE_ERROR ((LM_ERROR, "PARSEXML - ""get_datareader_qos returned an invalid type type_consistency ignore_sequence_bounds.\n"));++retval;}if (dr_qos.type_consistency.ignore_string_bounds != true){ACE_ERROR ((LM_ERROR, "PARSEXML - ""get_datareader_qos return an invalid type type_consistency ignore_string_bounds.\n"));++retval;}if (dr_qos.type_consistency.ignore_member_names != true){ACE_ERROR ((LM_ERROR, "PARSEXML - ""get_datareader_qos return an invalid type type_consistency ignore_member_names.\n"));++retval;}if (dr_qos.type_consistency.prevent_type_widening != true){ACE_ERROR ((LM_ERROR, "PARSEXML - ""get_datareader_qos return an invalid type type_consistency prevent_type_widening.\n"));++retval;}if (dr_qos.type_consistency.force_type_validation != true){ACE_ERROR ((LM_ERROR, "PARSEXML - ""get_datareader_qos return an invalid type type_consistency force_type_validation.\n"));++retval;}if (dr_qos.representation.value.length() != 2){ACE_ERROR ((LM_ERROR, "PARSEXML - ""get_datareader_qos return an invalid length %d for data_representation.\n",dr_qos.representation.value.length()));++retval;}::DDS::TopicQos tp_qos;retcode_qos = xml_loader.get_topic_qos (tp_qos,ACE_TEXT("qos#TestProfile"),ACE_TEXT("TopicName"));if (retcode_qos != DDS::RETCODE_OK){ACE_ERROR ((LM_ERROR, "MAIN - ""get_topic_qos return an error. Retcode <%d>\n",retcode_qos));++retval;}if (tp_qos.durability_service.history_kind != DDS::KEEP_LAST_HISTORY_QOS){ACE_ERROR ((LM_ERROR, "PARSEXML - ""get_topic_qos returned an invalid type durability_service history_kind.\n"));++retval;}::DDS::PublisherQos pub_qos;retcode_qos = xml_loader.get_publisher_qos (pub_qos,ACE_TEXT("qos#TestProfile"));if (retcode_qos != DDS::RETCODE_OK){ACE_ERROR ((LM_ERROR, "MAIN - ""get_publisher_qos return an error. Retcode <%d>\n",retcode_qos));++retval;}::DDS::SubscriberQos sub_qos;retcode_qos = xml_loader.get_subscriber_qos (sub_qos,ACE_TEXT("qos#TestProfile"));if (retcode_qos != DDS::RETCODE_OK){ACE_ERROR ((LM_ERROR, "MAIN - ""get_subscriber_qos return an error. Retcode <%d>\n",retcode_qos));++retval;}::DDS::DomainParticipantQos dp_qos;retcode_qos = xml_loader.get_participant_qos (dp_qos,ACE_TEXT("qos#TestProfile"));if (retcode_qos != DDS::RETCODE_OK){ACE_ERROR ((LM_ERROR, "MAIN - ""get_participant_qos return an error. Retcode <%d>\n",retcode_qos));++retval;}}else{ACE_ERROR ((LM_ERROR, "MAIN - Init return an error. Retcode <%d>\n",retcode));++retval;}}catch (const CORBA::Exception& ex){ex._tao_print_exception ("QOS_Dump::main\n");return -1;}catch (...){ACE_ERROR ((LM_ERROR, ACE_TEXT ("Unexpected exception\n")));return 1;}return retval;
}

6.3、OpenDDS的xml格式

<?xml version="1.0" encoding="UTF-8"?>
<dds xmlns="http://www.omg.org/dds"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.omg.org/dds dds_qos.xsd"><qos_profile name="TestProfile"><datareader_qos><representation><value><element>XCDR_DATA_REPRESENTATION</element><element>XCDR2_DATA_REPRESENTATION</element></value></representation><type_consistency><kind>ALLOW_TYPE_COERCION</kind><ignore_sequence_bounds>true</ignore_sequence_bounds><ignore_string_bounds>true</ignore_string_bounds><ignore_member_names>true</ignore_member_names><prevent_type_widening>true</prevent_type_widening><force_type_validation>true</force_type_validation></type_consistency><durability><kind>VOLATILE_DURABILITY_QOS</kind></durability><deadline><period><sec>DURATION_INFINITE_SEC</sec><nanosec>DURATION_INFINITE_NSEC</nanosec></period></deadline><latency_budget><duration><sec>0</sec><nanosec>0</nanosec></duration></latency_budget><liveliness><kind>AUTOMATIC_LIVELINESS_QOS</kind><lease_duration><sec>DURATION_INFINITE_SEC</sec><nanosec>DURATION_INFINITE_NSEC</nanosec></lease_duration></liveliness><reliability><kind>BEST_EFFORT_RELIABILITY_QOS</kind><max_blocking_time><sec>0</sec><nanosec>100000000</nanosec></max_blocking_time></reliability><destination_order><kind>BY_RECEPTION_TIMESTAMP_DESTINATIONORDER_QOS</kind></destination_order><history><kind>KEEP_LAST_HISTORY_QOS</kind><depth>1</depth></history><resource_limits><max_samples>LENGTH_UNLIMITED</max_samples><max_instances>LENGTH_UNLIMITED</max_instances><max_samples_per_instance>LENGTH_UNLIMITED</max_samples_per_instance></resource_limits><!--user_data><value></value></user_data--><ownership><kind>SHARED_OWNERSHIP_QOS</kind></ownership><time_based_filter><minimum_separation><sec>0</sec><nanosec>0</nanosec></minimum_separation></time_based_filter><reader_data_lifecycle><autopurge_nowriter_samples_delay><sec>DURATION_INFINITE_SEC</sec><nanosec>DURATION_INFINITE_NSEC</nanosec></autopurge_nowriter_samples_delay><autopurge_disposed_samples_delay><sec>DURATION_INFINITE_SEC</sec><nanosec>DURATION_INFINITE_NSEC</nanosec></autopurge_disposed_samples_delay></reader_data_lifecycle></datareader_qos><datawriter_qos><durability><kind>VOLATILE_DURABILITY_QOS</kind></durability><durability_service><service_cleanup_delay><sec>0</sec><nanosec>0</nanosec></service_cleanup_delay><history_kind>KEEP_LAST_HISTORY_QOS</history_kind><history_depth>1</history_depth><max_samples>LENGTH_UNLIMITED</max_samples><max_instances>LENGTH_UNLIMITED</max_instances><max_samples_per_instance>LENGTH_UNLIMITED</max_samples_per_instance></durability_service><deadline><period><sec>DURATION_INFINITE_SEC</sec><nanosec>DURATION_INFINITE_NSEC</nanosec></period></deadline><latency_budget><duration><sec>0</sec><nanosec>0</nanosec></duration></latency_budget><liveliness><kind>AUTOMATIC_LIVELINESS_QOS</kind><lease_duration><sec>DURATION_INFINITE_SEC</sec><nanosec>DURATION_INFINITE_NSEC</nanosec></lease_duration></liveliness><reliability><kind>RELIABLE_RELIABILITY_QOS</kind><max_blocking_time><sec>0</sec><nanosec>100000000</nanosec></max_blocking_time></reliability><destination_order><kind>BY_RECEPTION_TIMESTAMP_DESTINATIONORDER_QOS</kind></destination_order><history><kind>KEEP_ALL_HISTORY_QOS</kind><depth>5</depth></history><resource_limits><max_samples>LENGTH_UNLIMITED</max_samples><max_instances>LENGTH_UNLIMITED</max_instances><max_samples_per_instance>LENGTH_UNLIMITED</max_samples_per_instance></resource_limits><transport_priority><value>0</value></transport_priority><lifespan><duration><sec>DURATION_INFINITE_SEC</sec><nanosec>DURATION_INFINITE_NSEC</nanosec></duration></lifespan><!--user_data><value></value></user_data--><ownership><kind>SHARED_OWNERSHIP_QOS</kind></ownership><ownership_strength><value>0</value></ownership_strength><writer_data_lifecycle><autodispose_unregistered_instances>true</autodispose_unregistered_instances></writer_data_lifecycle></datawriter_qos><domainparticipant_qos><!--user_data><value></value></user_data--><entity_factory><autoenable_created_entities>true</autoenable_created_entities></entity_factory></domainparticipant_qos><subscriber_qos><presentation><access_scope>INSTANCE_PRESENTATION_QOS</access_scope><coherent_access>false</coherent_access><ordered_access>false</ordered_access></presentation><partition><name><element>ABC</element><element>DEF</element><element>GHI</element><element>JKL</element><element>MNO</element><element>PQR</element><element>STU</element><element>VW</element><element>XYZ</element></name></partition><!--group_data><value></value></group_data--><entity_factory><autoenable_created_entities>true</autoenable_created_entities></entity_factory></subscriber_qos><publisher_qos><presentation><access_scope>INSTANCE_PRESENTATION_QOS</access_scope><coherent_access>false</coherent_access><ordered_access>false</ordered_access></presentation><partition><name><element>XYZ</element><element>VW</element><element>STU</element><element>PQR</element><element>MNO</element><element>JKL</element><element>GHI</element><element>DEF</element><element>ABC</element></name></partition><!--group_data><value></value></group_data--><entity_factory><autoenable_created_entities>true</autoenable_created_entities></entity_factory></publisher_qos><topic_qos><!--topic_data><value></value></topic_data--><durability><kind>VOLATILE_DURABILITY_QOS</kind></durability><durability_service><service_cleanup_delay><sec>0</sec><nanosec>0</nanosec></service_cleanup_delay><history_kind>KEEP_LAST_HISTORY_QOS</history_kind><history_depth>1</history_depth><max_samples>LENGTH_UNLIMITED</max_samples><max_instances>LENGTH_UNLIMITED</max_instances><max_samples_per_instance>LENGTH_UNLIMITED</max_samples_per_instance></durability_service><deadline><period><sec>DURATION_INFINITE_SEC</sec><nanosec>DURATION_INFINITE_NSEC</nanosec></period></deadline><latency_budget><duration><sec>0</sec><nanosec>0</nanosec></duration></latency_budget><liveliness><kind>AUTOMATIC_LIVELINESS_QOS</kind><lease_duration><sec>DURATION_INFINITE_SEC</sec><nanosec>DURATION_INFINITE_NSEC</nanosec></lease_duration></liveliness><reliability><kind>BEST_EFFORT_RELIABILITY_QOS</kind><max_blocking_time><sec>0</sec><nanosec>100000000</nanosec></max_blocking_time></reliability><destination_order><kind>BY_RECEPTION_TIMESTAMP_DESTINATIONORDER_QOS</kind></destination_order><history><kind>KEEP_LAST_HISTORY_QOS</kind><depth>1</depth></history><resource_limits><max_samples>LENGTH_UNLIMITED</max_samples><max_instances>LENGTH_UNLIMITED</max_instances><max_samples_per_instance>LENGTH_UNLIMITED</max_samples_per_instance></resource_limits><transport_priority><value>0</value></transport_priority><lifespan><duration><sec>DURATION_INFINITE_SEC</sec><nanosec>DURATION_INFINITE_NSEC</nanosec></duration></lifespan><ownership><kind>SHARED_OWNERSHIP_QOS</kind></ownership></topic_qos></qos_profile>
</dds>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/509455.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

曾桂华:车载座舱音频体验探究与思考| 演讲嘉宾公布

智能车载音频 I 分论坛将于3月27日同期举办&#xff01; 我们正站在一个前所未有的科技革新的交汇点上&#xff0c;重塑我们出行体验的变革正在悄然发生。当人工智能的磅礴力量与车载音频相交融&#xff0c;智慧、便捷与未来的探索之旅正式扬帆起航。 在驾驶的旅途中&#xff0…

qt学习:网络调试助手客户端+服务端

客户端 步骤 ui界面配置 添加头函数&#xff0c;类成员数据&#xff0c;类成员函数 #include <QTcpSocket> #include <QWidget>private slots://连接按钮void on_btnConnect_clicked();//收到来自服务器的数据触发void mRead_Data_From_Server();//发送按钮voi…

Synchronized方法锁、对象锁、类锁区别

synchronized&#xff0c;这个东西我们一般称之为”同步锁“&#xff0c;他在修饰代码块的时候需要传入一个引用对象作为“锁”的对象。 在修饰方法的时候&#xff0c;默认是当前对象作为锁的对象在修饰类时&#xff0c;默认是当前类的Class对象作为所的对象 故存在着方法锁、…

express+mysql+vue,从零搭建一个商城管理系统10--添加商品

提示&#xff1a;学习express&#xff0c;搭建管理系统 文章目录 前言一、新建models/goods.js二、新建routes/goods.js三、添加goods表四、添加商品总结 前言 需求&#xff1a;主要学习express&#xff0c;所以先写service部分 一、新建models/goods.js models/goods.js con…

跨境电商独立站|代购+集运,这是什么东西?

代购集运&#xff0c;这是什么东西&#xff1f; 跨境集运搭建跨境电商独立站 代购&#xff0c;释义为代理购买。通俗意思就是找人帮忙购买你需要的商品&#xff0c;原因可以是你在当地买不到这件商品&#xff0c;可以是当地这件商品的价格比其他地区的贵&#xff0c;也可以是为…

模拟算法题练习(一)(扫雷,灌溉,回文日期)

目录 模拟算法介绍&#xff1a; &#xff08;一、扫雷&#xff09; &#xff08;二、灌溉&#xff09; &#xff08;三、回文日期&#xff09; 有一说一这题大佬的题解是真的强 模拟算法介绍&#xff1a; 模拟算法通过模拟实际情况来解决问题&#xff0c;一般容易理解但是实…

Windows上构建一个和Linux类似的Terminal

感谢大佬批评指正&#xff0c;现已更新 preview Target&#xff1a;致力打造最赏心悦目Window下的终端&#xff0c;同时能够很接近Linux的使用习惯 key word&#xff1a;windows终端美化 windows terminal windows powershell 类似Linux下的Window终端 Window也能用ll windows…

Linux编程3.1 进程-进程的概念

前情提及&#xff1a; 程序和进程内核中的进程结构C程序启动过程进程终止方式非局部跳转进程资源限制进程创建、执行和终止进程类型进程状态进程组 进程的概念 进程&#xff1a;程序运行&#xff0c;由操作系统内核对该程序进行资源的分配 &#xff0c; 进程中&#xff0c;再…

牛客练习赛122

D:圆 正着求删除的最小代价不好做&#xff0c;采用逆向思维&#xff0c;求选择一些不相交的线段使得构成一个圆的代价尽量大&#xff0c;最后答案就是所有线段权值之和减去最大代价。 那么如何求这个最大代价呢&#xff1f;显然区间DP 老套路&#xff1a;破环成链&#xff0…

【学习心得】网站运行时间轴(爬虫逆向)

一、网站运行时间轴 掌握网站运行时间轴&#xff0c;有助于我们对“请求参数加密”和“响应数据加密”这两种反爬手段的深入理解。 二、从网站运行的时间轴角度来理解两种反爬手段 1、加载HTML&#xff1a; 这是浏览器访问网站时的第一步&#xff0c;服务器会返回基础…

2024|CISP认证详细报考流程和条件

证书介绍 CISP&#xff08;Certified Information Security Professional&#xff0c;注册信息安全专业人员&#xff09;证书是由中国信息安全测评中心&#xff08;CNITSEC&#xff09;颁发的专业资质证书&#xff0c;旨在为信息安全领域培养和认证具备一定专业水平的安全人才…

5.测试教程 - 进阶篇

文章目录 1.按测试对像划分1.1**界面测试**1.2**可靠性测试**1.3**容错性测试**1.4**文档测试**1.5**兼容性测试**1.6**易用性测试**1.7**安装卸载测试**1.8**安全测试**1.9**性能测试**1.10**内存泄漏测试** 2.按是否查看代码划分2.1黑盒测试(Black-box Testing)2.2白盒测试(W…