CommonAPI 介绍

image.png

CommonAPI

CommonAPI C++是用于开发分布式应用程序的标准C++ API规范,该分布式应用程序通过中间件进行进程间通信。

CommonAPI C++依靠FrancaIDL来描述静态接口,根据通信协议部署参数,一起组建完整的实例依赖关系模型。目的是封装通信协议和相邻的中间件,使应用程序的C++接口独立于底层IPC堆栈。

IPC Common API允许针对开发的应用程序(即使用C++的客户端和服务器)可以与不同的IPC后端链接(someip,或D-Bus),而无需更改应用程序代码。

因此,为使用特定IPC X(例如someip)的系统开发的组件可以轻松地部署到另一个使用IPC Y(例如D-Bus)的系统,只需要交换IPC Common API后端(someip或D-Bus),而无需重新编译应用程序代码。

文件介绍

实际的接口定义将使用Franca IDL创建(.fild文件)。
各项部署根据部署文件定义(
.fdepl文件)。

CommonAPI C++ 在通讯层分为Core和Binding两个部分。其中Core部分负责和Application交互而Binding部分负责和系统底层的IPC服务栈交互。其中的Binding即IPC的具体实现方式。目前GENIVI支持的Binding分为两种,分别是SOME/IP和DBus。

image.png

CommonAPI C++的IPC接口使用的是通用的“服务端、客户端”模式。
对于客户端主动发起的通讯,采取的是方法(Methods)调用的方式来实现。
Method分为两种类型:

  1. 标准的带有返回值的Method(Basic Method)
  2. 不需要返回值的Method(Fire-and-forgot Method)

服务端主动发起的通讯通过广播(Broadcasts)的方式实现。
CommonAPI C++提供的广播模式也有两种:

  1. 标准的广播方式(Basic Broadcasts),即广播内容发送给所有的客户端
  2. 选择性广播方式(Selective Broadcasts),即广播内容可以发送给某一个或一组客户端。

CommonAPI的组成原理

image.png

CommonAPI C++分为独立于中间件的部分(CommonAPI Core,仅仅指CommonAPI
接口)和特定于中间件的部分(CommonAPI Binding,用于选择使用的IPC协议的代码)。

CommonAPI将接口描述语言Franca IDL用于接口规范(逻辑接口规范,*.fidl文件)。

Franca IDL的代码生成的是CommonAPI的组合部分。主要指逻辑接口的变量部分,那是接口的一部分,它取决于Franca IDL文件中的规范(数据类型,数组,枚举和就基础知识,包括属性,方法,回调,错误处理,广播)。

CommonAPI C++ binding的代码生成器需要特定于中间件的参数(部署参数,例如String数据类型的编码/解码格式)。

这些参数在Franca部署文件(*.fdepl)中定义。主要独立于接口规范。

CommonAPI基本的工作流程

image.png

构建CommonAPI项目库

CommonAPI可执行文件通常由6部分组成:

  1. 应用程序代码本身是由开发人员手动编写的;
  2. 生成的CommonAPI(绑定独立)代码。根据*.fidl文件生成的代码。 在客户端,这段代码包含proxy函数,由应用程序调用;在服务中,它包含生成的函数,这些函数必须由开发人员手动实现(也可以生成默认实现)。
  3. CommonAPI运行时库。
  4. 生成的绑定特定代码(所谓的粘合代码)。根据*.fdepl文件生成的代码。
  5. 绑定的运行时库。
  6. 使用的中间件的通用库(例如libdbus/vsomeip)。

    image.png

现在将在创建proxy的确切时间加载粘合代码库。
通过CommonAPI配置文件可以找到正确的库,该配置文件包含CommonAPI地址和粘合代码库之间的关联。如果配置文件中没有条目,则使用默认设置。

胶水代码库是binding特定的;这意味着所需的运行库由运行时链接程序自动加载。

### CommonAPI 中的 Attributes 使用与定义 在嵌入式系统和汽车领域中,CommonAPI 是一种广泛使用的框架,用于实现服务接口标准化以及跨平台通信。以下是关于 **CommonAPI 的 Attributes 定义及其用法** 的详细介绍。 #### 1. 属性 (Attributes) 的基本概念 在 CommonAPI 中,属性(Attribute)是一种数据结构,表示对象的状态或特性。它通常是一个可读写的数据字段,允许客户端通过调用来获取其当前值或者设置新值。这种机制简化了状态管理并增强了系统的灵活性[^5]。 - **特点**: - 可以被订阅以便实时通知变化。 - 支持同步访问模式。 ```cpp // 示例代码展示如何声明一个 Attribute 并对其进行操作 commonapi::SomeIP::ProxyBuilder<myInterface> proxyBuilder(someConnection); std::shared_ptr<myInterfaceProxy> myProxy = proxyBuilder.build(); // 获取某个 attribute 值 myProxy->getAttributeValue(myCallback); // 设置某个 attribute 新值 myProxy->setAttributeValue(newValue, setCallback); ``` #### 2. 数据绑定与更新逻辑 当开发者利用 CommonAPI 创建一段程序时,可以将某些变量映射成外部可见的 `attribute` 。每当这些内部变量发生变化时,所有监听该 `attribute` 的组件都会收到即时的通知[^6]。 例如,在车辆控制单元之间共享速度信息的情况下: - 发布者定期更新代表车速的数值; - 订阅方则依据接收到的新值执行相应动作比如调整巡航设定。 此过程体现了分布式架构下高效协作的优势所在。 #### 3. 错误处理及边界条件考虑 尽管上述功能强大便捷,但在实际应用过程中仍需注意可能出现的各种异常状况,如网络中断、超时未响应等问题。因此建议采取如下措施来增强健壮性: - 实施重试策略应对短暂连接失败; - 设定合理的时间限制防止无限期等待答复. 以上方法有助于构建更加稳定可靠的车载信息系统解决方案[^7]. ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

_李小白

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

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

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

打赏作者

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

抵扣说明:

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

余额充值