zl程序教程

您现在的位置是:首页 >  其他

当前栏目

CommonAPI 介绍

2023-04-18 14:49:59 时间

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。

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特定的;这意味着所需的运行库由运行时链接程序自动加载。