Java调用OpenDDS(1)-编译安装openDDS-补上了所有网络上其他文章遗漏的细节
Java調用OpenDDS過程中踩了很多坑,記錄一下。
提綱
1、DDS簡介
2、DDS協議的實現產品
3、OpenDDS安裝過程
1、DDS簡介
DDS指的是Data Distribution Service,也即數據分發服務,是OMG(Object Management Group,對象管理組織)定義的一個數據傳輸協議。DDS采用發布-訂閱的方式來在兩個通信對象之間傳輸數據,也就是說它基于 DCPS(Data-Centric Publish-Subscribe, 以數據為中心的發布訂閱)模型。
DDS協議定義了一套QoS(Quality of Service,服務質量)進行數據傳輸質量的控制。
DDS看上去和kafka等mq系統、mqtt協議等非常類似,但是仔細研究之后發現它和kafka、mqtt有一個核心的區別,這個核心區別用以下的圖來展示更為清晰:
從這張圖中可以看到,dds中發布者和訂閱者只是通過DDS去發現彼此,當訂閱者發現了自己需要的發布者后,傳輸數據的時候就是他們兩個之間直接傳輸數據,而在kafka或者mqtt中不僅是訂閱者、發布者彼此發現對方通過kafka,而且發布者和訂閱者之間傳輸數據也是通過kafka或者mqtt進行的。這一點是他們之間的關鍵區別,其他方面在概念上都非常類似。
2、DDS協議的實現產品
DDS是一個協議規范,基于這個規范有很多公司做出做了對應的軟件產品,這些軟件產品都實現了DDS協議,主要有以下4種產品:
-
RTI DDS:由美國 RTI 公司開發,支持Windows、Linux、VxWorks等多種操作系統,商用軟件,價格相對較高。目前全球范圍內超過500個項目都應用了RTIDDS,包括航空、航天、船舶、國防、金融、通信、汽車等領域。
-
OpenSplice DDS: 最初由 Thales 開發,在 2006 年被 PT(Prism Technologies)收購,主要的應用在 Tacticos 項目(Thales 的戰斗管理系統)。
-
OpenDDS:由美國OCI公司開發,基于 C++ 實現,是開源軟件。 可從http://www.opendds.org/中獲得幫助,目前最新的版本是OpenDDS 3.12.1。盡管OpenDDS采用C++語言實現,但也提供JAVA和JMS的開發接口,這意味著JAVA程序開發也可以使用OpenDDS。
-
MilSoftDDS: 由土耳其的 MILSOFT Soft-ware Technologies 公司開發的DDS應用軟件。
-
FastDDS:它由 ePromise 公司發布并維護
-
CycloneDDS:它是Eclipse開源的dds方案,
3、OpenDDS安裝過程
安裝OpenDDS需要準備一些基礎軟件,分別是:
- (1)Perl的編譯器,在windows上可以安裝ActivePerl或者StrawberryPerl,這兩個都是Perl語言的windows編譯器。Perl編譯器的作用是OpenDDS中有很多Perl腳本需要執行。
- (2)Visual Studio Community 2017,vs主要用來對Tao和OpenDDS進行編譯。
- (3)JDK8,OpenDDS只支持JDK8,JDK8以后的JDK版本都不支持。
安裝OpenDDS是從源代碼編譯安裝,它沒有二進制的安裝包。編譯安裝過程中需要編譯兩個東西,一個是ACE+TAO,第二個是OpenDDS。這兩個都可以從OpenDDS官網(http://www.opendds.org/)下載到。
安裝的過程其實就是編譯Ace+Tao和OpenDDS的過程。
各個軟件的版本如下:
- strawberry-perl-5.32.1.1-64bit.msi
- Visual Studio Community 2017
- ACE+TAO-6.5.3.zip
- OpenDDS-3.13.zip
3.1 StrawberryPerl的安裝
Perl本來是Linux下一個腳本編程語言,后來有開發者為Perl做了Windows下的解釋器,所以Perl語言寫的腳本也可以在Windows下運行了,目前據我所知Windows下有兩種perl的解釋器,分別是activePerl和strawberry-perl,這里我們用的strawberry-perl,所以安裝strawberry-perl。
strawberry-perl-5.32.1.1-64bit.msi的安裝就是下一步下一步,沒有特別的設置,很簡單,就不多說了。
安裝完成后,打開cmd,輸入perl -v查看strawberry perl的版本,如果這個命令順利輸出了strawberry perl的版本,說明strawberry perl安裝成功了。
3.2 Visual Studio Community 2017的安裝
visual studio community的安裝也是下一步下一步的,但是中間有一個地方需要注意,如下兩圖所示:
把彈出窗口右邊的滾動條下拉一下,下面還有需要注意的選項:
這一處選擇后,就沒有其他需要注意的地方了,其他都是下一步下一步直到完成,就安裝成功了。
3.3 ACE+TAO的編譯安裝
因為ace+tao和opendds是壓縮包,所以首先解壓。為了統一在一個目錄下工作,于是新建一個目錄E:\dds
將ACE+TAO-6.5.3.zip 和 OpenDDS-3.13.zip 解壓到E:\dds。
進入E:\dds\ACE_wrappers\ace目錄,新建一個文件config.h并添加內容:
#include “ace/config-win32.h”
添加環境變量
下面每一個環境變量都不能少。
我踩過坑的,當時我少寫了幾個環境變量,編譯ace+tao的時候死活過不去,查資料查資料浪費了很多時間走了很多彎路,最后才搞明白,過程中又著急又苦惱,唉,苦不堪言。
最后實在沒辦法,找了一個公司內部搞C++的,結果這哥們來了之后,盲目的拿著鼠標胡擺了幾下,走了,我一看完蛋了,這哥們對openDDS一竅不通,完全不懂,就別指望他了,還是自己繼續苦干吧。
再后來終于找到一個同事,他是懂openDDS的,他也理解我的難處,我一說他就知道我在哪里卡住了,當時困擾了好幾天的苦惱被人一瞬間理解,莫名的產生了一種幸福感,真是有種他鄉遇故知的感動。
在和他反復交流過幾次之后,終于知道問題是少了幾個環境變量,而且他還建議我為了安全起見把perl從activePerl換成strawberryPerl。我被那幾天編譯出錯誤折磨的已經夠嗆了,所以他說啥我聽啥,就馬上卸載了activePerl,下載strawberryPerl,趕緊安裝strawberryPerl,增加環境變量,最后終于把ace+tao給編譯好了。
那一刻,我真是長出了一口氣,感覺天似乎突然明亮了很多,我呆立在原地看了好久那久違的明亮,感覺好像死過的人,重新回到陽間,重見光明一樣,不知道是什么心情,反正是呆呆立了好久,才回過神來。心里難過之余,又痛恨網絡上這些文章的作者不把細節寫清楚,又感慨研發這工作太tm苦了,苦楚無法言說。最令人可恨的是官方網站寫的又簡略又沒有可落地性,官網都說不明白,還搞個球呀,可是任務在身,不搞能行嗎???
寫博客的此時,真是感覺往事不堪回首呀!
ACE_ROOT E:\dds\ACE_wrappers
TAO_ROOT %ACE_ROOT%\TAO
MPC_ROOT %ACE_ROOT%\MPC
DDS_ROOT E:\dds\OpenDDS-3.14
LD_LIBRARY_PATH %DDS_ROOT%\lib
PERL5LIB %DDS_ROOT%\bin\PerlDDS
在Path中添加:中添加:
%ACE_ROOT%\lib
%ACE_ROOT%\bin
%DDS_ROOT%\lib
%DDS_ROOT%\bin
編譯ACE和TAO
進入到%ACE_ROOT%目錄下,可以看到有幾個類似于ACE_vs2017.sln的文件,因為我們安裝的是VS2017,所以我們用visual studio打開ACE_vs2017.sln,然后依次執行“項目-重新解決方案目標”和“生成-生成解決方案”兩個命令,這兩個命令都成功執行后,就表示ace編譯成功了。
進入到%ACE_ROOT%\TAO目錄下,可以看到有幾個類似于TAO_ACE_vs2017.sln的文件,同理因為我們安裝的是VS2017,所以我們用visual studio打開TAO_ACE_vs2017.sln,同樣依次執行“項目-重新解決方案目標”和“生成-生成解決方案”兩個命令,這兩個命令都成功執行后,就表示tao_ace編譯成功了。
3.4 OpenDDS的編譯安裝
了讓OpenDDS支持Java,需要將%JAVA_HOME%\include中的jni.h文件和%JAVA_HOME%\include\win32中的jawt_md.h、jni_md.h復制到Microsoft Visual Studio\2017\Professional\VC\Tools\MSVC下各個版本SDK的include下,以防止編譯時找不到這些文件。
進入到%DDS_ROOT%目錄下,打開configure文件,找到420行,在420行下面添加下面一行代碼:
$opts{‘compiler_version’} = “vs2017”;
用VS2017的開發人員命令提示符,進入%DDS_ROOT%目錄,執行./configure --java。
執行后生成了DDS.sln和setenv.cmd兩個文件,在命令行執行setenv.cmd設置環境變量。
用Visual Studio 2017 打開 DDS.sln。
打開DDS.sln后,在Visual Studio 2017的解決方案管理器中會看到,這個DDS解決方案包含很多個項目,其中有一個項目Messager_Minimal_Idl是默認選中的。
此時,右鍵此項目,打開屬性窗口,配置屬性 > VC++目錄 > 常規 > 包含目錄中添加
E:\dds\OpenDDS-3.13
E:\dds\ACE_wrappers
E:\dds\ACE_wrappers\TAO
如上圖在紅色線標出來的位置添加以上的3個目錄。
最后,一切設置完畢后,開始編譯了。
依次執行“項目-重新解決方案目標”和“生成-生成解決方案”兩個命令,這兩個命令都成功執行后,就表示openDDS編譯成功了。一般而言按照我的步驟設置之后,肯定會成功的,如果有例外沒有成功的,我也沒辦法,自己看著辦吧。
3.5 測試OpenDDS的編譯是否成功
進入%DDS_ROOT%\java\tests下,這個tests目錄中存放的都是java編的dds示例程序,有好多,如下圖所示:
網上說進入到這個目錄后,就開始執行run_test.pl,網上這些說法都是忽略了中間步驟的,不知道是故意搗鬼還是無意的,反正你直接從tests目錄下是找不到run_test.pl的。
因為java/tests/下每一個文件夾都是一個java調用dds的示例程序,而且每一個文件夾下都有run_test.pl,究竟應該執行哪一個呢?
我是進入了messager目錄執行了run_test.pl,最后命令執行完,輸出了test passed,我知道成功了。
執行run_test.pl命令后,會輸出很多東西,但是等一會兒,最后會出現test passed:
這就是編譯工作完全成功了。
參考資料:
1、https://blog.csdn.net/wyc12306/article/details/79577292
2、https://blog.csdn.net/zhuwinmin/article/details/117077587
3、https://download.objectcomputing.com/OpenDDS/OpenDDS-latest.pdf,OpenDDS的開發指南
4、https://www.icode9.com/content-4-173582.html
總結
以上是生活随笔為你收集整理的Java调用OpenDDS(1)-编译安装openDDS-补上了所有网络上其他文章遗漏的细节的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 请问 CType和DirectCast函
- 下一篇: mybatis学习教程中级(十)myba