【原创】OpenDDS笔记(四) 树莓派下的开发实例_ace+tao2,【深度思考

273 阅读7分钟

       笔者以前的博客已经记录了Window10,Ubuntu18.04下的环境搭建及Demo实例开发,而树莓派下的开发资料很少,大多只提到了如何跑通自带实例,即Messenger实例下运行run_test.pl。但笔者的目标是自己编写IDL并单独编写一个Publisher和Subscriber实例,经过前面的经验总结和摸索,在躺了很多坑之后终于实现了既定目标,记录下来供各位借鉴。

一、前言

       与PC下Ubuntu系统中编译OpenDDS不同,采用【原创】OpenDDS笔记(二) Linux环境下的环境搭建   及   【原创】OpenDDS笔记(三) Linux环境下的开发实例 的方式,在RaspberryPi自带系统下可以编译,但是速度奇慢无比,笔者开始用这种方式编译了2天,终是以失败告终,觉得这不是一个科学的办法便放弃了。后来根据OpenDDS官网所述,采用了“交叉编译”的方式,即利用PC下虚拟机中Ubuntu系统(以下称为host)通过arm-linux-gnueabihf-g++来编译,最后通过ssh将压缩包传入RaspberryPi自带系统(以下称为target)指定目录下,解压缩,设置环境变量,运行,这样一个思路进行。

 

二、编译OpenDDS

       1. 之前有在Ubuntu下编译过OpenDDS的机器,需要将环境变量干掉,因为编译树莓派版本的OpenDDS,其目录结构与前者有差异,环境变量不干掉有可能导致找到的依赖文件不对,从而编译失败。那么之前在~./bashrc中或者etc/profile中设置过的DDS_ROOT,ACE_ROOT需要统统干掉,重启生效。

       2. 用于交叉编译的两个linux系统,都应该安装有perl,make,g++,gcc,cmake等软件,并保持软件最新 sudo apt-get update,sudo apt-get upgrade,这个是经常导致编译异常的主要原因之一。

       3. 下载OpenDDS,地址:download.objectcomputing.com/OpenDDS/,值得一提的是,如果为了和其他平台的实例进行通讯,最好OpenDDS版本与其保持一致,我使用的是OpenDDS-3.15版本,因此需要单击“previous-releases”去找到OpenDDS-3.15.tar.gz。总之根据你需要,下载对应版本即可。

      

         为了便于版本兼容,我将解压缩后将名称改为OpenDDS

        

       4. 下载 gcc-8.2.0-rpi.tar.bz2 交叉编译编译器,解压后将其放置于host系统中/opt目录下,将文件夹重命名为“cross-pi-gcc”。

         

        5. 下载 ACE+TAO-2.2a_with_latest_patches_NO_makefiles.tar.gz ,将其复制一个到OpenDDS目录下,如下图:

         

      6. 在OpenDDS目录下执行如下命令,用于生成make需要的相关文件。

       值得一提的是,如果没有第5步的操作。直接执行该命令,会自动下载ACE+TAO-2.2a_with_latest_patches_NO_makefiles.tar.gz,但是速度会慢到吐血。经过多次尝试,笔者直接用迅雷下载了一个到Windows下,拷贝到虚拟机的OpenDDS目录下,这样在运行以下命令时,直接就等于下载好了,命令会自动对其进行解压缩,供相关文件生成时使用。

./configure --target=linux-cross --target-compiler=/opt/cross-pi-gcc/bin/arm-linux-gnueabihf-g++

  注意:执行过以上命令,或者曾经make过以后,在执行以上命令有可能失败,可以尝试把OpenDDS文件夹整个删掉,再重新进行第5,6步。

                

          执行完以后,目录中应该会多一个build文件夹和ACE_wrappers文件夹,同时ACE+TAO-2.2a_with_latest_patches_NO_makefiles.tar.gz 包被自动删除掉了。build目录下有一个host文件和一个target文件夹,分别是对OpenDDS文件夹的一个拷贝,这包括自带实例DevGuideExamples文件夹

          

          

       7. cd到OpenDDS目录下,执行命令更改权限命令,防止因权限问题而导致编译失败,这步属于可选项。

sudo chmod 777 -R ./

      8. 分别打开build目录下的host及target目录,分别执行./setenv.sh命令,这步属于可选项。

      9. 第6步所述命令执行完没有报错的话,就可以在OpenDDS目录下执行make命令对代码进行编译,时间比较长,泡一杯茶边喝边等吧。

     10. 测试host与target之间的ssh服务是否已启动,Ubuntu和RaspberryPi系统一般默认都有安装ssh-client,为了测试连通性可以通过以下顺序:
10.1 通过ifconfig查看两个系统的ip地址,然后通过ping命令检查其网络通讯是否正常。(笔者host地址为192.168.2.110,target地址为192.168.2.112)
10.2 从host的终端执行ssh pi@192.168.2.112,红色部分更换为实际的ip,如果ssh服务没问题的话,会要求你输入树莓派系统密码,输入后即可进入树莓派远程终端模式。

          
10.3 如果经过以上测试,ssh并不通。应该是系统ssh服务被禁用了,行之有效的解决办法就是拔下树莓派SD卡,通过读卡器插入PC,由于SD卡里是linux文件系统,windows下打不开。那就通过虚拟机来打开。并且在boot文件夹下通过touch ssh命令新建一个空白的ssh文件。拔出SD卡再插入到树莓派上,重复10.2步骤,应该就解决了,如果还解决不了,请百度搜索“树莓派 ssh connection refused”寻求更多帮助。

            也可以在windows下下载一个putty软件,选择SSH,输入IP后单击Open来测试ssh服务是否已开启。

          

           10.4 确认ssh服务没问题后,关闭终端,以暂时退出ssh服务。

    11. cd到OpenDDS上一级目录,分别执行以下命令:

tar czf OpenDDS.tar.gz OpenDDS

#该命令的目的是将OpenDDS文件夹打包为一个OpenDDS.tar.gz压缩包。
scp OpenDDS.tar.gz pi@192.168.2.112:/home/pi/DevOpenDDS

#该命令的目的是将OpenDDS.tar.gz压缩包发送到树莓派指定目录下,:后面即为目标路径
ssh pi@192.168.2.112

#该命令用于通过ssh连接树莓派
tar xzf OpenDDS.tar.gz

#该命令用于远程解压缩OpenDDS.tar.gz
  1. 在ssh远程模式下,进入树莓派OpenDDS所在目录,分别执行以下命令,用于设置环境变量。
export DDS_ROOT="$PWD/build/target"
export ACE_ROOT="$DDS_ROOT/ACE_wrappers"
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:"$ACE_ROOT/lib":"$DDS_ROOT/lib"
export PATH=${PATH}:"$ACE_ROOT/bin":"$DDS_ROOT/bin"
  1. 通过以下命令cd到DDS默认实例“Messenger”目录下,然后执行./run_test.pl。
cd $DDS_ROOT/DevGuideExamples/DCPS/Messenger

  实例会分别启动一个InfoRepo, publisher, 和subscriber。类似下图所示,说明部署成功。

 

三、编写编译自定义工程

      前面笔者讲了,网上大部分只是进行到以上步骤就结束了,没看到如何开发新的工程,生成相关文件和如何make。在经过一些试验后,笔者发现了规律,并成功实现了编译和部署。本节中,我以Demo为工程名来实现一个自定义实例,文件仍来自于前几篇所定义过的同一套文件,Demo文件夹内容如下:

    

    关于这些文件的内容,请翻看笔者前面几篇相关介绍的博文,本篇的目的是对他们实现编译,并部署到树莓派下执行。

    观察OpenDDS自带的几个实例,笔者打算采用“将Demo文件夹与原始OpenDDS实例放在一起,重新执行OpenDDS编译”的思路来解决问题。OpenDDS自带实例$DDS_ROOT/DevGuideExamples/DCPS/Messenger的文件结构,有一个CMakeLists.txt文件,其内容如下,

project(OpenDDS_DevGuide_Messenger CXX)
cmake_minimum_required(VERSION 3.8.2)

find_package(OpenDDS REQUIRED)

set(CMAKE_CXX_COMPILER ${OPENDDS_COMPILER})

set(opendds_libs
  OpenDDS::Dcps # Core OpenDDS Library
  OpenDDS::InfoRepoDiscovery OpenDDS::Tcp # For run_test.pl
  OpenDDS::Rtps OpenDDS::Rtps_Udp # For run_test.pl --rtps
)

# Publisher
add_executable(publisher
  Publisher.cpp
)


![img](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/d6b761adfeb04278a464224394e9dbf1~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5py65Zmo5a2m5Lmg5LmL5b-DQUk=:q75.awebp?rk3s=f64ab15b&x-expires=1771856201&x-signature=%2BwhO%2ByOpWWNGaebLcnSQjlWmY7Q%3D)
![img](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/918dec1bfd45403e9142b91ccd32201c~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5py65Zmo5a2m5Lmg5LmL5b-DQUk=:q75.awebp?rk3s=f64ab15b&x-expires=1771856201&x-signature=VxsmiOiHPSeWZPe%2B0ZeZbYPbGW0%3D)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新**

**[如果你需要这些资料,可以戳这里获取](https://gitee.com/vip204888)**