CommonAPI-SOMEIP需要使用的资源及其链接

本文档详细介绍了在Linux环境下编译和运行CommonAPI-SomeIP所需步骤及可能遇到的问题。包括VSOMEIP、capicxx-core-runtime和capicxx-someip-runtime的编译,以及Commonapi_core_generator和commonapi_someip_generator的使用。在编译时需设置依赖库路径和安装JRE。运行时注意配置文件、库加载和路由设置。移植到其他机器时,需检查库路径、软链接和IP配置。同时,给出了添加路由服务的命令。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

VSOMEIP源码: 可以编译相应的动态库,编译之前,需要依赖boost的库,https://github.com/COVESA/vsomeip

capicxx-core-runtime:commonapi的运行时代码,编译后可生成libCommonAPI.so库,https://github.com/COVESA/capicxx-core-runtime

capicxx-someip-runtime:commonapi-someip-runtime代码,编译时需要依赖commonapi和vsomeip,编译后可生成libCommonapi-Someip.so, https://github.com/GENIVI/capicxx-someip-runtime

Commonapi_core_generator:根据fidl文件生成CommonAPI的代码,https://github.com/COVESA/capicxx-core-tools/releases

commonapi_someip_generator: 根据fdepl文件生成CommonAPI-Someip的代码,https://github.com/GENIVI/capicxx-someip-tools/releases

在编译和运行CommonAPI-SomeIP时遇到的问题:

1. 在编译库时cmake的参数-DCMAKE_PREFIX_PATH=path ,path设置为编译该库需要依赖的库以及头文件目录,DCMAKE_INSTALL_PATH=path1,path1设置为该库编译好之后存放的目录,在cmake之后,执行make install可将该库在之前设定的指定目录安装。

2.使用Commonapi_core_generator的程序时,需要添加参数 -sk 。在linux执行该程序时,可能会出现java环境未安装,报错内容为:“A Java runtimeEnvironment(JRE)or Java Development Kit (JDK) must be available in order to run Commonapi-core-generator-linux-x86_64.No Java virtual machine was found after searching the following locations:*/jre/bin/java java in your current PATH”。可以安装如下命令安装JDK:

sudo apt install openjdk-8-jre-headless
或
sudo apt install openjdk-11-jre-headless
或
sudo apt install default-jre

3. capicxx-core-tools:内容包含CommonAPI-Example,里面有相关的example可以使用,注意编译过程中默认使用的是DBUS,直接编译可能会出现找不到DBUS的情况,修改相应的CMakeLists.txt即可。

4.在运行CommonAPI-Somip时注意加载的配置文件为默认的或者通过自己写sh脚本定义好默认的加载库以及加载配置文件和vsomeip的application name,如果库无法加载,可能会报configuration could not be load的错误,通过vsomeip源码进行查看,该错误出现的原因在于libvsomeip-cfg未成功加载。

5.在移植到其他机器上可能会出现库无法加载,可能是由于以下两个原因:

注意看库的路径是否为库安装路径的直接lib目录,如果目录错误可能无法加载;

可能由于软链接失效出现file is too short,此时依次安装依赖关系建立软链接。

6.在同一个机器上使用vsomeip时,注意配置文件中routing的配置,routing必须为此机器上第一个启动的应用程序的application name,注意此application name并不是生成的可执行程序的名称,而是someip中create application的名称,并且一个机器上只能有一个程序作为路由,如果第二个程序启动配置了不同路由,会出现报错 路由已经存在的错误,因此将第二个配置文件的路由修改为第一个程序启动时使用的路由。同一个机器上可以不用配置IP地址。

7.在进行跨板子传输时,必须正确配置ip地址,并且添加路由服务到本机,添加路由服务的命令如下:

route add -net 224.0.0.0/4 dev ens33

//ens33为网卡名

### CommonAPISOME/IP集成概述 CommonAPI 是一种用于实现面向服务架构 (SOA) 的中间件框架,它允许开发者以对象为导向的方式设计分布式系统的接口。而 SOME/IP(Scalable service-Oriented MiddlewarE over IP)是一种基于 IP 的通信协议,专为汽车电子控制单元 (ECU) 之间的复杂消息传递设计。两者的结合可以提供一种高效、灵活的服务调用机制。 #### 集成背景 在现代车辆中,随着软件定义汽车的趋势日益明显,车载网络需要支持复杂的跨域通信需求。CommonAPI 提供了一种抽象层,使得开发人员能够专注于业务逻辑而不是底层通信细节;而 SOME/IP 则负责处理具体的传输层面问题,如数据序列化、反序列化以及服务质量管理等[^1]。 以下是关于如何将 CommonAPISOME/IP 进行集成的一些具体说明: --- ### 使用案例分析 #### 1. **环境准备** 为了使 CommonAPI 能够运行于 SOME/IP 上,首先需确保目标平台上已正确部署并初始化了必要的依赖库。这通常涉及安装 D-Bus 或其他基础通讯设施作为支撑结构的一部分[^4]。 ```bash mkdir /Base/software/modules/modulefiles/ cd /path/to/commonapi-someip-installation sh modulefiles-setup.sh --output-dir=/Base/software/modules/modulefiles/someip/ ``` 以上命令展示了设置模块文件的一个例子,其中 `modulefiles-setup.sh` 脚本被用来创建针对特定版本的配置项。 --- #### 2. **代码示例** 下面给出一段简单的 C++ 实现片段,演示了一个典型的客户端-服务器交互过程: ##### 定义接口 利用 IDL 文件描述所需暴露的方法签名及其参数类型: ```cpp // MyService.idl namespace mycompany { interface MyInterface { method void setValue(in int value); method int getValue(); }; } ``` 编译该IDL得到相应的 stubs 和 skeletons 后,在应用端分别编写如下内容: ##### Server Side Implementation ```cpp #include "MyInterfaceDBusStubAdapter.hpp" using namespace commonapi; class MyServer : public MyInterfaceDBusStubDefault { public: explicit MyServer(const std::shared_ptr<Runtime>& runtime, const std::string& connectionId) : MyInterfaceDBusStubDefault(runtime, connectionId){} void setValue(int _value) override { currentValue_ = _value; fireValueEvent(currentValue_); } private: int currentValue_{}; }; int main() { auto runtime = Runtime::create("my.company.MyInterface"); MyServer server(runtime, ""); while(true){ usleep(100 * 1000); // Sleep for 100ms } return 0; } ``` ##### Client Invocation Example ```cpp #include "MyInterfaceSomeIPProxy.hpp" void clientExample(){ try{ auto proxy = std::make_shared<MyInterfaceSomeIPProxy>("local:commonapi.my.company.MyInterface:com.example.instance"); if(proxy->isAvailable()){ proxy->setValueAsync(42, [](const CallStatus &_status){ if(_status == CallStatus::SUCCESSFUL){ printf("Set Value Successful\n"); }else{ fprintf(stderr,"Failed setting value!\n"); } }); proxy->getValueSync([&](const CallStatus &callStatus, const int &result){ switch(callStatus){ case CallStatus::SUCCESSFUL : printf("Got Value:%d", result); break; default: perror("Error occurred during sync call."); } }); } }catch(std::exception &e){ cerr << e.what()<< endl; } } ``` 上述程序段落中的异步方法调用体现了微控制器间低延迟响应的优势[^3]。 --- ### 测试建议 当完成初步编码之后,应当遵循全面的质量保障流程来进行验证活动。例如采用自动化工具链执行以下几类检验动作[^2]: - 单元测试:单独验证各个函数的行为是否符合预期。 - 集成测试:确认不同子系统之间能否无缝协作。 - 功能测试:依据真实世界的工作流重现整个操作链条。 - 压力测试:评估极端负载条件下表现稳定性。 - 兼容性测试:考察旧版新近更新后的互操作特性。 --- ### 总结 通过合理运用 CommonAPI 及其适配器插件,配合高效的传输载体——即此处提到的 SOME/IP ——可极大简化车内软硬件资源调度难题,并促进标准化进程推进步伐加快。最终达成提升产品质量的同时降低维护成本的目的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值