vsomeip
文章目錄
- vsomeip
- 1.vsomeip概述
- 2.構建步驟
- 2.1構建前準備
- 2.2構建build
- 2.2.1一般構建
- 2.2.2自定義路徑安裝
- 2.2.3使用預定義base path進行編譯
- 2.2.4使用unicast and/or diagnosis address進行編譯
- 2.2.5使用DEFAULT_CONFIGURATION_FOLDER
- 2.2.6使用DEFAULT_CONFIGURATION_FILE
- 2.2.7使用ENABLE_SIGNAL_HANDLING
- 2.2.8使用ROUTING_READY_MESSAGE
- 2.2.9使用ENABLE_CONFIGURATION_OVERLAYS
- 2.2.10使用ENABLE_COMPAT
- 2.3編譯examples
- 2.4編譯tests
- 2.4.1編譯check
- 2.5編譯vsomeip_ctrl
- 2.6生成檔案
- 3.啟動vsomeip應用和使用環境變數
- 4.組態檔的結構
- 4.1整體架構
- 4.2基本元素
- 4.2.1"unicast"
- 4.2.2"netmask"
- 4.2.3"device"
- 4.2.4"diagnosis"
- 4.2.5"diagnosis_mask"
- 4.2.6"network"
- 4.2.7"logging"
- 4.2.7.1"level"
- 4.2.7.2"console"
- 4.2.7.3"file"
- 4.2.7.4"dlt"
1.vsomeip概述
vsomeip的代碼使用http://some-ip.com/[Scalable service-Oriented MiddlewarE over IP (SOME/IP)] protocol,原始碼包含:
- 一個SOME/IP動態庫(
libvsomeip.so) - 還有一個動態庫用于SOME/IP的服務發現(
libvsomeip-sd.so),在運行期間如果服務發現功能開啟,該動態庫就會被加載,
2.構建步驟
2.1構建前準備
- 能夠編譯c++11編譯器,比如5.2版本及以上的gcc
- cmake構建工具
- boost庫,版本在1.55及以上
- 如果使用Google的測驗架構,你需要從https://code.google.com/p/googletest/[gtest]下載1.7.0及以上版本
- 如果想要構建檔案,你需要安裝asciidoc, source-highlight, doxygen和 graphviz
2.2構建build
你需要進入到vsomeip的根目錄:
2.2.1一般構建
#一般構建步驟
mkdir build
cd build
cmake ..
make
2.2.2自定義路徑安裝
#如果想要安裝在自定義路徑(比如 --prefix= ,前提是你需要熟悉autotools,autotools是一些列工具,用于生成makefile),你可以按照如下命令進行cmake
mkdir build
cd build
cmake -DCMAKE_INSTALL_PREFIX:PATH=$YOUR_PATH ..
make
make install
#默認路徑會安裝到 /usr/local/
#usr 指 Unix System Resource
#/usr:系統級的目錄,可以理解為C:/Windows/,/usr/lib理解為C:/Windows/System32,
#/usr/local:用戶級的程式目錄,可以理解為C:/Progrem Files/,用戶自己編譯的軟體默認會安裝到這個目錄下,
#/opt:用戶級的程式目錄,可以理解為D:/Software,opt有可選的意思,這里可以用于放置第三方大型軟體(或游戲),當你不需要時,直接rm -rf掉即可,在硬碟容量不夠時,也可將/opt單獨掛載到其他磁盤上使用,
#原始碼放哪里?
#/usr/src:系統級的原始碼目錄,
#/usr/local/src:用戶級的原始碼目錄
#很多應用都安裝在/usr/local下面,那么,這些應用為什么選擇這個目錄呢?理解了最根源的原因后,也許對你理解linux組織檔案的方式有更直觀的理解,
#答案是:Automake工具定義了下面的一組變數:
#prefix /usr/local
# exec_prefix ${prefix}
# bindir ${exec_prefix}/bin
# libdir ${exec_prefix}/lib
# includedir ${prefix}/include
# datarootdir ${prefix}/share
# datadir ${datarootdir}
# mandir ${datarootdir}/man
# infodir ${datarootdir}/info
# docdir ${datarootdir}/doc/${PACKAGE}
#關于make install命令,可以參考https://zhuanlan.zhihu.com/p/77813702
2.2.3使用預定義base path進行編譯
#base path需要能夠生成本地的sockets
#可以使用cmake執行命令:
cmake -DBASE_PATH=<YOUR BASE PATH> ..
#默認的base path是/tmp
#對于socket是什么,可以參考https://blog.csdn.net/pashanhu6402/article/details/96428887
2.2.4使用unicast and/or diagnosis address進行編譯
#預定義unicast,unicast是單播地址
cmake -DUNICAST_ADDRESS=<YOUR IP ADDRESS> ..
#預定義diagnosis,diagnosis address只占一個位元組
cmake -DDIAGNOSIS_ADDRESS=<YOUR DIAGNOSIS ADDRESS> ..
2.2.5使用DEFAULT_CONFIGURATION_FOLDER
#組態檔會放在一個默認的檔案夾
cmake -DDEFAULT_CONFIGURATION_FOLDER=<DEFAULT CONFIGURATION FOLDER> ..
#默認的default configuration folder路徑是/etc/vsomeip,
#但是本電腦實際位置是/usr/local/etc/vsomeip
2.2.6使用DEFAULT_CONFIGURATION_FILE
#默認會使用一個組態檔
cmake -DDEFAULT_CONFIGURATION_FILE=<DEFAULT CONFIGURATION FILE> ..
#默認的組態檔是${DEFAULT_CONFIGURATION_FOLDER}/vsomeip.json
2.2.7使用ENABLE_SIGNAL_HANDLING
#為了讓vsomeip能夠有處理(SIGINT/SIGTERM)信號的能力,需要cmake按照如下命令
cmake -DENABLE_SIGNAL_HANDLING=1 ..
#當vsomeip收到這些信號的時候,會停止運行vsomeip
#對SIGINT等信號的理解,可以參考https://www.cnblogs.com/alexyuyu/articles/3853583.html
2.2.8使用ROUTING_READY_MESSAGE
#可以自定義一些log,當IP路由準備好發送和接收message,可以執行cmake
cmake -DROUTING_READY_MESSAGE=<YOUR MESSAGE> ..
2.2.9使用ENABLE_CONFIGURATION_OVERLAYS
#To compile vsomeip with configuration overlays enabled
cmake -DENABLE_CONFIGURATION_OVERLAYS=1 ..
2.2.10使用ENABLE_COMPAT
#To compile vsomeip with enabled vSomeIP 2 compatibility layer
cmake -DENABLE_COMPAT=1 ..
2.3編譯examples
mkdir build
cd build
cmake ..
make examples
2.4編譯tests
想要編譯tests,首先把gtest解壓到自定義路徑,有一些測驗需要在同一個網段中再加一個節點,有兩個cmake變數可以用來自動更改json中的ip來適應當前作業的網路配置,
TEST_IP_MASTER: test master的ip地址TEST_IP_SLAVE: test slave(另一個節點)的ip地址
任意一個變數沒有被設定,那么測驗只能在本地運行,無法進行跨物理機的測驗,
當然你也可以設定ENABLE_SIGNAL_HANDLING,來使單元測驗也能夠處理信號,
完整的例子如下:
mkdir build
cd build
export GTEST_ROOT=<the path of googletest>
cmake -DENABLE_SIGNAL_HANDLING=1 -DTEST_IP_MASTER=10.0.3.1 -DTEST_IP_SLAVE=10.0.3.125 ..
2.4.1編譯check
另有幾個make targets可以在test使用
make build_tests,只編譯testsctest,在build目錄執行該命令可以沒有冗余輸出的執行testsctest -V -R $TESTNAME,運行單個測驗,相當于ctest --verbose --tests-regex $TESTNAMEctest -N,列出當前可執行的測驗
更多有關測驗的資訊,可以參考tests目錄下的readme.txt
還有兩個變數(默認值都是OFF)用來控制是否json檔案和測驗腳本需要拷貝或者連接到build:
TEST_SYMLINK_CONFIG_FILES,控制是否json檔案和測驗腳本需要拷貝到buildTEST_SYMLINK_CONFIG_FILES_RELATIVE,控制是否json檔案和測驗腳本需要連接到build
如果只想編譯測驗的子集(用于快速的功能檢查),可以使用cmake變數TESTS_BAT(默認值是OFF)
2.5編譯vsomeip_ctrl
2.6生成檔案
想要生成檔案就需要按照<> 中描述執行cmake,之后再執行 make doc
這會生成:
- The README file in html:
$BUILDDIR/documentation/README.html - A doxygen documentation in
$BUILDDIR/documentation/html/index.html
3.啟動vsomeip應用和使用環境變數
vsomeip應用啟動時以下的環境變數會被讀取:
VSOMEIP_APPLICATION_NAME,賦予vsomeip應用名字,該名字會在組態檔中找尋相匹配的一個id,應用名字與二進制可執行檔案的名字是相互獨立的,VSOMEIP_CONFIGURATION,vsomeip默認會使用組態檔/etc/vsomeip.json或者包含組態檔的檔案夾/etc/vsomeip(在自己電腦實際操作中,默認的組態檔在/usr/local/下),你可以通過該變數使vsomeip使用自定義的組態檔,VSOMEIP_MANDATORY_CONFIGURATION_FILES,vsomeip允許使用mandatory組態檔來加快應用的啟動速度(此時,除負責連接某些外部設別的程式之外,其他所有程式運行時都需要按照mandatory組態檔作業),默認mandatory組態檔是:vsomeip_std.json, vsomeip_app.json和vsomeip_plc.jsonVSOMEIP_CLIENTSIDELOGGING,
注意:
- 組態檔如果找不到,就會使用默認的組態檔
- vsomeip會讀取${VSOMEIP_CONFIGURATION}中所有的組態檔,但不會讀取檔案夾,
4.組態檔的結構
4.1整體架構
vsomeip的組態檔有多個鍵值對和鍵值對陣列構成,
一個完整的object,以{開始,以}結束,每一個鍵值對用:連接,多個鍵值對用,隔開,如果有array,以[開始,以]結束,多個[]用,隔開,
例如:
{
"unicast" : "192.168.56.101",
"logging" :
{
"level" : "debug",
"console" : "true",
"file" : { "enable" : "false", "path" : "/var/log/vsomeip.log" },
"dlt" : "false"
},
"applications" :
[
{
"name" : "client-sample",
"id" : "0x1343"
},
{
"name" : "other-client-sample",
"id" : "0x1344"
},
{
"name" : "service-sample",
"id" : "0x1277"
}
],
"services" :
[
{
"service" : "0x1234",
"instance" : "0x5678",
"reliable" : { "port" : "30509", "enable-magic-cookies" : "false" },
"unreliable" : "31000"
},
{
"service" : "0x1235",
"instance" : "0x5678",
"reliable" : { "port" : "30506", "enable-magic-cookies" : false },
"unreliable" : "31000"
}
],
"routing" : "client-sample",
"service-discovery" :
{
"enable" : "true",
"multicast" : "224.244.224.245",
"port" : "30490",
"protocol" : "udp",
"initial_delay_min" : "10",
"initial_delay_max" : "100",
"repetitions_base_delay" : "200",
"repetitions_max" : "3",
"ttl" : "3",
"cyclic_offer_delay" : "2000",
"request_response_delay" : "1500"
}
}
4.2基本元素
4.2.1"unicast"
主機的IP地址,
4.2.2"netmask"
主機的子網掩瑪,
4.2.3"device"
如果規定了,IP endpoints會系結到該設備,endpoints應該是服務端和客戶端的進行通信的地方,
4.2.4"diagnosis"
一個位元組長,用于構建客戶端的識別符號,如果沒有其他規定(例如:自定義了client ID),diagnosis address用做client ID的高位位元組,
4.2.5"diagnosis_mask"
兩個位元組大小,用于控制一個ECU上最大的vsomeip client并發數量,并規定了client ID的起始值,
例如,默認值0xFF00,表示:高位位元組為diagnosis address預留,并且client ID的初始值為自定義的diagnosis address,最大的客戶端數量是255,因為 Hamming weight of the inverted mask( Hamming weight:一串符號中非零符號個數,Hamming weight of the inverted mask就是一段字符中值為0的字符個數)是8(2^8-1=255,其中1是留給路由管理的),生成的client IDs(例如diagnosis address是0x45)會從 0x4501到0x45ff,
當默認值是0xFE00時,clinet ID的數量為511,因為此時 Hamming weight of the inverted mask為9,當diagnosis address是0x45時,client ID的起始值時0x4401(0x4400作為路由器,因為從0x4500開始會超范圍),到0x45ff,
4.2.6"network"
用于一個主機上有多個路由的情況,該設定過呢更改了/dev/shm中共享記憶體段的名字以及/tmp/下的 unix domain sockets(unix domain sockets的相關介紹可以參考https://www.cnblogs.com/sparkdev/p/8359028.html)名字,
默認情況下共享記憶體被命名為/dev/shm/vsomeip,unix domain sockets被命名為/tmp/vsomeip-$CLIENTID,
4.2.7"logging"
4.2.7.1"level"
明確日志的級別,可選的值有:trace, debug, info, warning,error, fatal
4.2.7.2"console"
明確log資訊是否通過控制臺輸出,可選的值有:true, false
4.2.7.3"file"
“enable”,決定是否創建一個log檔案,可選的值有:true, false
“path”,生成的日志檔案的絕對路徑
4.2.7.4"dlt"
是否使用Diagnostic Log and Trace (DLT),可選的值有:true, false
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/258165.html
標籤:其他
上一篇:vue原始碼學習——回應式資料
