CommonAPI

关注
义项:车载通信中间件
CommonAPI

CommonAPI是GENIVI联盟(现为COVESA)推出的一套C++通信中间件框架,用于在分布式系统中实现面向服务的通信。它为应用程序提供统一的高层C++编程接口,把底层进程间通信与网络协议抽象出来,使开发者编写的业务代码不必依赖具体的通信机制。CommonAPI以Franca IDL描述服务接口,常用绑定包括D-Bus与SOME/IP,其中SOME/IP绑定是车载以太网服务化通信的常见组合。

百科 图文
目录
  1. 定义
  2. 原理
  3. 发展历程
  4. 应用
  5. 局限
  6. 参见

定义

CommonAPI指的是CommonAPI C++,即一套面向C++的通信抽象接口,其目标不是发明一种新的进程间通信或网络通信机制,而是定义一层高层C++ API,用以对接不同的通信技术。它属于分布式系统中面向服务通信的中间件层,位于应用程序与具体协议栈之间[1]。

随着汽车电子电气架构从静态总线向基于以太网的服务化架构演进,应用软件要求可复用、易扩展、松耦合并兼容互操作,服务契约的标准化随之成为构建服务模型的关键,CommonAPI即为满足这一需求的通信抽象方案之一[2]。

原理

CommonAPI的核心思路是把服务接口的描述与具体通信实现分离。开发者先用与平台和编程语言无关的Franca IDL定义服务接口,再通过代码生成器产出C++代码,据此实现服务端逻辑与客户端调用[3]。生成结果主要包含代理类与桩类:服务提供者借助桩类实现接口方法与事件,服务消费者通过代理类订阅服务并调用远程方法,底层的通信实现细节由框架承担[2]。

接口描述分为两类文件。fidl文件负责接口本身的逻辑编排,可声明方法、广播与属性等要素;fdepl文件负责部署参数,在绑定到SOME/IP时需要给出服务ID、方法ID、事件组ID、实例ID以及传输地址和端口等具体的协议标识[4]。方法对应请求响应式的远程过程调用,广播对应服务提供者向多个订阅者的事件通知,属性则兼具两者的行为,可在数值变化时主动通知订阅者[2]。

在绑定层面,CommonAPI自身提供运行时库与生成代码的胶水层,具体协议的通信与服务发现由绑定实现完成。以SOME/IP绑定为例,序列化由CommonAPI的SOME/IP绑定处理,基础通信与服务发现交由vsomeip实现,运行时库与绑定库以动态链接方式加载[5]。

发展历程

CommonAPI由GENIVI联盟推动,该联盟名称后改为COVESA。其配套的Franca框架最初由GENIVI在2011年开发,作为车载信息娱乐平台标准化的通用接口描述语言,Franca的第一个公开版本于2012年3月以Eclipse公共许可证发布,2013年被提议为Eclipse基金会正式项目[6]。

2013年前后,IPC CommonAPI C++已被介绍为一组把多种进程间通信API统一为单一「公共API」的C++语言绑定,当时面向的通信机制包括D-Bus、SOME/IP与控制器局域网总线[7]。此后CommonAPI C++陆续发布多个版本,3.1.3等版本约以D-Bus 1.6.x以上与vsomeip 1.3.0等作为依赖,SOME/IP绑定被作为CommonAPI C++第3版的新特性引入,同时增加了部署参数通用集成、日志与多版本支持等能力[8]。

项目代码与文档后来从GENIVI的旧有代码托管平台迁移到公共代码托管平台上统一维护,代码生成器与运行时库需使用相同版本,以避免编译错误[9]。

应用

在车载信息娱乐系统与高级驾驶辅助系统的跨域通信中,CommonAPI常被用于连接运行Linux的域与运行Android的域。Android本身不具备实现SOME/IP客户端的机制,因此需要借助CommonAPI客户端,将其嵌入Android原生服务,再通过Android接口定义语言把数据分发给上层应用与硬件抽象层模块[10]。

在基于AUTOSAR自适应平台与普通Linux或实时操作系统的异构系统中,CommonAPI与自适应AUTOSAR的通信模型之间可通过模型到模型的转换实现互操作,其时序关键之一是双方都采用SOME/IP作为传输格式,以保证消息标识与序列化方式一致[1]。

在具体框架设计上,有研究以vsomeip与CommonAPI C++为基础构建设备内部的分布式服务框架,利用Franca IDL提高服务构建效率,并通过路由管理器实现服务注册中心,为分布式系统提供服务发布、服务订阅、状态同步与消息通知等功能[2]。此外,CommonAPI客户端也可运行在基于服务通信测试的环境中,例如在车机与域控制器通过车载以太网互联的试验台上用于验证跨域调用[11]。

局限

CommonAPI的SOME/IP代码生成器必须依赖部署文件才能运行,因为方法ID与事件ID必须唯一,服务ID与实例ID的组合也必须唯一,且客户端ID需保持唯一,这些约束限制了接口设计的自由度[12]。消息长度同样受限,外部消息长度按服务在配置文件中设定,默认取值受SOME/IP规范约束;若两个应用同时作为同一个选择性外部广播的客户端,还必须使用不同的端口[12]。

在与其他通信范式对接时也存在结构性困难。把CommonAPI与AUTOSAR的服务客户通信模式映射到Android并不容易,因为用于接口生成的AIDL文件通过绑定器传递对象实例来实现进程间通信,这种方式不适合事件触发的流量,而面向服务的架构中事件触发通信要求客户端先行订阅[13]。此外,vsomeip本身依赖Boost等库,在Android开源项目构建系统中进行构建时可能遇到问题,需要改用NDK在项目之外构建客户端,或替换SOME/IP的其他实现[13]。

CommonAPI提供的是一种编程抽象,使应用与进程间通信技术解耦,从而保持编程接口不变,其代价是引入额外的抽象层与代码生成环节,并需承担生成代码与运行时库的版本一致性维护成本[14]。

参见

  • SOME/IP —— CommonAPI常用的一种车载以太网服务化通信协议绑定。

  • Franca IDL —— CommonAPI用来描述服务接口的接口定义语言。

  • D-Bus —— CommonAPI支持的另一种进程间通信绑定。

  • AUTOSAR —— 其自适应平台的通信模型可与CommonAPI系统进行互操作。

  • COVESA —— 推动CommonAPI与Franca的行业联盟,前身为GENIVI。

  • 车载以太网 —— CommonAPI与SOME/IP绑定通常运行于其上的车载网络。

参考资料

  1. Interoperability with AUTOSAR [引用日期2026-10-14]
  2. 汽车文摘 | 2024 , (4) : 10 -18 [引用日期2026-10-14]
  3. CommonAPI C++ Tutorial [引用日期2026-10-14]
  4. CommonAPI C++ SOME/IP in 10 minutes [引用日期2026-10-14]
  5. GENIVI® [引用日期2026-10-14]
  6. Franca IDL [引用日期2026-10-14]
  7. lwn.net 上的网页 [引用日期2026-10-14]
  8. CommonAPI-cpp [引用日期2026-10-14]
  9. CommonAPI C++ D-Bus in 10 minutes (from scratch) [引用日期2026-10-14]
  10. 073-RTI3.5(PDF) [引用日期2026-10-14]
  11. s12239-025-00375-w(PDF) [引用日期2026-10-14]
  12. THE ROAD AHEAD Open Source IVI [引用日期2026-10-14]
  13. RTI-RT-22(PDF) [引用日期2026-10-14]
  14. Interface Exchange Framework (IFEX) [引用日期2026-10-14]
词条评价
词条统计

浏览次数:3 次

阅读量:0 次 · 阅读完成量:0 次

最近更新:2026-10-13T21:38:28Z

历史版本

本条目引用的词条
Franca IDL GENIVI联盟 SOME/IP D-Bus AUTOSAR COVESA 车载以太网