Common API环境部署(保姆级教程,填充了很多坑)

news2024/11/18 5:49:55

Common API环境部署目录

  • 一、前言及结果展示
  • 二、Windows下安装docker
    • 1. 准备工作
      • [1.1 Docker安装包](https://desktop.docker.com/win/main/amd64/Docker%20Desktop%20Installer.exe)
      • [1.2 Wsl2安装包](https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi)
    • 2. 开始安装
      • 2.1 安装Wsl2或者开启Hyper-V
      • 2.2 安装Docker安装包
    • 3. 拉取镜像
  • 三、Windows下安装vscode
    • [1. vscode安装包](https://az764295.vo.msecnd.net/stable/92da9481c0904c6adfe372c12da3b7748d74bdcb/VSCodeUserSetup-x64-1.76.0.exe)
    • 2. 安装docker扩展
  • 四、部署环境前的准备工作
  • 五、部署CommonAPI环境
    • 1. 安装vsomeip库
    • 2. 安装capicxx-core-runtime库
    • 3. 安装capcxx-someip-runtime库
    • 4. 安装commonapi-core-generator生成器
    • 5. 安装commonapi-someip-generator生成器
  • 六、创建demo实例
    • 1. 创建工程目录
    • 2. 编写fidl与fedl文件
    • 3. 使用代码生成器生成src-gen文件夹及内部文件
    • 4. 编写src目录下的文件
      • 4.1 HelloWorldClient.cpp
      • 4.2 编写HelloWorldService.cpp
      • 4.3 编写HelloWorldStubImpl.hpp
      • 4.4 HelloWorldStubImpl.cpp
    • 5. 编写CMakeLists.txt
    • 6. 编译
    • 7. 运行
      • 7.1 服务端执行结果
      • 7.2 客户端执行结果
  • 七、踩过的坑
    • 1. 编译vsomeip时的问题
    • 2. 编译capicxx-core-runtime库时的问题
    • 3. 安装代码生成器时候的问题
    • 4. 关于fdepl文件的问题
    • 5. 关于src下的那几个文件
  • 八、参考及引用

一、前言及结果展示

这个教程是基于Windows平台实现的,使用了docker容器,docker容器拉取了一个ubuntu镜像,就相当于直接在windows平台中直接可以从事Linux环境下的开发,不再需要使用虚拟机去配置一个Linux环境。这样做的好处是比较方便快捷,节省电脑的性能。在Ubuntu镜像中部署了vsomeip和CommonAPI。然后又在vscode中添加了docker容器的扩展,这样我们就可以直接使用vscode进行开发了。

下面展示的这张图是Windows下vscode的界面:

  • 在左侧docker容器的扩展中我们可以直接操作docker容器(开启,关闭),也可以访问docker容器镜像中的东西。由于我们安装了ubuntu镜像,所以可以直接访问ubuntu内部的文件
  • 在右侧上方就是编码区,左侧ubuntu内部的文件可以打开,打开后就会出现在右侧上方,我们可以直接编写代码,编写完成后保存即可
  • 在右侧下方我们可以开启终端,由于这是Windows平台,所以打开后他是Windows的终端,我们可以使用docker的命令进入docker容器,docker容器内是Linux系统,这时候我们的操作就是在Linux平台下进行的操作。切记所有需要在Linux下进行的操作,在操作之前需要先打开终端,使用docker命令进入到容器内才可以使用Linux平台下的命令进行操作
  • 关于终端,在最右侧可以在vscode中开启多个终端,这样在进行客户端服务端交互的时候我们可以比较方便的观察到程序的运行状况

当然如果不想使用docker容器的话,可以跳过前面配置docker容器的这些步骤,直接从后面部署环境前的准备工作看起。

在这里插入图片描述

二、Windows下安装docker

1. 准备工作

下载下面两个安装包

1.1 Docker安装包

1.2 Wsl2安装包

2. 开始安装

2.1 安装Wsl2或者开启Hyper-V

我这里是直接安装Wsl2,第一步中下载成功的安装包,直接安装即可。

2.2 安装Docker安装包

这里直接点击可执行文件安装就可以了。

3. 拉取镜像

打开Windows终端,输入以下命令拉取一个ubuntu镜像

# 拉取ubuntu镜像
docker pull ubuntu
# 查看所有的镜像
docker ps -a
# 结果
# CONTAINER ID   IMAGE     COMMAND       CREATED        STATUS         PORTS     NAMES
# a91190b42b59   ubuntu    "/bin/bash"   15 hours ago   Up 3 minutes             ubuntu-test

三、Windows下安装vscode

1. vscode安装包

2. 安装docker扩展

进入vscode之后在扩展中搜索docker,进行安装

四、部署环境前的准备工作

  • 在ubuntu镜像中安装gcc、make等工具,build-essential中就包含了编译所需的一些工具
apt update		# 先更新一下库
apt install build-essential
  • 在ubuntu镜像中安装cmake工具,需要使用cmake进行工程构建
apt-get install cmake
  • 在ubuntu镜像中安装git工具,需要使用git进行仓库的管理(比如克隆代码)
apt install git
  • 在ubuntu镜像中安装wget工具,需要使用wget工具下载所需文件
apt-get install wget
  • 在ubuntu镜像中安装unzip工具,需要使用unzip工具解压zip压缩包
apt-get install zip unzip
  • 在ubuntu镜像中安装java8的jre环境,CommonAPI后续使用生成器生成代码的过程中,需要依赖java的运行时环境
apt install default-jre
  • 在ubuntu镜像中安装boost,版本控制在1.55~1.76之间,vsomeip需要依赖这个库
apt-get install libboost-system-dev libboost-thread-dev libboost-log-dev

五、部署CommonAPI环境

这里涉及到三个库,分别是:

  • capicxx-core-runtime:这是CommonAPI运行时
  • capcxx-someip-runtime:这是CommonAPIsome/ip
  • vsomeip:这是vsomeip库,CommonAPI是基于vsomeip库实现的

1. 安装vsomeip库

# 在ubuntu镜像中创建一个文件夹vsomeip
mkdir vsomeip
# 进入这个文件夹
cd vsomeip
# 使用git将仓库拉取下来
git clone https://github.com/COVESA/vsomeip.git
# 进入下载好的文件中
cd vsomeip
# 新建一个build文件夹
mkdir build
# 进入build文件夹
cd build
# 使用cmake进行编译
cmake -DENABLE_SIGNAL_HANDLING=1 ..
# 使用make进行编译
make -j16  # 后面的-j16的意思是16个cpu核心一起进行编译,会极大的提高效率,如果核心数量不够就酌情使用合适的,或者使用make进行
# 编译完成后进行安装,前一步编译完之后库都在/vsomeip/vsomeip目录下,进行安装之后,就会在/usr/local目录下
make install

2. 安装capicxx-core-runtime库

# 在Ubuntu镜像中创建一个文件夹CommonAPI_runtime
mkdir CommonAPI_runtime
# 进入这个文件夹
cd CommonAPI_runtime
# 使用git将仓库拉取下来
git clone https://github.com/GENIVI/capicxx-core-runtime.git
# 进入下载好的文件中
cd capicxx-core-runtime/
# 新建一个build文件夹
mkdir build
# 进入build文件夹
cd build
# 使用cmake进行编译
cmake ..
# 使用make进行编译
make -j16
# 进行安装,可做可不做
make install

3. 安装capcxx-someip-runtime库

# 在Ubuntu镜像中创建一个文件夹CommonAPI_SOMEIP
mkdir CommonAPI_SOMEIP
# 进入这个文件夹
cd CommonAPI_SOMEIP
# 使用git将仓库拉取下来
git clone https://github.com/GENIVI/capicxx-someip-runtime.git
# 进入下载好的文件夹
cd capicxx-someip-runtime/
# 新建一个build文件夹
mkdir build
# 进入build文件夹
cd build
# 使用cmake进行编译
cmake -DUSE_INSTALLED_COMMONAPI=OFF ..
# 使用make进行编译
make -j16
# 进行安装,可做可不做
make install

4. 安装commonapi-core-generator生成器

# 在ubuntu镜像中创建一个文件夹CommonAPI_generator
mkdir CommonAPI_generator
# 进入这个文件夹
cd CommonAPI_generator
# 创建一个commonapi-core-generator文件夹
mkdir commonapi-core-generator
# 进入这个文件夹
cd commonapi-core-generator
# 使用wget下载commonapi-core-generator压缩包
wget https://github.com/COVESA/capicxx-core-tools/releases/tag/3.2.0.1
# 下载完成后得到一个压缩包,使用unzip解压缩
unzip commonapi_core_generator.zip
# 解压缩后得到以下文件
artifacts.xml                              commonapi-core-generator-windows-x86.exe     
commonapi-core-generator-linux-x86         commonapi-core-generator-windows-x86.ini     configuration
commonapi-core-generator-linux-x86.ini     commonapi-core-generator-windows-x86_64.exe  features
commonapi-core-generator-linux-x86_64      commonapi-core-generator-windows-x86_64.ini  plugins
commonapi-core-generator-linux-x86_64.ini  commonapi-core-generator.app
# 使用uname -m查看ubuntu镜像的架构
uanme -m
# 执行后得到的结果
x86_64		# 如果是x86_64就选择以x86_64结尾的可执行文件,如果是x86就选择以x86结尾的可执行文件
# 如果担心后面生成器执行不了,就先修改一下生成器的权限
chmod +x ./commonapi-core-generator-linux-x86_64

5. 安装commonapi-someip-generator生成器

这一步官方文档是下载源码,然后使用maven进行构建,我使用这种方式一直没有成功,就换了一种方式

# 进入上一步创建好的文件夹CommonAPI_generator
cd CommonAPI_generator
# 创建一个commonapi-someip-generator文件夹
mkdir commonapi-someip-generator
# 进入这个文件夹
cd commonapi-someip-generator
# 使用wget下载commonapi-someip-generator压缩包
wget https://github.com/COVESA/capicxx-someip-tools/releases/download/3.2.0.1/commonapi_someip_generator.zip
# 下载完成后得到一个压缩包,使用unzip解压缩
unzip commonapi_someip_generator.zip
# 解压缩后得到以下文件
artifacts.xml                                commonapi-someip-generator-windows-x86.exe          
commonapi-someip-generator-linux-x86         commonapi-someip-generator-windows-x86.ini     configuration
commonapi-someip-generator-linux-x86.ini     commonapi-someip-generator-windows-x86_64.exe  features
commonapi-someip-generator-linux-x86_64      commonapi-someip-generator-windows-x86_64.ini  org.genivi.commonapi.someip.target  
commonapi-someip-generator-linux-x86_64.ini  commonapi-someip-generator.app                 plugins
# 使用uname -m查看ubuntu镜像的架构
uanme -m
# 执行后得到的结果
x86_64		# 如果是x86_64就选择以x86_64结尾的可执行文件,如果是x86就选择以x86结尾的可执行文件
# 如果担心后面生成器执行不了,就先修改一下生成器的权限
chmod +x ./commonapi-someip-generator-linux-x86_64

至此,环境已经全部配置完毕了

六、创建demo实例

1. 创建工程目录

# 在Ubuntu镜像中创建文件夹project
mkdir project
# 进入project文件夹
cd project
# 创建fidl、src、build文件夹
mkdir fidl src build
# 创建CMakeLists.txt文件
touch CMakeLists.txt
# 进入fidl文件夹
cd fidl
# 创建HelloWorld.fidl文件和HelloWorld.fdepl文件
touch HelloWorld.fidl HelloWorld.fdepl
# 进入src文件夹
cd ../src
# 创建HelloWorldClient.cpp、HelloWorldService.cpp、HelloWorldStubImpl.hpp、HelloWorldStubImpl.cpp文件
touch HelloWorldClient.cpp HelloWorldService.cpp HelloWorldStubImpl.hpp HelloWorldStubImpl.cpp
# 使用tree命令查看project的目录结构
tree .
# 得到的结果
.
|-- CMakeLists.txt
|-- build
|-- fidl
|   |-- HelloWorld.fdepl
|   `-- HelloWorld.fidl
`-- src
    |-- HelloWorldClient.cpp
    |-- HelloWorldService.cpp
    |-- HelloWorldStubImpl.cpp
    `-- HelloWorldStubImpl.hpp

2. 编写fidl与fedl文件

fidl文件为约束服务的文件,参考此HelloWorld.fidl

package commonapi

interface HelloWorld {
  version {major 1 minor 0}
  method sayHello {
    in {
      String name
    }
    out {
      String message
    }
  }
}

配置带有someip标识符的.fdepl文件,参考此HelloWorld.fdepl


import "platform:/plugin/org.genivi.commonapi.someip/deployment/CommonAPI-SOMEIP_deployment_spec.fdepl"
import "HelloWorld.fidl"

define org.genivi.commonapi.someip.deployment for interface commonapi.HelloWorld {
	SomeIpServiceID = 4660
        method sayHello {
	SomeIpMethodID = 123
}
//    define org.genivi.commonapi.someip.deployment for provider MyService {
//	instance commonapi.HelloWorld {
//		InstanceId = "test"
//		SomeIpInstanceID = 22136
//	}
//}
    define org.genivi.commonapi.someip.deployment for provider as MyService {
	instance commonapi.HelloWorld {
		InstanceId = "test"
		SomeIpInstanceID = 22136
	}
}

上面的代码中有一部分注释掉了,被注释的那一段是官方文档中的,按照那个运行会出错,下面的是正确的,运行不会出错。两者的区别就是在MyService之前添加了一个as

3. 使用代码生成器生成src-gen文件夹及内部文件

# 使用前面安装的两个代码生成器针对fidl文件和fdepl文件进行代码生成
./CommonAPI_generator/commonapi-core-generator/commonapi-core-generator-linux-x86_64 -sk ./fidl/HelloWorld.fidl
./CommonAPI_generator/commonapi-someip-generator/commonapi-someip-generator-linux-x86_64 -ll verbose ./fidl/HelloWorld.fdepl
# 执行完后生成了一个新的文件夹src-gen,进入src-gen
cd src-gen
# 使用tree命令查看project文件的目录结构
tree .
# 结果
.
|-- CMakeLists.txt
|-- build
|-- fidl
|   |-- HelloWorld.fdepl
|   `-- HelloWorld.fidl
|-- src
|   |-- HelloWorldClient.cpp
|   |-- HelloWorldService.cpp
|   |-- HelloWorldStubImpl.cpp
|   `-- HelloWorldStubImpl.hpp
`-- src-gen
    `-- v1
        `-- commonapi
            |-- HelloWorld.hpp
            |-- HelloWorldProxy.hpp
            |-- HelloWorldProxyBase.hpp
            |-- HelloWorldSomeIPDeployment.cpp
            |-- HelloWorldSomeIPDeployment.hpp
            |-- HelloWorldSomeIPProxy.cpp
            |-- HelloWorldSomeIPProxy.hpp
            |-- HelloWorldSomeIPStubAdapter.cpp
            |-- HelloWorldSomeIPStubAdapter.hpp
            |-- HelloWorldStub.hpp
            `-- HelloWorldStubDefault.hpp
# 可以发现使用代码生成器生成了很多的文件,这些文件相当于头文件,供后续编写src中的文件时使用

4. 编写src目录下的文件

4.1 HelloWorldClient.cpp

// HelloWorldClient.cpp
#include <iostream>
#include <string>
#include <unistd.h>
#include <CommonAPI/CommonAPI.hpp>
#include <v1/commonapi/HelloWorldProxy.hpp>

using namespace v1_0::commonapi;

int main() {
    std::shared_ptr < CommonAPI::Runtime > runtime = CommonAPI::Runtime::get();
    std::shared_ptr<HelloWorldProxy<>> myProxy =
    	runtime->buildProxy<HelloWorldProxy>("local", "test");
    std::cout << "Checking availability!" << std::endl;
	while (!myProxy->isAvailable())
    	usleep(10);
	std::cout << "Available..." << std::endl;

	CommonAPI::CallStatus callStatus;
	std::string returnMessage;
	myProxy->sayHello("Bob", callStatus, returnMessage);
	std::cout << "Got message: '" << returnMessage << "'\n";
	return 0;
}

4.2 编写HelloWorldService.cpp

// HelloWorldService.cpp
#include <iostream>
#include <thread>
#include <CommonAPI/CommonAPI.hpp>
#include "HelloWorldStubImpl.hpp"

using namespace std;

int main() {
    std::shared_ptr<CommonAPI::Runtime> runtime = CommonAPI::Runtime::get();
    std::shared_ptr<HelloWorldStubImpl> myService =
    	std::make_shared<HelloWorldStubImpl>();
    runtime->registerService("local", "test", myService);
    std::cout << "Successfully Registered Service!" << std::endl;
    while (true) {
        std::cout << "Waiting for calls... (Abort with CTRL+C)" << std::endl;
        std::this_thread::sleep_for(std::chrono::seconds(30));
    }
    return 0;
}

4.3 编写HelloWorldStubImpl.hpp

此文件是为了实现自己在idl中定义的sayHello方法:

// HelloWorldStubImpl.hpp
#ifndef HELLOWORLDSTUBIMPL_H_
#define HELLOWORLDSTUBIMPL_H_

#include <CommonAPI/CommonAPI.hpp>
#include <v1/commonapi/HelloWorldStubDefault.hpp>

class HelloWorldStubImpl: public v1_0::commonapi::HelloWorldStubDefault {
public:
    HelloWorldStubImpl();
    virtual ~HelloWorldStubImpl();
    virtual void sayHello(const std::shared_ptr<CommonAPI::ClientId> _client,
    	std::string _name, sayHelloReply_t _return);
};
#endif /* HELLOWORLDSTUBIMPL_H_ */

4.4 HelloWorldStubImpl.cpp

HelloWorldStubImpl.cpp是HelloWorldStubImpl.hpp的具体实现

// HelloWorldStubImpl.cpp
#include "HelloWorldStubImpl.hpp"

HelloWorldStubImpl::HelloWorldStubImpl() { }
HelloWorldStubImpl::~HelloWorldStubImpl() { }

void HelloWorldStubImpl::sayHello(const std::shared_ptr<CommonAPI::ClientId> _client,
	std::string _name, sayHelloReply_t _reply) {
	    std::stringstream messageStream;
	    messageStream << "Hello " << _name << "!";
	    std::cout << "sayHello('" << _name << "'): '" << messageStream.str() << "'\n";
		_reply(messageStream.str());
};

5. 编写CMakeLists.txt

cmake_minimum_required(VERSION 2.8)		# cmake的最低版本要求,使用apt安装的cmake版本一般是没什么问题的

project(my)		# 工程名字,随意写就行

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread -std=c++11")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -ldl")
set(RUNTIME_PATH /CommonAPI_runtime)		# 这里是运行时库的路径,就是安装capicxx-core-runtime的路径
set(SOMEIP_PATH /CommonAPI_SOMEIP)			# 这里是someip库的路径,就是安装capicxx-someip-runtime的路径
set(VSOMEIP_PATH /vsomeip/vsomeip)			# 这里是vsomeip库的路径,就是安装vsomeip的位置

include_directories(
    src-gen
    src
    ${RUNTIME_PATH}/capicxx-core-runtime/include
    ${SOMEIP_PATH}/capicxx-someip-runtime/include
    ${VSOMEIP_PATH}/interface/vsomeip
)
link_directories(
    ${RUNTIME_PATH}/capicxx-core-runtime/build
    ${SOMEIP_PATH}/capicxx-someip-runtime/build
    ${VSOMEIP_PATH}/build
)
add_executable(HelloWorldClient
	src/HelloWorldClient.cpp
	src-gen/v1/commonapi/HelloWorldSomeIPProxy.cpp
	src-gen/v1/commonapi/HelloWorldSomeIPDeployment.cpp
)
target_link_libraries(HelloWorldClient CommonAPI CommonAPI-SomeIP vsomeip3)
add_executable(HelloWorldService
	src/HelloWorldService.cpp
	src/HelloWorldStubImpl.cpp	
	src-gen/v1/commonapi/HelloWorldSomeIPStubAdapter.cpp
	#src-gen/v1/commonapi/HelloWorldStubDefault.cpp
	src-gen/v1/commonapi/HelloWorldSomeIPDeployment.cpp
)
target_link_libraries(HelloWorldService CommonAPI CommonAPI-SomeIP vsomeip3)

6. 编译

# 进入project目录下的build文件夹中
cd /project/build
# 使用cmake进行编译
cmake ..
# 使用make进行编译
make
# 使用tree命令查看build的目录结构
tree -L 2					# 这里只查看两层的
# 结果
.
|-- CMakeCache.txt
|-- CMakeFiles
|   |-- 3.22.1
|   |-- CMakeDirectoryInformation.cmake
|   |-- CMakeOutput.log
|   |-- CMakeTmp
|   |-- HelloWorldClient.dir
|   |-- HelloWorldService.dir
|   |-- Makefile.cmake
|   |-- Makefile2
|   |-- TargetDirectories.txt
|   |-- cmake.check_cache
|   `-- progress.marks
|-- HelloWorldClient
|-- HelloWorldService
|-- Makefile
`-- cmake_install.cmake
# 可以发现已经生成了HelloWorldClient、HelloWorldService这两个可执行文件

7. 运行

在vscode中打开两个终端

# 查看设备上运行的docker容器,此时终端还是windows系统的终端
docker ps -a
# 执行结果
# CONTAINER ID   IMAGE     COMMAND       CREATED        STATUS         PORTS     NAMES
# a91190b42b59   ubuntu    "/bin/bash"   15 hours ago   Up 3 minutes             ubuntu-test
# 在这两个终端中都输入下面指令以进入docker容器
docker exec -it a91190b42b59 /bin/bash 		# a91190b42b59代表的是容器ID,在设备中使用ID号唯一标识容器
# 进入容器后两个终端都进入到/project/build目录下
cd project/build
# 在一个终端中打开客户端程序,另一个终端中打开服务端程序,也就是在两个终端中分别输入下面指令
./HelloWorldClient
./HelloWorldService

7.1 服务端执行结果

[CAPI][INFO] Loading configuration file '/etc/commonapi.ini'
[CAPI][INFO] Using default binding 'dbus'
[CAPI][INFO] Using default shared library folder '/usr/local/lib/commonapi'
[CAPI][INFO] Registering function for creating "commonapi.HelloWorld:v1_0" stub adapter.
[CAPI][INFO] Registering stub for "local:commonapi.HelloWorld:v1_0:test"
2023-02-05 00:52:11.163749 [info] Parsed vsomeip configuration in 0ms
2023-02-05 00:52:11.165322 [info] Configuration module loaded.
2023-02-05 00:52:11.165978 [info] Initializing vsomeip application "".
2023-02-05 00:52:11.168704 [info] Instantiating routing manager [Host].
2023-02-05 00:52:11.170855 [info] create_local_server Routing endpoint at /tmp/vsomeip-0
2023-02-05 00:52:11.172405 [info] Service Discovery enabled. Trying to load module.
2023-02-05 00:52:11.177469 [info] Service Discovery module loaded.
2023-02-05 00:52:11.178809 [info] Application(unnamed, 0100) is initialized (11, 100).
2023-02-05 00:52:11.181580 [info] Starting vsomeip application "" (0100) using 2 threads I/O nice 255
2023-02-05 00:52:11.183183 [info] main dispatch thread id from application: 0100 () is: 7f6e956ef640 TID: 16751       
2023-02-05 00:52:11.183338 [info] shutdown thread id from application: 0100 () is: 7f6e94eee640 TID: 16752
2023-02-05 00:52:11.184302 [info] OFFER(0100): [1234.5678:1.0] (true)
2023-02-05 00:52:11.188145 [info] Listening at /tmp/vsomeip-100
Successfully Registered Service!
Waiting for calls... (Abort with CTRL+C)
2023-02-05 00:52:11.190775 [info] Watchdog is disabled!
2023-02-05 00:52:11.193241 [info] io thread id from application: 0100 () is: 7f6e95ef0640 TID: 16750
2023-02-05 00:52:11.193235 [info] io thread id from application: 0100 () is: 7f6e877fe640 TID: 16754
2023-02-05 00:52:11.195887 [info] vSomeIP 3.1.20.3 | (default)
2023-02-05 00:52:11.196776 [info] Network interface "lo" state changed: up
2023-02-05 00:52:21.201855 [info] vSomeIP 3.1.20.3 | (default)
2023-02-05 00:52:31.205929 [info] vSomeIP 3.1.20.3 | (default)
2023-02-05 00:52:31.990428 [info] Application/Client 0101 is registering.
2023-02-05 00:52:31.991535 [info] Client [100] is connecting to [101] at /tmp/vsomeip-101
2023-02-05 00:52:31.994791 [info] REGISTERED_ACK(0101)
2023-02-05 00:52:31.080177 [info] REQUEST(0101): [1234.5678:1.4294967295]
sayHello('Bob'): 'Hello Bob!'
2023-02-05 00:52:31.089934 [info] RELEASE(0101): [1234.5678]
2023-02-05 00:52:31.092560 [info] Application/Client 0101 is deregistering.
2023-02-05 00:52:31.194883 [info] Client [100] is closing connection to [101]
^C2023-02-05 00:52:37.737567 [info] Stopping vsomeip application "" (0100).
2023-02-05 00:52:37.759176 [info] Exiting vsomeip application...

7.2 客户端执行结果

[CAPI][INFO] Loading configuration file '/etc/commonapi.ini'
[CAPI][INFO] Using default binding 'dbus'
[CAPI][INFO] Using default shared library folder '/usr/local/lib/commonapi'
2023-02-05 00:52:31.973435 [info] Parsed vsomeip configuration in 0ms
2023-02-05 00:52:31.973726 [info] Configuration module loaded.
2023-02-05 00:52:31.973891 [info] Initializing vsomeip application "".
2023-02-05 00:52:31.974102 [info] Instantiating routing manager [Proxy].
2023-02-05 00:52:31.975376 [info] Client [ffff] is connecting to [0] at /tmp/vsomeip-0
2023-02-05 00:52:31.975927 [info] Application(unnamed, ffff) is initialized (11, 100).
2023-02-05 00:52:31.976852 [info] Starting vsomeip application "" (ffff) using 2 threads I/O nice 255
2023-02-05 00:52:31.977723 [info] main dispatch thread id from application: ffff () is: 7f91b1697640 TID: 16758
2023-02-05 00:52:31.977921 [info] shutdown thread id from application: ffff () is: 7f91b0e96640 TID: 16759
Checking availability!
2023-02-05 00:52:31.983733 [info] io thread id from application: ffff () is: 7f91b1e98640 TID: 16757
2023-02-05 00:52:31.983716 [info] io thread id from application: ffff () is: 7f91a3fff640 TID: 16760
2023-02-05 00:52:31.989212 [info] Listening at /tmp/vsomeip-101
2023-02-05 00:52:31.989452 [info] Client 101 () successfully connected to routing  ~> registering..
2023-02-05 00:52:31.993875 [info] Application/Client 101 () is registered.
2023-02-05 00:52:31.080970 [info] ON_AVAILABLE(0101): [1234.5678:1.0]
Available...
2023-02-05 00:52:31.083253 [info] Client [101] is connecting to [100] at /tmp/vsomeip-100
Got message: 'Hello Bob!'
2023-02-05 00:52:31.091285 [info] Stopping vsomeip application "" (0101).
2023-02-05 00:52:31.093326 [info] Application/Client 101 () is deregistered.
2023-02-05 00:52:31.096368 [info] Client [101] is closing connection to [100]

七、踩过的坑

1. 编译vsomeip时的问题

刚开始是在VMware虚拟机中的Ubuntu20.04环境中进行编译的,在进行make的时候,执行到最后总是会报错,说是动态库链接失败,报错原因是ubuntu16.10版本之后默认使用PIE了,而这个makefile文件不支持PIE,所以会失败。网上有很多说法是添加-fPIC,我多次尝试也没能解决。当然还有一种解决方法是在makefile文件中的gcc一行加入-no-pie来禁掉PIE,这个方式我没有尝试,因为这个项目是使用cmake进行构建的,这种情况下由cmake生成的makefile文件行数很多,并且修改库文件的makefile文件风险太大,万一改错了一个地方后续可能会有更多的麻烦。。。。。

后续我尝试在另一台云电脑中进行编译,也是ubuntu20.04的环境,编译就一下通过了,再到后面使用docker拉取的ubuntu镜像(22.04版本)中也进行了编译,也通过了。所以。。。。难受

2. 编译capicxx-core-runtime库时的问题

在编译完成这个库之后,我想把这个库的上级目录重新命名一下,操作了之后,再后面编译别的库的时候,编译出错了,原因是别的库需要依赖这个库,而这个库的名字被我改掉了,导致依赖的时候找不到这个库了。教训就是不要轻易改目录名字。。。

3. 安装代码生成器时候的问题

这里需要用到两个代码生成器,一个是跟运行时相关的,这个的话根据官方的文档,使用wget命令下载发行版的压缩包解压就能使用。这个我没踩什么大坑,就是在执行的时候使用了x86的生成器,一直不成功,后面才发现我的镜像需要使用x86_64的生成器,使用这个之后就成功了。

踩坑的是第二个代码生成器,他是跟someip相关的,我也是参照的官方文档,他那里是让下载生成器源码,然后使用maven工具相当于是编译吧,具体也不是很懂。我就按照他的步骤去做,结果花了很长时间还一直不成功,到最后总是出错。然后我就去查找有没有发行版本可以直接拿来使用的,结果找到了,找到发行版本使用之后一次成功。(有时候也不能完全信官方文档。。。)

4. 关于fdepl文件的问题

在上一步中,我其实刚开始也是尝试用发行版本解压后的文件去生成代码的,但是一直出错,后面我就尝试按官方的文档编译生成这个代码生成器。结果官方文档也不行,生成时候一直出错。后面只好再换回发行版本,还是报之前的错误,这次我尝试直接把报错信息复制下来去网上搜索看看有没有解决办法,搜了一下发现竟然有

在这里插入图片描述

结果是示例代码出了问题,人已经麻了。。。我刚开始出错了没有直接去搜索,因为之前也搜过,这个受众比较少,大家给的解决方案也不多,所以我刚开始就没抱什么希望。跌跌撞撞,坎坎坷坷

5. 关于src下的那几个文件

我是参考的别人的一篇博客,他一直没有交代他project项目的目录结构,我一直也不是很清晰。就是跟着他的步骤在那里一步步进行。进行到最后使用cmake编译,发生了错误。这才发觉是目录结构有问题,跟CMakeLists.txt文件中的目录结构不一致。这才将src相关的目录全部删除,根据CMakeLists.txt文件中的目录结构重新创建目录结构,最后推演出真实可行的结构。所以说有时候写文档最好先把目录结构列出来,这样会方便读者能有一个比较清楚的结构。

八、参考及引用

[1] Windows11下安装Docker

[2] 已解决:Ubuntu中make文件出错,提示“最后的链结失败:输出不可表示的节”

[3] 【图文教程】Windows11下安装Docker Desktop

[4] commonapi和vsomeip构建

[5] CommonAPI C++ in 10 minutes (with D-Bus)

[6] CommonAPI C++ in 10 minutes (with SOME/IP)

[7] CommonAPI新版本配置

[8] 由fedpl文件生成代码时发生的错误

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/389015.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【数据结构】链式二叉树

前言 在前面我们学习了一些二叉树的基本知识&#xff0c;了解了它的结构以及一些性质&#xff0c;我们还用数组来模拟二叉树建立了堆&#xff0c;并学习了堆排序&#xff0c;可是数组结构的二叉树有很大的局限性&#xff0c;平常我们用的最多树结构的还是链式二叉树&#xff0c…

【自律】学习方案

自律来源 轶事 陆奇以精力旺盛著称&#xff0c;通常凌晨4点起床&#xff0c;先查邮件&#xff0c;然后在跑步机上跑4英里&#xff0c;边跑边听古典音乐或看新闻。早上5点至6点至办公室&#xff0c;利用这段时间不受别人干扰准备一天的工作&#xff0c;然后一直工作到晚上10点&a…

搜索引擎的设计与实现

技术&#xff1a;Java、JSP等摘要&#xff1a;随着互联网的快速发展&#xff0c;网络上的数据也随着爆炸式地增长。如何最快速筛选出对我们有用的信息成了主要问题。搜索引擎是指根据一定的策略、运用特定的计算机程序从互联网上搜集信息&#xff0c;在对信息进行组织和处理后&…

ks通过恶意低绩效来变相裁员(五)绩效申诉就是「小六自证吃了一碗凉粉」

目录 一、小六吃了一碗凉粉 二、给你差绩效 公司告诉你可以绩效申诉 1、公司的实际目的是啥 2、你一旦自证&#xff0c;就掉入了陷阱 三、谁主张谁举证——让公司证明它绩效考核的客观性和公平性 四、针对公司的流氓恶意绩效行为&#xff0c;还有其他招吗 五、当公司用各…

学习方法--找书,背书,利器

学习方法 前言&#xff1a; 1、所谓的技术/技能&#xff0c;可比作对一类书的学习&#xff0c;那么第一步&#xff0c;就是要找这方面的书本来学习&#xff0c;简称为“找书”&#xff0c;找书既是指资料&#xff0c;也是指经验总结等等&#xff0c;第二步&#xff0c;就是背下…

【基础算法】双指针---数组元素的目标和

&#x1f339;作者:云小逸 &#x1f4dd;个人主页:云小逸的主页 &#x1f4dd;Github:云小逸的Github &#x1f91f;motto:要敢于一个人默默的面对自己&#xff0c;强大自己才是核心。不要等到什么都没有了&#xff0c;才下定决心去做。种一颗树&#xff0c;最好的时间是十年前…

CSS 基础:选择器、盒模型、布局

CSS&#xff08;Cascading Style Sheets&#xff09;是用于定义 HTML 或 XML 文档中的样式的一种语言。它可以控制网页的排版、字体、颜色、背景等多个方面&#xff0c;从而使网页呈现出美观的视觉效果和良好的用户体验。其中&#xff0c;选择器、盒模型和布局是 CSS 基础中的三…

Pod控制器

一.Pod控制器及其功用Pod控制器&#xff0c;又称之为工作负载&#xff08;workload&#xff09;&#xff0c;是用于实现管理pod的中间层&#xff0c;确保pod资源符合预期的状态&#xff0c;pod的资源出现故障时&#xff0c;会尝试进行重启&#xff0c;当根据重启策略无效&#…

C. Zero Path

给你一个矩阵&#xff0c;矩阵中每个点是1或者-1&#xff0c;问你是否存在一条路径从左上角到右下角路径上所经过点的总和是0。 类似于数字三角型&#xff0c;dp[i][j]可以用dp[i-1][j]的位置 和 dp[i][j-1]的位置传递过来&#xff0c;我们可以保存每个位置可以达成的和的所有可…

ROS小车研究笔记3/4/2023:自动导航launch文件解析

对于ROS小车导航算法基本原理和使用方法&#xff0c;可以看笔记http://t.csdn.cn/NUWHt 1 启动小车导航节点&#xff1a;turn_on_wheeltec_robot navigation.launch <launch><!-- 开启机器人底层相关节点 同时开启导航功能--><include file"$(find turn_on…

P6专题:如何通过P6 Professional创建及管理 EPS

目录 引言 创建EPS 引言 牢记P6数据结构&#xff0c;这是P6编制计划的层次&#xff1a;EPS-项目-WBS-作业。 EPS&#xff08;Enterprise Breakdown Structure&#xff09;&#xff1a;企业项目结构&#xff0c;用于组织项目&#xff0c;并进行数据汇总。EPS 代表 Primavera…

XFI和SFI的差异

目录 相同/相似点 应用参考模型 Trace Length 不同点 眼图模板 B点处的眼图模板对比 C点处的眼图模板对比 通道损耗 CDR支持 预加重和均衡 DC特性 RETIMER的用法 通过研究INF-8077i 10 Gigabit Small Form Factor Pluggable Module规范和SFF-8431 Specifications for …

【STM32】入门(十四):FreeRTOS-任务

1、简述 FreeRTOS应用程序由一组独立的任务构成。 在任何时间点&#xff0c;应用程序中只能执行一个任务&#xff0c;FreeRTOS调度器负责决定所要执行的任务。 每个任务在自己的上下文中执行&#xff0c;不依赖于系统内的其他任务或 FreeRTOS的调度器本身。 FreeRTOS调度器负责…

51单片机IIC时序详细分析并驱动EEPROM存储方案应用------day9

51单片机IIC驱动EEPROM存储方案应用------day9 1.常见存储器件&#xff1a; 铁电&#xff0c; E2PROM&#xff0c; FLASH。 共同特点&#xff1a; 掉电后数据不丢失 各自特点&#xff1a; 铁电&#xff1a; 理论上可以无限次擦写&#xff0c; 操作简单&#xff0c; 但是容量小。…

进销存管理系统

技术&#xff1a;Java等摘要&#xff1a;进销存管理系统是为了实现企业仓库商品管理的系统化、规范化和自动化&#xff0c;从而提高企业管理效率而设计开发的管理信息系统。它完全取代了过去一直用人工管理的工作方式&#xff0c;避免了由于管理人员手工操作上的疏忽以及管理质…

【Linux】基本系统维护命令

&#x1f60a;&#x1f60a;作者简介&#x1f60a;&#x1f60a; &#xff1a; 大家好&#xff0c;我是南瓜籽&#xff0c;一个在校大二学生&#xff0c;我将会持续分享C/C相关知识。 &#x1f389;&#x1f389;个人主页&#x1f389;&#x1f389; &#xff1a; 南瓜籽的主页…

P6专题:P6模块/组件简要介绍(P6,Professional,API,TeamMember,WebService)

目录 一 引言 二 P6组件 P6 P6 Professional Team Member PC Team Member App Integration API WebService 一 引言 Oracle Primavera P6 EPPM 是基于“角色”设计的企业级项目管理专业软件&#xff0c;包含了如下几个组件/模块&#xff0c;解决不同维度的问题&#x…

linux入门---shell感性认识

命令行解释器 我们目前学了很多的指令&#xff0c;并且这些指令在磁盘上都是以文件的形式存在的&#xff1a; 通过file可以查看这些文件的信息&#xff0c;我们发现这些文件都含有executable这个单词&#xff0c;那么executable的意思就是这个文件在x86-64平台下是可以执行的…

【巨人的肩膀】JAVA面试总结(五)

1、&#x1f4aa; 目录1、&#x1f4aa;1.1、什么是Spring框架1.2、Spring、SpringMVC、SpringBoot三者关系1.3、谈谈对于Spring IoC 和 DI 的理解1.4、什么是依赖注入&#xff1f;可以通过多少种方式完成依赖注入1.5、什么是Spring Bean1.6、将一个类声明为Bean的注解有哪些1.…

PMP是什么意思?适合哪些人学呢?

PMP简而言之&#xff0c;就是提高项目管理理论基础和实践能力的考试。 官方一点的说明呢&#xff0c;就是&#xff1a;PMP证书全称为Project Management Professional&#xff0c;也叫项目管理专业人士资格认证。 PMP证书由美国项目管理协会(PMI)发起&#xff0c;是严格评估项…