SOC侧跨域实现DDS通信总结

本篇文章介绍XXXXXXIDL demo编写、编译以及实现跨域的DDS通信(SOC m -> SOC n),代码是基于ARM编译的C++版本的cyclonedds。

一、 demo存放目录创建(examples/camera)与IDL文件上传

首先在cyclonedds/examples目录下面新建一个目录camera作为存放XXXdemo程序以及CMakeLists.txt等文件的目录。并且将现成的Image.idl文件从Windows上传到Linux,如下图所示,使用scp指令:
Image.idl文件现有

在这里插入图片描述

二、Image.idl文件与idlc文件产生源文件和头文件

先在camera目录下面利用idlc文件和Image.idl文件生成源文件和头文件,在生成过程中可能需要C++和C在ARM下的库文件,直接CP过来即可。
拷贝ARM_CPP如下图所示,拷贝ARM_C同理。

在这里插入图片描述

使用命令:./idlc -l cxx ./Image.idl生成Image.cppImage.hpp文件如下图所示:

在这里插入图片描述

三、修改CMakeLists.txt文件

外层examples下面的CMakeLists.txt中添加了对于camera新文件中的installadd_subdirectory,如下图所示:

在这里插入图片描述

配置解析:
其中,在 CMake 构建系统中,install(FILES ... DESTINATION ... COMPONENT ...) 是用来安装文件的命令。它用于指定要安装的文件列表、目标安装路径以及所属的组件。

各个参数的含义如下:
1、 FILES: 指定要安装的文件列表。可以是一个文件名,也可以是多个文件名的列表。这些文件可以是源代码文件、配置文件、文档等。
2、DESTINATION: 指定文件的目标安装路径。可以是绝对路径,也可以是相对路径。如果指定为相对路径,则会相对于安装目录进行解析。
3、 COMPONENT: 指定文件所属的组件。组件是一个逻辑上的概念,用于将不同类型的文件分组。通过指定不同的组件,可以灵活地控制安装过程中包含哪些文件。
举例说明:

假设有以下 CMakeLists.txt 文件:

install(FILES file1.txt file2.txt DESTINATION /path/to/install COMPONENT my_component)

这个命令将会安装 file1.txtfile2.txt 文件到 /path/to/install 目录下,并将它们归属于 my_component 组件。
在执行 make install 或者构建项目时,CMake 将会将这些指定的文件拷贝到指定的安装路径,并按照组件进行分类。这样,在安装时可以选择只安装某个特定的组件,而不是全部安装。

add_subdirectory是添加存放源文件的子目录

四、添加CMakeLists.txt文件

Examples/camera目录下

重点关注对于ARM架构下idlc_generate配置指令失效的问题

在这里插入图片描述

五、Camera目录下XXX数据demo编写(编写pub/sub)

这一步中主要完成demo中publisher.cppsubscriber.cpp代码的编写

5.1 publisher文件编写

本篇主要是基于现有的publisher.cppsubscriber.cpp文件来做修改
对于publisher文件修改有以下几处:
1、 头文件的引入Image.hpp
2、域名和类名的替换:DiData::ImageMsg
3、对于摄像头数据类型的赋值,根据Image.hpp头文件中的数据类型进行赋值,如下图所示:

在这里插入图片描述

5.2 subscriber文件编写

对于subscriber文件修改有以下几处:
1、头文件的引入Image.hpp
2、域名和类名的替换:DiData::ImageMsg
3、对于摄像头数据类型的赋值已经在publisher.cpp中做过,需要在subscriber.cpp文件中将这些数据打印出来

在这里插入图片描述

至此,准备工作完成,camera目录下应该有以下文件:

在这里插入图片描述

六、Camera目录下创建build目录准备编译

6.1 指定安装路径等并执行cmake指令

终端输入:

cmake -DCMAKE_PREFIX_PATH=/home/ubuntu/Documents/ARM_CPP_CycloneDDS/cyclonedds-cxx-master/install_DDS_ARM/lib/cmake/CycloneDDS-CXX  -DCMAKE_TOOLCHAIN_FILE=/home/ubuntu/Documents/install_ARM/arm.cmake -DENABLE_SSL=NO ..

如果显示如下的报错:

在这里插入图片描述

添加`ARM_C`的路径即可:
cmake -DCMAKE_PREFIX_PATH=/home/ubuntu/Documents/ARM_C_CycloneDDS/cyclonedds-master/install_DDS_ARM/lib/cmake/CycloneDDS  -DCMAKE_TOOLCHAIN_FILE=/home/ubuntu/Documents/install_ARM/arm.cmake -DENABLE_SSL=NO ..

在这里插入图片描述

6.2 cmake --build .进行编译

由下图所示,成功变异出可执行文件并且文件类型正确
在这里插入图片描述

至此,demo整理完毕,下面开始实现跨域的DDS通信

七、实现跨域进行DDS通信前的准备工作

修改电脑IP地址为192.168.XXX.X,连接到板子上面。(注意:连接板子之后才能改IP)
打开MobaXterm软件连接到板子
连接之后创建两个SOC域窗口,地址分别为:
192.168.195.m 192.168.195.n

分别给两个SOC中上传代码(已经编译好的代码,直接拖拽即可)

在这里插入图片描述

以上均为琐碎的准备工作

八、编写进行SOC端跨域通信的xml配置文件(完成准备工作)

配置文件的格式可以参考ARM_C中的readme.md文件(直接查找,注意X哥的操作手法!!)
ARM_CPP中的config_simple中有较为简单的模版可用,但是注意将

<Domain id = “3”>换成<Domain id = “any”>

如下图配置文件中:192.168.195.m 和 192.168.195.n域中的xml配置文件中address分别为:
address = “192.168.195.m ”,address = “192.168.195.n ”

在这里插入图片描述

配置文件格式:

<?xml version="1.0" encoding="UTF-8" ?>
<!--  Copyright(c) 2006 to 2022 ZettaScale Technology and others
  This program and the accompanying materials are made available under the
  terms of the Eclipse Public License v. 2.0 which is available at
  http://www.eclipse.org/legal/epl-2.0, or the Eclipse Distribution License
  v. 1.0 which is available at
  http://www.eclipse.org/org/documents/edl-v10.php.
  SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause-->
<CycloneDDS>
  <!-- Simple config-file for testing whether a config-file can be picked up correctly. -->
  <Domain id="any">
          <General>
                  <Interfaces>
                          <NetworkInterface address="127.0.0.1(换)"></NetworkInterface>
                  </Interfaces>
                  <AllowMulticast>true</AllowMulticast>
                  <EnableMulticastLoopback>true</EnableMulticastLoopback>
          </General>
  </Domain>
  <Compatibility>
    <StandardsConformance>lax</StandardsConformance>
  </Compatibility>
</CycloneDDS>

九、Chmod命令给可执行文件和所需要的库文件添加执行权限

下图所示两个可执行文件是白色的噻,不具备在域控执行的权限
在这里插入图片描述

通过命令chmod +x ddscxxImage* 给其添加可执行权限如下图所示:
在这里插入图片描述

我们想要执行他们,我们需要知道他们依赖于那些库文件,使用ldd命令进行查看,如下图所示:
在这里插入图片描述

如下图所示我们将ARM架构下C/C++编译之后的库文件加载进来
在这里插入图片描述

这些文件同样需要使用chmod命令添加可执行权限 chmod +x libdds*,如下图所示:
在这里插入图片描述

十、解决拷贝进来ARM下C/C++库文件软链接失效问题

下次如何避免软链接失效,在上传代码时不要直接拉上来,打包成tar包形式再弄上来就不会让软链接失效

我们在Linux上可以看到C/C++中的库文件软链接都是完好的,但是拷贝进来之后就会失效,软连接完好时如下图所示:
在这里插入图片描述
在这里插入图片描述

但是现在没有软链接存在,因此通过命令ln -s 源文件 目标文件 的命令形式给这些库文件之间重新建立起软链接。 如下图所示:
在这里插入图片描述

特别注意: ln -s libddscxx.so.0 libddscxx.so构建结果是:
libddscxx.so—> libddscxx.so.0的指向

所以需要先将libddscxx.so删掉
构建出libddscxx.so—> libddscxx.so.0

之后:
删掉 libddscxx.so.0
如下图所示:
在这里插入图片描述

输入 ln -s libddscxx.so.0.11.0 libddscxx.so.0构建:

libddscxx.so.0—>libddscxx.so.0.11.0

切记顺序一定要正确

结果如下图所示:
在这里插入图片描述

至此C++版本的库文件中的软链接已经重新构建完成,C中的同样的办法构建如下图所示:
在这里插入图片描述

十一、export CYCLONEDDS_URI加载配置文件开始执行

其实加载配置文件这一步可以直接在这里用指令加载进行,也可以直接将指令加到xmll配置文件中去,可以参考另一篇文章:Soc侧跨域进行Cycloneddds通信时xml配置文件的格式以及注意事项

SOC1域控中:(配置文件起名为:config1.xml)
使用指令:export CYCLONEDDS_URI=config1.xml配置文件的路径
并且执行可执行文件(SOC1执行pub),如下图所示:
在这里插入图片描述

在这里插入图片描述

SOC2域控中:(配置文件起名为:config2.xml)

完成同样的准备工作并且开始执行sub,结果如下图所示:
在这里插入图片描述

到此全部完成

需要加深总结的地方:

1、可执行文件如何添加权限
2、软链接失效以后如何进行重新构建
3、Xml库文件如何正确书写并且加载进来

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

江南霹雳堂雷家雷无桀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值