编写 SOME/IP 映射文件

本文档将指导您完成编写 SOME/IP 映射文件的过程。SOME/IP 映射文件定义了 SDV 服务如何映射到 SOME/IP 服务,以及反向映射,从而有助于 SDV 和非 SDV ECU 之间的通信。

.vsidl 文件中 VsidlEntry 消息内的 some_ip_mapping 字段包含 SOME/IP 映射信息。 借助 some_ip_mapping 字段,您可以将 SOME/IP 映射与 SDV 服务定义分开定义。

SomeIp Mapping proto 包含 SOME/IP 代理在 SDV 和 SOME/IP ECU 之间进行转换所需的所有信息。 此 proto 可以将 SOME/IP 服务映射到 SDV 生态系统,也可以将 SDV 服务单元映射到 AUTOSAR 生态系统。

核心概念

在编写映射文件之前,请先了解以下关键标识符和概念:

  • SDV 完全限定实例名称 (FQIN): 此唯一字符串用于标识 SDV 服务实例。它由虚拟机名称、软件包名称、服务名称和实例名称组成。

  • SDV 类型: 此名称是 SDV 消息载荷的数据格式的唯一标识符,对应于 proto 消息。

  • SOME/IP ServiceIdentifier (SOME/IP SID): 通过服务 ID (uint16)、实例 ID (uint16)、主要版本 (uint8) 和次要版本 (uint32) 的组合来唯一标识 SOME/IP 服务。

  • SDV RPC: SDV 服务提供的方法,由 method name(字符串)、包含的 Typechannel 名称标识。

  • SDV Pub/Sub: 由 SDV 服务发布或订阅的主题,由 TypeTopic 名称标识

  • SOME/IP RPC: 由服务 ID、实例 ID 和方法 ID (uint16) 标识。

  • SOME/IP 事件: 由 SOME/IP 服务发布以用于 Pub/Sub,由服务 ID、实例 ID、事件 ID (uint16) 标识,并且属于事件组 (uint16)。

  • SOME/IP 代理: SDV 中的桥接组件,用于使用 SOME/IP 映射文件,以实现 SDV 和 SOME/IP 服务之间的通信。

文件结构和位置

SOME/IP 映射信息作为重复字段 some_ip_mapping 包含在 .vsidl 文件中的 VsidlEntry 消息内。这样,SOME/IP 映射就可以与 SDV 服务定义分开定义,从而让您可以在专用文件中管理映射。

// The root message for VSIDL files.
message VsidlEntry {
  // Required. Package name for entities mentioned in the file.
  string package = 1;
  // List of SDV service bundles defined in the file.
  repeated ServiceBundle sdv_service_bundle = 2;
  // Enables custom extensions beyond the standard VSIDL model.
  repeated google.xml.Any extension = 3;

  // SOMEIP mapping rules.
  repeated sdv.someip.v1.SomeIpMapping some_ip_mapping = 4;
  // VHAL mapping rules.
  repeated VhalMapping vhal_mapping = 5;
}

创建映射文件

SOME/IP 映射文件通常包含在 SDV 生态系统和 SOME/IP 网络协议之间进行转换的定义。您可以通过两种主要方式定义映射:

  • sdv_type_mapping:将 SDV 类型(例如 RPC 接口或发布主题)映射到 SOME/IP 服务。
  • someip_service_mapping:将原始 SOME/IP 服务(及其实例、事件或方法)映射到 SDV Pub/Sub 主题或 RPC 通道。

单个映射文件包含一个或多个 SomeIpMapping 定义。

SDV 类型映射

sdv_type_mapping 适用于您想要向 SOME/IP 网络公开的现有 SDV 类型。

SDV 类型映射结构

您需要指定:

  • unit_type:要映射的 SDV 类型(由 package_nametype_name 标识)。
  • someip_service_id:16 位 SOME/IP 服务 ID。
  • version_majorversion_minor:SOME/IP 服务的版本控制。
  • service_oriented_mapping:定义特定映射行为(针对 RPC 接口或发布)。

发布映射示例

如果您的 SDV 类型是主题(发布),请使用 publication_mapping。这会将数据结构 (type_definition) 和 SOME/IP 事件 ID 或 EventGroup ID 映射到 SOME/IP 实例,然后将特定 SDV 主题映射到 SOME/IP 实例。

sdv_type_mapping {
  unit_type {
    package_name: "com.android.sdv.samples"
    type_name: "SpeedData"
  }
  someip_service_id: 0x1001
  version_major: 1
  version_minor: 0
  service_oriented_mapping {
    publication_mapping {
      offered_topic {
        simple_mapping {
          group_id: 1
          event_id: 0x8001
        }
        # type_definition defines the structural mapping to SOME/IP payloads
        type_definition {
          # ... (SomeIpStruct definition) ...
        }
      }
      # Maps the SDV topic name to a specific SOME/IP instance
      topic_mapping {
        topic: "vehicle_speed_topic"
        instance_id: 0x0001
      }
    }
  }
}

RPC 接口映射示例

如果您的 SDV 类型是 RPC 接口,请使用 rpc_interface_mapping。 将 SDV 过程名称映射到 SOME/IP method_id 实例,并将 SDV 通道链接到 SOME/IP 实例。

sdv_type_mapping {
  unit_type {
    package_name: "com.android.sdv.samples"
    type_name: "DoorControl"
  }
  someip_service_id: 0x2001
  version_major: 1
  version_minor: 0
  service_oriented_mapping {
    rpc_interface_mapping {
      offered_interface {
        method {
          procedure: "LockDoors"
          method_id: 0x0001
          # request_payload_mapping and response_payload_mapping can be defined here
        }
      }
      rpc_channel_mapping {
        channel: "front_doors"
        instance_id: 0x0001
      }
    }
  }
}

SOME/IP 服务映射

someip_service_mapping 用于配置特定 SOME/IP 服务(在网络上发现或提供)如何映射到 SDV 主题和通道。它允许对事件和 RPC 进行复杂的参数化映射。

SOME/IP 服务映射结构

  • someip_service_idversion_majorversion_minor:标识 SOME/IP 服务。
  • sd_behavior(可选):定义服务发现行为 (EXACT_OR_ANY_MINOR_VERSIONMINIMUM_MINOR_VERSION)

  • instance:为特定 SOME/IP instance_id 实例参数化 SDV 服务单元和主题。

  • instance_impl:描述实例的实现,将事件或方法映射到参数化服务单元。

事件映射示例

此示例将 SOME/IP 事件映射到 SDV 主题。它使用 instance 将 ID 1 映射到字面量字符串 speed_sensor_unit

someip_service_mapping {
  someip_service_id: 0x1001
  version_major: 1
  version_minor: 0
  # Parameterize instances
  instance {
    instance_id: 0x0001
    sdv_service_unit_parameterization {
      key: 1
      value: "speed_sensor_unit"
    }
    sdv_topic_parameterization {
      key: 1
      value {
        topic: "speed_topic"
        capacity: 10
      }
    }
  }
  # Description of all instances
  instance_impl {
    offered_event {
      group_id: 1
      event_id: 0x8001
      simple_event {
        sdv_unit_type {
          package_name: "com.android.sdv.samples"
          type_name: "SpeedData"
        }
        # Refers to key 1 in sdv_service_unit_parameterization. If unspecified,
        # service unit name will be automatically generated by the broker
        service_unit: 1
        topic: 1        # Refers to key 1 in sdv_topic_parameterization
        message_translation_mode: REFLECTION
        type_definition {
          # ... (SomeIpStruct definition) ...
        }
      }
    }
  }
}

RPC 映射示例

此示例将 SOME/IP RPC 服务映射到 SDV RPC 接口。与事件映射类似,该服务使用实例来参数化服务单元名称。这对应于 SDV 中的 RPC 通道名称。然后,instance_impl 块定义 offered_interface 的实例,以将 SOME/IP method_id 链接到 SDV 过程名称:

someip_service_mapping {
  someip_service_id: 0x2001
  version_major: 1
  version_minor: 0
  # Parameterize instances
  instance {
    instance_id: 0x0001
    sdv_service_unit_parameterization {
      key: 1
      value: "door_control_unit"
    }
  }
  instance_impl {
    offered_interface {
      sdv_unit_type {
        package_name: "com.android.sdv.samples"
        type_name: "DoorControl"
      }
      # Refers to key 1 in sdv_service_unit_parameterization. This corresponds
      # to the RPC channel name in SDV.
      service_unit: 1
      method {
        procedure: "LockDoors"
        method_id: 0x0001
     # request_payload_mapping and response_payload_mapping can be defined here
      }
    }
  }
}

高级功能

本部分介绍 SOME/IP 映射支持的高级功能。

团体活动

借助 group_event,可以将单个 SOME/IP 事件拆分并同时映射到多个 SDV 主题。这是通过指定多个 event_part 条目并使用 field_name_mapping 将传入的 SOME/IP 载荷字段名称映射到 SDV 载荷字段名称来实现的:

offered_event {
  group_id: 1
  event_id: 0x8002
  group_event {
    type_definition {
      # Definition of the complete SOME/IP payload
    }
    event_part {
      sdv_unit_type {
        package_name: "com.android.sdv.samples"
        type_name: "PartAData"
      }
      service_unit: 1
      topic: 1
      field_name_mapping {
        key: "someip_field_a"
        value: "sdv_field_a"
      }
    }
    event_part {
      sdv_unit_type {
        package_name: "com.android.sdv.samples"
        type_name: "PartBData"
      }
      service_unit: 2
      topic: 2
      field_name_mapping {
        key: "someip_field_b"
        value: "sdv_field_b"
      }
    }
  }
}

即发即弃映射

SOME/IP 即发即弃 (F&F) 方法在 SDV RPC 接口中没有直接等效项。相反,它们是通过使用 publication_mapping 将 SDV 主题(发布)映射到 F&F 方法来调用的。当数据发布到相应的 SDV 主题时,代理会将其转换为 SOME/IP F&F 方法调用。

如需对此进行配置,您必须在 offered_topic 块中设置 someip_ff_methods: true,并在 topic_mapping 中提供目标 fire_and_forget_method 路由详细信息。

sdv_type_mapping {
  unit_type {
    package_name: "com.android.sdv.sample.someip"
    type_name: "CounterLoad"
  }
  someip_service_id: 0x13
  version_major: 1
  version_minor: 0
  service_oriented_mapping {
    publication_mapping {
      offered_topic {
        type_definition {
          # ... (SomeIpStruct definition) ...
        }
        someip_ff_methods: true
      }
      topic_mapping {
        topic: "counter-load-start-counter"
        instance_id: 0x1
        fire_and_forget_method {
          service_id: 0x3700
          instance_id: 0x1000
          version_major: 1
          version_minor: 0
          method_id: 0x1000
        }
      }
    }
  }
}