前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >CommonAPI C++(fdepl)介绍

CommonAPI C++(fdepl)介绍

作者头像
李小白是一只喵
发布2021-12-13 09:55:45
2.4K0
发布2021-12-13 09:55:45
举报
文章被收录于专栏:算法微时光

fdepl文件

定义独立于中间件(vSomeIp/D-Bus)的C++ API的一个问题是,需要针对API的各个部分使用不同的配置参数,这部分需要取决于中间件。例如,参数,数组或字符串的最大长度等。

Franca IDL可以根据中间件或特定于平台的部署模型(*.fdepl文件)中使用的中间件来指定部署参数。 一个明确的目标是,针对Common API编写的应用程序可以与不同的Common API IPC后端链接,而无需更改应用程序代码。

因此,有一个重要的隐性限制:Franca IDL(*.fidl文件)中定义的接口只与CommonAPI以及用户调用相关。专用于IPC后端的部署模型(.fdepl)不得影响所生成的API。但是允许使用非特定的部署模型。

image.png

fdepl文件的基本构成

类别1

类别2

说明

举例

for interface

对接口进行一些部署,设置ServiceID值,也可以设置枚举支持的类型

*Reliable = false表示使用UDP协议,Reliable = true表示使用TCP协议

attribute

为属性的getter, setter等方法提供ID值

attribute x { SomeIpGetterID = 3000 SomeIpSetterID = 3001 SomeIpNotifierID = 33010 SomeIpEventGroups = { 33010 } SomeIpGetterReliable = false SomeIpSetterReliable = false SomeIpNotifierReliable = false}

method

设置method的ID值,并设置输入输出字符串类型的编码/解码格式;也可以订阅方法调用的超时

method foo { SomeIpMethodID = 30000 SomeIpReliable = false in { x2 { SomeIpStringEncoding = utf16le } } out { y2 {SomeIpStringEncoding =utf16le} } }

broadcast

设置广播事件以及广播事件组的ID值,并设置输出字符串类型的编码/解码格式

broadcast myStatus { SomeIpEventID = 33020 SomeIpEventGroups = { 33020 } }

array

定义数组的长度

SomeIpArrayLengthWidth = 2

enumeration

设置枚举的数据类型

EnumBackingType = UInt64

for provider

提供实例

instance

设置实例名称以及实例ID值,并设置实例的地址和端口号

instance commonapi.mthd.Method { InstanceId = “commonapi.mthd.Method” SomeIpInstanceID = 22136 SomeIpUnicastAddress = “192.168.0.2” SomeIpReliableUnicastPort = 30500 SomeIpUnreliableUnicastPort = 30501 }

for typeCollection

用户自己定义的各种数据类型的集合

array

定义数组的长度

SomeIpArrayLengthWidth = 2

enumeration

设置枚举的数据类型

EnumBackingType = UInt64

使用实例展示:

代码语言:javascript
复制
/* Copyright (C) 2015 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
 * This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
import "platform:/plugin/org.genivi.commonapi.someip/deployment/CommonAPI-4-SOMEIP_deployment_spec.fdepl"
import "E01HelloWorld.fidl"

define org.genivi.commonapi.someip.deployment for interface commonapi.examples.E01HelloWorld {
    SomeIpServiceID = 4660

    method sayHello {
        SomeIpMethodID = 30000
        SomeIpReliable = true
        
        in {
            name {
                SomeIpStringEncoding = utf16le
            }
        }
    }
}

define org.genivi.commonapi.someip.deployment for provider as Service {
    instance commonapi.examples.E01HelloWorld {
        InstanceId = "commonapi.examples.HelloWorld"
        
        SomeIpInstanceID = 22136
    
        SomeIpUnicastAddress = "192.168.0.2"
        SomeIpReliableUnicastPort = 30499
        SomeIpUnreliableUnicastPort = 30499
    }
}
for interface

for interface,对应于*.fidl文件中的interface,在这里面主要是配置中间件的ServiceID,以及其他method,broadcast,attribute等使用的methodID,eventID值等。

设置ServiceID:

代码语言:javascript
复制
SomeIpServiceID = 4660

也可以在此定义整个接口的CommonAPI C++级别上定义枚举支持的类型,默认是UInt32:

代码语言:javascript
复制
DefaultEnumBackingType: { UInt8, UInt16, UInt32, UInt64, Int8, Int16, Int32, Int64 }  (default: UInt32);

例如:

代码语言:javascript
复制
DefaultEnumBackingType = UInt8
attribute

为每个属性所使用的getter, setter等方法设置ID值,并设置这些方法的可靠性。

image.png

method

为方法method设置methodID值,并设置可靠性,

也可以为in, out的输入输出参数的字符串类型设置编码/解码格式,也可以不设置,从而使用默认设置。

image.png

也可以在此处设置超时:

代码语言:javascript
复制
Timeout : Integer (default: 0);

例如:

代码语言:javascript
复制
Timeout = 1
broadcast

为broadcast事件设置EventID值,Event Groups值(这个是将自己想要划分为一组的事件ID写在一起),设置可靠性,也可以定义out参数里面字符串类型的编码/解码格式。

image.png

for typeCollection
array

SomeIpArrayLengthWidth是决定长度字段的大小,表示数组序列化时在数组前面用于表示数组长度的字节数。

即SomeIpArrayLengthWidth =2表示数组在序列化时,前面需要加2个字节,用于表示数组的长度,允许的值是0、1、2、4。

0表示没有长度字段。

代码语言:javascript
复制
array myArray {
SomeIpArrayLengthWidth = 2
}
enumeration

可以在此设置枚举使用的数据类型:

代码语言:javascript
复制
EnumBackingType : {UInt8, UInt16, UInt32, UInt64, Int8, Int16, Int32, Int64} (optional);

例如:

代码语言:javascript
复制
EnumBackingType = UInt64
for provider

在此提供程序所依赖的所有服务实例(如果有),并为实例设置名称,ID值以及IP地址和端口号。

image.png

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/12/8 上,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • fdepl文件
  • fdepl文件的基本构成
    • for interface
      • for typeCollection
      相关产品与服务
      消息队列 TDMQ
      消息队列 TDMQ (Tencent Distributed Message Queue)是腾讯基于 Apache Pulsar 自研的一个云原生消息中间件系列,其中包含兼容Pulsar、RabbitMQ、RocketMQ 等协议的消息队列子产品,得益于其底层计算与存储分离的架构,TDMQ 具备良好的弹性伸缩以及故障恢复能力。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档