vsomeip的代码使用http://some-ip.com/[Scalable service-Oriented MiddlewarE over IP (SOME/IP)] protocol。源码包含:
libvsomeip.so
)libvsomeip-sd.so
)。在运行期间如果服务发现功能开启,该动态库就会被加载。你需要进入到vsomeip的根目录:
#一般构建步骤
mkdir build
cd build
cmake ..
make
#如果想要安装在自定义路径(比如 --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
#base path需要能够生成本地的sockets
#可以使用cmake执行命令:
cmake -DBASE_PATH=<YOUR BASE PATH> ..
#默认的base path是/tmp
#对于socket是什么,可以参考https://blog.csdn.net/pashanhu6402/article/details/96428887
#预定义unicast,unicast是单播地址
cmake -DUNICAST_ADDRESS=<YOUR IP ADDRESS> ..
#预定义diagnosis,diagnosis address只占一个字节
cmake -DDIAGNOSIS_ADDRESS=<YOUR DIAGNOSIS ADDRESS> ..
#配置文件会放在一个默认的文件夹
cmake -DDEFAULT_CONFIGURATION_FOLDER=<DEFAULT CONFIGURATION FOLDER> ..
#默认的default configuration folder路径是/etc/vsomeip,
#但是本电脑实际位置是/usr/local/etc/vsomeip
#默认会使用一个配置文件
cmake -DDEFAULT_CONFIGURATION_FILE=<DEFAULT CONFIGURATION FILE> ..
#默认的配置文件是${DEFAULT_CONFIGURATION_FOLDER}/vsomeip.json
#为了让vsomeip能够有处理(SIGINT/SIGTERM)信号的能力,需要cmake按照如下命令
cmake -DENABLE_SIGNAL_HANDLING=1 ..
#当vsomeip收到这些信号的时候,会停止运行vsomeip
#对SIGINT等信号的理解,可以参考https://www.cnblogs.com/alexyuyu/articles/3853583.html
#可以自定义一些log,当IP路由准备好发送和接收message,可以执行cmake
cmake -DROUTING_READY_MESSAGE=<YOUR MESSAGE> ..
#To compile vsomeip with configuration overlays enabled
cmake -DENABLE_CONFIGURATION_OVERLAYS=1 ..
#To compile vsomeip with enabled vSomeIP 2 compatibility layer
cmake -DENABLE_COMPAT=1 ..
mkdir build
cd build
cmake ..
make examples
想要编译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 ..
另有几个make targets可以在test使用
make build_tests
,只编译testsctest
,在build目录执行该命令可以没有冗余输出的执行testsctest -V -R $TESTNAME
,运行单个测试,相当于ctest --verbose --tests-regex $TESTNAME
ctest -N
,列出当前可执行的测试更多有关测试的信息,可以参考tests
目录下的readme.txt
还有两个变量(默认值都是OFF)用来控制是否json文件和测试脚本需要拷贝或者连接到build:
TEST_SYMLINK_CONFIG_FILES
,控制是否json文件和测试脚本需要拷贝到buildTEST_SYMLINK_CONFIG_FILES_RELATIVE
,控制是否json文件和测试脚本需要连接到build如果只想编译测试的子集(用于快速的功能检查),可以使用cmake变量TESTS_BAT
(默认值是OFF)
想要生成文档就需要按照<> 中描述执行cmake,之后再执行 make doc
这会生成:
$BUILDDIR/documentation/README.html
$BUILDDIR/documentation/html/index.html
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的配置文件有多个键值对和键值对数组构成。
一个完整的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"
}
}
主机的IP地址。
主机的子网掩玛。
如果规定了,IP endpoints会绑定到该设备。endpoints应该是服务端和客户端的进行通信的地方。
一个字节长,用于构建客户端的标识符。如果没有其他规定(例如:自定义了client ID),diagnosis address用做client ID的高位字节。
两个字节大小,用于控制一个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。
用于一个主机上有多个路由的情况。该设置过呢更改了/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
。
明确日志的级别,可选的值有:trace, debug, info, warning,error, fatal
明确log信息是否通过控制台输出,可选的值有:true, false
“enable”,决定是否创建一个log文件,可选的值有:true, false
“path”,生成的日志文件的绝对路径
是否使用Diagnostic Log and Trace (DLT),可选的值有:true, false