CommonAPI SomeIP Runtime 交叉编译

记录一下CommonAPI SomeIP Runtime在PC上编译及交叉编译情况。


一、下载

这里使用的是3.2.0版本。
https://github.com/COVESA/capicxx-someip-runtime
下载:
git clone https://github.com/COVESA/capicxx-someip-runtime.git

二、Ubuntu编译

1、安装依赖包

由于编译依赖于 vsomeip的库,所以再此之前要先编译vsomeip。
参考:https://blog.csdn.net/lang523493505/article/details/126413912

2、编译及安装

这里打算将编译出来的库放在上级目录下的target_pc目录。
在克隆下来的工程根目录创建文件夹build_dir,并且在里面创建编译脚本。
build.sh:

#!/bin/sh

#编译工具
COMPILER_CC=gcc
COMPILER_CXX=g++

#安装位置
COMPILER_PREFIX=$(pwd)/../../target_pc

#boost、commonapi-core、vsomeip3依赖库位置
### CommonAPI与SOME/IP集成概述 CommonAPI 是一种用于实现面向服务架构 (SOA) 的中间件框架,它允许开发者以对象为导向的方式设计分布式系统的接口。而 SOME/IP(Scalable service-Oriented MiddlewarE over IP)是一种基于 IP 的通信协议,专为汽车电子控制单元 (ECU) 之间的复杂消息传递设计。两者的结合可以提供一种高效、灵活的服务调用机制。 #### 集成背景 在现代车辆中,随着软件定义汽车的趋势日益明显,车载网络需要支持复杂的跨域通信需求。CommonAPI 提供了一种抽象层,使得开发人员能够专注于业务逻辑而不是底层通信细节;而 SOME/IP 则负责处理具体的传输层面问题,如数据序列化、反序列化以及服务质量管理等[^1]。 以下是关于如何将 CommonAPI 和 SOME/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 ——可极大简化车内软硬件资源调度难题,并促进标准化进程推进步伐加快。最终达成提升产品质量的同时降低维护成本的目的。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hrx-@@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值